...
In this application note the ml_ble_platform/sensor_base
demo is used as an example. This application provides a platform for supporting external sensors and logging raw sample values over BLE. IMU readings are sent as notifications on ACC_SAMPLES
(UUID=110d8470-2eb3-11eb-bf0c-8ff42f5dc2bc
and value handle=0x1d
) characteristic value change. Refer to “ML_BLE_Platform BLE Interface Specification” for more information.
1. Uploading a BLE Demo to the Target
BLE demos included in the NAVQ Plus Linix BSP consist of two parts: the bootloader and a working (“mission“) firmware.
...
Sync the Telink programmer with the target:
Code Block sudo tcdb 9518 sws
Program the bootloader with the
0
offset:Code Block sudo tcdb 9518 wf 0 -i ./bootloader.bin -b
Program the demo binary with the
1000
offset:Code Block sudo tcdb 9518 wf 1000 -i ./sensor_base_mission-evb-002.001.000.bin -b
Reset the target.
2. Checking a Local Interface
Verify that a local interface is detected with
hcitool
:Code Block user@imx8mpnavq:~$ sudo hcitool dev Devices: hci0 D4:53:83:C4:E5:5B
Follow the instructions provided in Setting up Bluetooth application note if a local interface is not detected by
hcitool
.Check a local interface status and switch it on if it is disabled:
Code Block user@imx8mpnavq:~$ sudo hciconfig -a hci0 hci0: Type: Primary Bus: UART BD Address: D4:53:83:C4:E5:5B ACL MTU: 1016:5 SCO MTU: 60:12 UP RUNNING RX bytes:1393 acl:0 sco:0 events:64 errors:0 TX bytes:3256 acl:0 sco:0 commands:64 errors:0 user@imx8mpnavq:~$ sudo hciconfig hci0 up
3. Scanning for Remote Devices and Pairing
The default device name in the ml_ble_platform/sensor_base demo is AZN1-EVB. This name can be changed in the source files or by sending a command over BLE.
3.1. Scanning for Remote Devices with hcitool
Run sudo hcitool lescan
to start scanning for LE devices:
Code Block |
---|
user@imx8mpnavq:~$ sudo hcitool lescan LE Scan ... ... C4:19:D1:52:01:4F AZN1-EVB |
3.2. Scanning for Remote Devices and Pairing Using bluetoothctl
Open
bluetoothctl
:Code Block user@imx8mpnavq:~$ bluetoothctl Agent registered [CHG] Controller D4:53:83:C4:E5:5B Pairable: yes [bluetooth]#
Scan for available remote devices with the
scan le
command:Code Block [bluetooth]# scan le Discovery started [CHG] Controller D4:53:83:C4:E5:5B Discovering: yes ... [NEW] Device C4:19:D1:52:01:4F AZN1-EVB
The list of remote devices can be printed using the
devices
command:Code Block [bluetooth]# devices ... Device C4:19:D1:52:01:4F AZN1-EVB ...
Use the
pair <BD address>
command to initiate pairing:Code Block [bluetooth]# pair C4:19:D1:52:01:4F Attempting to pair with C4:19:D1:52:01:4F [CHG] Device C4:19:D1:52:01:4F Connected: yes [AZN1-EVB]# ... [CHG] Device C4:19:D1:52:01:4F UUIDs: 00001800-0000-1000-8000-00805f9b34fb [CHG] Device C4:19:D1:52:01:4F UUIDs: 00001801-0000-1000-8000-00805f9b34fb [CHG] Device C4:19:D1:52:01:4F UUIDs: 0000180a-0000-1000-8000-00805f9b34fb [CHG] Device C4:19:D1:52:01:4F UUIDs: 0000180f-0000-1000-8000-00805f9b34fb [CHG] Device C4:19:D1:52:01:4F UUIDs: 242b0000-3f36-45ef-bb6b-6b0e778eb823 [CHG] Device C4:19:D1:52:01:4F UUIDs: 563b1512-179d-11eb-af7d-e30cfa630c08 [CHG] Device C4:19:D1:52:01:4F ServicesResolved: yes [CHG] Device C4:19:D1:52:01:4F Modalias: usb:v248Ap8266d0001 [CHG] Device C4:19:D1:52:01:4F Paired: yes Pairing successful
4. Communicating with the BLE Demo
4.1. Communicating with the BLE Demo Using gatttool in an Interactive Mode
Open
gatttool
in an interactive mode:Code Block user@imx8mpnavq:~$ sudo gatttool -b C4:19:D1:52:01:4F --interactive [C4:19:D1:52:01:4F][LE]>
Connect to the device:
Code Block [C4:19:D1:52:01:4F][LE]> connect Attempting to connect to C4:19:D1:52:01:4F Connection successful
The characteristics list can be printed using the
characteristics
command:Code Block [C4:19:D1:52:01:4F][LE]> characteristics handle: 0x0002, char properties: 0x12, char value handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb handle: 0x0004, char properties: 0x02, char value handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb handle: 0x0006, char properties: 0x02, char value handle: 0x0007, uuid: 00002a04-0000-1000-8000-00805f9b34fb handle: 0x0009, char properties: 0x20, char value handle: 0x000a, uuid: 00002a05-0000-1000-8000-00805f9b34fb handle: 0x000d, char properties: 0x02, char value handle: 0x000e, uuid: 00002a50-0000-1000-8000-00805f9b34fb handle: 0x0010, char properties: 0x12, char value handle: 0x0011, uuid: 00002a19-0000-1000-8000-00805f9b34fb handle: 0x0014, char properties: 0x08, char value handle: 0x0015, uuid: 813dd366-179e-11eb-b214-a3729d689162 handle: 0x0016, char properties: 0x10, char value handle: 0x0017, uuid: 89accce6-179e-11eb-a4b6-e3d7b2402624 handle: 0x0019, char properties: 0x10, char value handle: 0x001a, uuid: a366b5cc-284a-11eb-b543-2766e21b935f handle: 0x001c, char properties: 0x10, char value handle: 0x001d, uuid: 110d8470-2eb3-11eb-bf0c-8ff42f5dc2bc handle: 0x001f, char properties: 0x08, char value handle: 0x0020, uuid: 773d9c12-efb8-44e8-bcc7-3e60e6fabd3a handle: 0x0022, char properties: 0x22, char value handle: 0x0023, uuid: 242b0001-3f36-45ef-bb6b-6b0e778eb823 handle: 0x0025, char properties: 0x10, char value handle: 0x0026, uuid: 242b0002-3f36-45ef-bb6b-6b0e778eb823 handle: 0x0028, char properties: 0x0a, char value handle: 0x0029, uuid: 242b0003-3f36-45ef-bb6b-6b0e778eb823
To send commands to the target, write to the TX characteristic using the
char-write-req
or thechar-write-cmd
command. A response from the demo is received as a notification on RX characteristic value change.
To read a device name send thesys device-name=?
command:Code Block [C4:19:D1:52:01:4F][LE]> char-write-req 0x15 737973206465766963652d6e616d653d3f0a Characteristic value was written successfully Notification handle = 0x0017 value: 40 31 32 35 37 36 32 32 3a 73 79 73 20 64 65 76 69 63 65 2d 6e 61 6d 65 3d 3f 0a Notification handle = 0x0017 value: 40 31 32 35 37 36 32 32 3a 44 65 76 69 63 65 20 6e 61 6d 65 20 69 73 20 41 5a 4e 31 2d 45 56 42 0a
To set a new name use the
sys device-name=<new name>
command.To enable IMU sample streaming send the
acc set_config
,acc stream-on
, andacc stream-on
commands:Code Block [C4:19:D1:52:01:4F][LE]> char-write-req 0x15 616363207365745f636f6e6669670a Characteristic value was written successfully Notification handle = 0x0017 value: 40 31 33 34 30 32 37 32 3a 61 63 63 20 73 65 74 5f 63 6f 6e 66 69 67 0a Notification handle = 0x0017 value: 61 63 63 20 73 74 61 74 65 20 32 2c 20 63 61 6c 6c 62 61 63 6b 20 30 78 30 0a Notification handle = 0x0017 value: 40 31 33 34 30 32 37 32 3a 61 63 63 20 73 65 74 74 69 6e 67 20 63 6f 6e 66 69 67 2e 2e 2e 0a Notification handle = 0x0017 value: 73 65 6e 73 6f 72 20 30 20 63 6f 6e 66 69 67 65 64 0a [C4:19:D1:52:01:4F][LE]> char-write-req 0x15 6163632073746172740a Characteristic value was written successfully Notification handle = 0x0017 value: 40 31 33 39 39 39 38 35 3a 61 63 63 20 73 74 61 72 74 0a Notification handle = 0x0017 value: 73 6d 67 20 61 64 64 20 34 35 34 63 20 74 6f 20 30 0a Notification handle = 0x0017 value: 73 65 6e 73 6f 72 20 30 20 73 65 74 74 69 6e 67 20 63 6f 6e 66 69 67 0a Notification handle = 0x0017 value: 73 65 6e 73 6f 72 20 30 20 63 6f 6e 66 69 67 65 64 0a Notification handle = 0x0017 value: 40 31 33 39 39 39 39 30 3a 73 65 6e 73 6f 72 20 30 20 73 74 61 72 74 65 64 0a [C4:19:D1:52:01:4F][LE]> char-write-req 0x15 6163632073747265616d2d6f6e0a Characteristic value was written successfully Notification handle = 0x0017 value: 40 31 34 37 37 39 30 30 3a 61 63 63 20 73 74 72 65 61 6d 2d 6f 6e 0a Notification handle = 0x0017 value: 40 31 34 37 37 39 30 30 3a 61 63 63 20 73 74 72 65 61 6d 69 6e 67 20 65 6e 61 62 6c 65 64 2e 2e 2e 0a Notification handle = 0x0017 value: 67 61 70 20 69 6e 20 73 65 6e 73 6f 72 20 30 20 73 65 71 5f 6e 6f 20 66 72 6f 6d 20 30 20 74 6f 20 34 30 35 30 0a
After that notifications with IMU samples are being received:
Code Block Notification handle = 0x001d value: 8e 87 16 00 a4 1f 36 1f 00 51 f9 ff c4 00 00 fe 01 00 Notification handle = 0x001d value: a0 87 16 00 a6 1f 35 1f 00 58 f9 ff 8f 00 00 fe 01 00 Notification handle = 0x001d value: b2 87 16 00 a8 1f 3d 1f 00 81 f9 ff 99 00 00 fe 01 00 Notification handle = 0x001d value: c4 87 16 00 aa 1f 7d 1f 00 6b f9 ff 9e 00 00 02 02 00 Notification handle = 0x001d value: d6 87 16 00 ac 1f 3d 1f 00 74 f9 ff c2 00 00 fe 01 00 Notification handle = 0x001d value: e8 87 16 00 ae 1f 6b 1f 00 44 f9 ff 9b 00 00 02 02 00 Notification handle = 0x001d value: fa 87 16 00 b0 1f 2d 1f 00 75 f9 ff 7c 00 00 fd 01 00 Notification handle = 0x001d value: 0c 88 16 00 b2 1f 57 1f 00 40 f9 ff b3 00 00 01 02 00 Notification handle = 0x001d value: 1e 88 16 00 b4 1f 4d 1f 00 5a f9 ff ab 00 00 00 02 00 Notification handle = 0x001d value: 30 88 16 00 b6 1f 5b 1f 00 6e f9 ff 8f 00 00 00 02 00 Notification handle = 0x001d value: 42 88 16 00 b8 1f 67 1f 00 5d f9 ff a2 00 00 01 02 00 Notification handle = 0x001d value: 54 88 16 00 ba 1f 5a 1f 00 5f f9 ff 93 00 00 00 02 00 Notification handle = 0x001d value: 66 88 16 00 bc 1f 6b 1f 00 35 f9 ff a6 00 00 02 02 00 Notification handle = 0x001d value: 78 88 16 00 be 1f 54 1f 00 5b f9 ff 9f 00 00 00 02 00
In the notification value the first 4 bytes are a timestamp, the next 2 bytes are a sequence number and the last 12 bytes are IMU samples.
4.2. Communicating with the BLE Demo Using gatttool in a Non-Interactive Mode
In a non-interactive mode gatttool
connects to the target automatically, executes a requested command, and disconnects from the target.
...
Code Block |
---|
user@imx8mpnavq:~$ sudo gatttool -b C4:19:D1:52:01:4F --char-write-req -a 0x15 -n 616363207365745f636f6e6669670a user@imx8mpnavq:~$ sudo gatttool -b C4:19:D1:52:01:4F --char-write-req -a 0x15 -n 6163632073747265616d2d6f6e0a user@imx8mpnavq:~$ sudo gatttool -b C4:19:D1:52:01:4F --char-write-req -a 0x15 -n 6163632073746172740a user@imx8mpnavq:~$ sudo gatttool -b C4:19:D1:52:01:4F --char-write-req -a 0x15 -n 00 --listen Notification handle = 0x001d value: f4 b7 1c 00 9c c7 7c 1f 00 58 f9 ff ba 00 00 03 02 00 Notification handle = 0x001d value: 06 b8 1c 00 9e c7 2a 1f 00 58 f9 ff b0 00 00 fd 01 00 Notification handle = 0x001d value: 18 b8 1c 00 a0 c7 40 1f 00 60 f9 ff 99 00 00 ff 01 00 Notification handle = 0x001d value: 2a b8 1c 00 a2 c7 5b 1f 00 67 f9 ff a4 00 00 00 02 00 Notification handle = 0x001d value: 3c b8 1c 00 a4 c7 63 1f 00 84 f9 ff af 00 00 00 02 00 Notification handle = 0x001d value: 4e b8 1c 00 a6 c7 71 1f 00 53 f9 ff b9 00 00 02 02 00 Notification handle = 0x001d value: 60 b8 1c 00 a8 c7 7b 1f 00 5b f9 ff bd 00 00 02 02 00 Notification handle = 0x001d value: 72 b8 1c 00 aa c7 44 1f 00 6b f9 ff 97 00 00 ff 01 00 Notification handle = 0x001d value: 84 b8 1c 00 ac c7 49 1f 00 54 f9 ff 94 00 00 ff 01 00 |
Note: To send a command convert it to a hex-string without any quotes or the 0x prefix. Gatttool outputs also receive notification values as hex value arrays.
4.3. Useful Commands
Here are some useful commands for communicating with BLE demo:
...