1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-28 23:09:46 +01:00
RIOT/sys/stdio_nimble
2023-07-18 12:24:08 +02:00
..
Makefile sys/stdio_nimble: add new stdio module using nimble 2022-01-28 19:26:38 +01:00
README.md treewide: fix path to shell related tests in doc 2023-05-13 18:27:58 +02:00
stdio_nimble.c sys/stdio_nimble: fix -Wformat-nonliteral warning 2023-07-18 12:24:08 +02:00

STDIO NimBLE

This module uses NimBLE for stdio. The bluetooth characteristic for stdin is writable and the characteristic for stdout uses the indicate mechanism to publish the system's output to a connected device. Data will be sent out asynchronously via callout functions.

To use this module, add

USEMODULE += stdio_nimble

to your makefile.

You can change the default buffer sizes by adding

CFLAGS += -DCONFIG_STDIO_NIMBLE_STDIN_BUFSIZE=1024
CFLAGS += -DCONFIG_STDIO_NIMBLE_STDOUT_BUFSIZE=2048

to your makefile.
NOTE: These values must be a power of two!

By default, stdin and stdout buffers are cleared on a connect event. To keep the content add the following to your makefile:

CFLAGS += -DCONFIG_STDIO_NIMBLE_CLEAR_BUFFER_ON_CONNECT=0

For automatic bluetooth advertising a module is provided: nimble_autoadv. It will take care of enabling advertising on disconnect events and disabling advertising on connect events. It can be enabled by adding

USEMODULE += nimble_autoadv

to your makefile.

The advertised device name can then optionally be configured with

CFLAGS += -DCONFIG_NIMBLE_AUTOADV_DEVICE_NAME='"Riot OS device"'

Otherwise the device will appear as "RIOT OS device".

Instructions to connect to the bluetooth shell via ble-serial

  • Configure and compile shell app for nrf52840dongle target in tests/sys/shell.\

Add following to Makefile:

BOARD = nrf52840dongle
USEMODULE += nimble_autoadv
USEMODULE += stdio_nimble

NOTE: You can also have a look at tests/sys/shell_ble.

  • Flash

$ make -C tests/sys/shell -j clean all flash

  • Install the ble-serial tool

$ pip install ble-serial

  • Scan for your device (device name Riot OS device) and note its BLE address.
    When you get ble-scan: command not found you can also run python -m ble_serial.scan instead.
$ ble-scan
Started BLE scan

6BE8174C-A0F8-4479-AFA6-9828372CAFE9 (RSSI=-40): Riot OS device
A2862DCB-D382-4C0B-95BF-FA9A961F8D88 (RSSI=-48): Unknown
F2C75C08-7DD7-4F43-BEF0-151C92068FE5 (RSSI=-66): Unknown
69400683-FBE5-4B45-8CFE-98594076E5F4 (RSSI=-89): Unknown
  • Discover characteristics (check the one advertised by the gatt server stdin/stdout)
$ ble-scan -d 6BE8174C-A0F8-4479-AFA6-9828372CAFE9
Started deep scan of 6BE8174C-A0F8-4479-AFA6-9828372CAFE9

SERVICE e6d54866-0292-4779-b8f8-c52bbec91e71 (Handle: 10): Unknown
     CHARACTERISTIC 35f28386-3070-4f3b-ba38-27507e991762 (Handle: 11): Unknown ['indicate']
         DESCRIPTOR 00002902-0000-1000-8000-00805f9b34fb (Handle: 13): Client Characteristic Configuration
     CHARACTERISTIC ccdd113f-40d5-4d68-86ac-a728dd82f4aa (Handle: 14): Unknown ['write']

Completed deep scan of 6BE8174C-A0F8-4479-AFA6-9828372CAFE9
  • Create a virtual port and mount it on /tmp/dev_riot_ble
$ ble-serial -d 6BE8174C-A0F8-4479-AFA6-9828372CAFE9 -p /tmp/dev_riot_ble --write-uuid ccdd113f-40d5-4d68-86ac-a728dd82f4aa --read-uuid 35f28386-3070-4f3b-ba38-27507e991762
17:44:18.765 | INFO | linux_pty.py: Slave created on /tmp/dev_riot_ble -> /dev/ttys006
17:44:18.766 | INFO | ble_interface.py: Receiver set up
17:44:18.766 | INFO | ble_interface.py: Trying to connect with 6BE8174C-A0F8-4479-AFA6-9828372CAFE9
17:44:19.861 | INFO | ble_interface.py: Device 6BE8174C-A0F8-4479-AFA6-9828372CAFE9 connected
17:44:19.862 | INFO | ble_interface.py: Found write characteristic ccdd113f-40d5-4d68-86ac-a728dd82f4aa (H. 14)
17:44:19.862 | INFO | ble_interface.py: Found notify characteristic 35f28386-3070-4f3b-ba38-27507e991762 (H. 11)
17:44:19.883 | INFO | main.py: Running main loop!
  • Open the virtual com port (the port name is from the logs in previous steps)
$ picocom -q -b 115200 --imap lfcrlf /tmp/dev_riot_ble
ps
    pid | state    Q | pri
      1 | running  Q |   7
      2 | bl anyfl _ |   5
      3 | bl anyfl _ |   0
>