3.8 KiB
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 getble-scan: command not found
you can also runpython -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
>