diff --git a/examples/nimble_scanner/Makefile b/examples/nimble_scanner/Makefile new file mode 100644 index 0000000000..346eba9985 --- /dev/null +++ b/examples/nimble_scanner/Makefile @@ -0,0 +1,30 @@ +# name of your application +APPLICATION = nimble_scanner + +# If no BOARD is found in the environment, use this default: +BOARD ?= nrf52dk + +# So far, NimBLE only works on nRF52 based platforms +BOARD_WHITELIST := nrf52dk nrf52840dk + +# This has to be the absolute path to the RIOT base directory: +RIOTBASE ?= $(CURDIR)/../.. + +# We use the xtimer and the shell in this example +USEMODULE += xtimer +USEMODULE += shell + +# configure and use Nimble +USEPKG += nimble +USEMODULE += nimble_scanner +USEMODULE += nimble_scanlist + +# Comment this out to disable code in RIOT that does safety checking +# which is not needed in a production environment but helps in the +# development process: +DEVELHELP ?= 1 + +# Change this to 0 show compiler invocation lines by default: +QUIET ?= 1 + +include $(RIOTBASE)/Makefile.include diff --git a/examples/nimble_scanner/README.md b/examples/nimble_scanner/README.md new file mode 100644 index 0000000000..91044e3ce5 --- /dev/null +++ b/examples/nimble_scanner/README.md @@ -0,0 +1,29 @@ +# About +This application demonstrates the usage of the `NimBLE` BLE stack as a scanner. +It makes use of the RIOT specific `nimble_scanner` adaption module, abstracting +`NimBLE`s APIs for easier access. + +# Usage +This example provides a `scan` shell command. Issue `scan help` for more +information on its usage. + +Example output: +``` +> 2019-03-26 14:59:33,158 - INFO # main(): This is RIOT! (Version: X) +2019-03-26 14:59:33,161 - INFO # NimBLE Scanner Example Application +2019-03-26 14:59:33,164 - INFO # Type `scan help` for more information +> scan help +2019-03-26 15:00:29,214 - INFO # scan help +2019-03-26 15:00:29,216 - INFO # usage: scan [timeout in ms] +> scan 50 +2019-03-26 14:59:41,289 - INFO # scan 50 +2019-03-26 14:59:41,343 - INFO # Scanning for 50ms now ... dome +2019-03-26 14:59:41,343 - INFO # +2019-03-26 14:59:41,344 - INFO # Results: +2019-03-26 14:59:41,351 - INFO # [ 0] 3c:8a:28:86:40:90 (RANDOM) "undefined", adv_msg_cnt: 1, adv_int: 0us, last_rssi: -59 +2019-03-26 14:59:41,359 - INFO # [ 1] 5c:8a:fd:28:9f:c5 (RANDOM) "undefined", adv_msg_cnt: 1, adv_int: 0us, last_rssi: -87 +2019-03-26 14:59:41,367 - INFO # [ 2] 22:e6:6e:3a:a8:74 (RANDOM) "undefined", adv_msg_cnt: 1, adv_int: 0us, last_rssi: -84 +2019-03-26 14:59:41,375 - INFO # [ 3] 15:03:93:bb:8b:98 (RANDOM) "undefined", adv_msg_cnt: 1, adv_int: 0us, last_rssi: -85 +2019-03-26 14:59:41,383 - INFO # [ 4] 61:3a:2e:73:9d:74 (RANDOM) "undefined", adv_msg_cnt: 1, adv_int: 0us, last_rssi: -63 +2019-03-26 14:59:41,384 - INFO # +``` diff --git a/examples/nimble_scanner/main.c b/examples/nimble_scanner/main.c new file mode 100644 index 0000000000..0cc959f81c --- /dev/null +++ b/examples/nimble_scanner/main.c @@ -0,0 +1,89 @@ +/* + * Copyright (C) 2019 Freie Universität Berlin + * + * This file is subject to the terms and conditions of the GNU Lesser + * General Public License v2.1. See the file LICENSE in the top level + * directory for more details. + */ + +/** + * @ingroup examples + * @{ + * + * @file + * @brief Example for using NimBLE as a BLE scanner + * + * @author Hauke Petersen + * + * @} + */ + +#include +#include +#include + +#include "xtimer.h" +#include "shell.h" +#include "shell_commands.h" + +#include "nimble_scanner.h" +#include "nimble_scanlist.h" + +/* default scan duration (1s) */ +#define DEFAULT_DURATION (1000000U) + +int _cmd_scan(int argc, char **argv) +{ + uint32_t timeout = DEFAULT_DURATION; + + if ((argc == 2) && (memcmp(argv[1], "help", 4) == 0)) { + printf("usage: %s [timeout in ms]\n", argv[0]); + return 0; + } + if (argc >= 2) { + timeout = (uint32_t)(atoi(argv[1]) * 1000); + } + + nimble_scanlist_clear(); + printf("Scanning for %ums now ...", (unsigned)(timeout / 1000)); + nimble_scanner_start(); + xtimer_usleep(timeout); + nimble_scanner_stop(); + puts(" done\n\nResults:"); + nimble_scanlist_print(); + puts(""); + + return 0; +} + +static const shell_command_t _commands[] = { + { "scan", "trigger a BLE scann", _cmd_scan }, + { NULL, NULL, NULL } +}; + +int main(void) +{ + puts("NimBLE Scanner Example Application"); + puts("Type `scan help` for more information"); + + /* in this example, we want Nimble to scan 'full time', so we set the + * window equal the interval */ + struct ble_gap_disc_params scan_params = { + .itvl = BLE_GAP_LIM_DISC_SCAN_INT, + .window = BLE_GAP_LIM_DISC_SCAN_WINDOW, + .filter_policy = 0, /* don't use */ + .limited = 0, /* no limited discovery */ + .passive = 0, /* no passive scanning */ + . filter_duplicates = 0, /* no duplicate filtering */ + }; + + /* initialize the nimble scanner */ + nimble_scanlist_init(); + nimble_scanner_init(&scan_params, nimble_scanlist_update); + + /* start shell */ + char line_buf[SHELL_DEFAULT_BUFSIZE]; + shell_run(_commands, line_buf, SHELL_DEFAULT_BUFSIZE); + + return 0; +}