Проблемы с gattlib, nordic_uart и bluez 5.50? - PullRequest
0 голосов
/ 11 января 2020

У меня проблема с запуском gattlib nordic_uart. c пример на RPi4B + с использованием Bluez 5.50. Gattlib клонируется и компилируется на RPi в соответствии с инструкциями по установке gattlib.

Я бегу к устройству nrf pheripheral на основе стека nordi c -uart, измененного для автоматической потоковой передачи данных через один раз после подключения.

При использовании gatttool все работает как он должен:

sudo gatttool -b E7:76:98:F8:7A:70 -I -t random
[E7:76:98:F8:7A:70][LE]> connect
Attempting to connect to E7:76:98:F8:7A:70
Connection successful
[E7:76:98:F8:7A:70][LE]> characteristics
handle: 0x0002, char properties: 0x0a, 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: 0x0008, char properties: 0x02, char value handle: 0x0009, uuid: 00002aa6-0000-1000-8000-00805f9b34fb
handle: 0x000c, char properties: 0x0c, char value handle: 0x000d, uuid: 6e400002-b5a3-f393-e0a9-e50e24dcca9e
handle: 0x000e, char properties: 0x10, char value handle: 0x000f, uuid: 6e400003-b5a3-f393-e0a9-e50e24dcca9e
[E7:76:98:F8:7A:70][LE]> char-desc
handle: 0x0001, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x0002, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0003, uuid: 00002a00-0000-1000-8000-00805f9b34fb
handle: 0x0004, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0005, uuid: 00002a01-0000-1000-8000-00805f9b34fb
handle: 0x0006, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0007, uuid: 00002a04-0000-1000-8000-00805f9b34fb
handle: 0x0008, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x0009, uuid: 00002aa6-0000-1000-8000-00805f9b34fb
handle: 0x000a, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x000b, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x000c, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x000d, uuid: 6e400002-b5a3-f393-e0a9-e50e24dcca9e
handle: 0x000e, uuid: 00002803-0000-1000-8000-00805f9b34fb
handle: 0x000f, uuid: 6e400003-b5a3-f393-e0a9-e50e24dcca9e
handle: 0x0010, uuid: 00002902-0000-1000-8000-00805f9b34fb

Далее, используя gatttool, я включаю уведомление о получении, отправляя на мое устройство nordi c следующее:

char-write-req 0x10 0100

и где данные принимаются как Ожидается:

[E7:76:98:F8:7A:70][LE]> char-write-req 0x10 0100
Characteristic value was written successfully
Notification handle = 0x000f value: 54 2c 31 35 2e 39 38 2c 32 31 2e 38 37 2c 32 30 2e 36 35 2c
Notification handle = 0x000f value: 54 2c 31 35 2e 34 38 2c 32 31 2e 38 37 2c 32 30 2e 36 35 2c

Для отладки я изменил пример gattlib nordic_uart. c для печати обнаруженных характеристик. Пример gattlib nordic_uart. c обнаруживает две характеристики:

pi@RPi4Bplus:~/gattlib/build/examples/nordic_uart $ sudo ./nordic_uart E7:76:98:F8:7A:70                              characteristic count: 2
handle = 0x000e, char properties = 0xf0, char value handle = 0x000e, uuid = 6e400003-b5a3-f393-e0a9-e50e24dcca9e
handle = 0x000c, char properties = 0x3c, char value handle = 0x000c, uuid = 6e400002-b5a3-f393-e0a9-e50e24dcca9e

Далее, пример gattlib nordic_uart включает уведомление о rx с помощью

// Enable Status Notification
uint16_t enable_notification = 0x0001;
ret= gattlib_write_char_by_handle(m_connection, rx_handle+1 , &enable_notification, sizeof(enable_notification)); 
if (ret) {
    fprintf(stderr, "Failed to write to handle. ErrorNo: %i \n", ret);
    return 1;
} 

В моем случае gattlib_write_char_by_handle (...) возвращает ошибку:

Failed to write to handle. ErrorNo: 2

ErrorNo 2: GATTLIB_NOT_FOUND, что, как и ожидалось, так как дескриптор rx_handle + 1, вероятно, не существует. Глядя на выходные данные из char -tools gatttools c, я думаю, что rx_handle + 1 является дескриптором, следующим за rx uuid 6e400003 -... (для дескриптора 0x0010 указывается c).

Поскольку gatttool требовался ввод для обработки 0x10 как 0100, а не 0001, я также попытался с

uint16_t enable_notification = 0x0100;

, но с тем же результатом.

Я новичок в использовании gattlib, поэтому, если я что-то упустил полностью, любая помощь, указывающая мне правильное направление использования gattlib для включения rx-уведомления о моем потоке данных из фериферического устройства nordi c, будет очень признательна.

...