Я использую gattool для соединения с устройством BLE на виртуальной машине Linux (Ubuntu). В системе есть три роли: периферийное устройство, центральное устройство и ноутбук (для получения отладки принимается только информация о регистрации)
После подключения мне необходимо отправить сообщение на периферийное устройство, чтобы оно отправляло информацию регистрации вLinux, когда центральный взаимодействует с периферийным устройством. Поэтому мой код выглядит следующим образом:
connect
# cmd for the peripheral sending out logging
char-write-cmd 0x000f 70
# enable notification
char-write-req 0x000c 0100 --listen
Он может распечатать уведомление в обычном режиме, если периферийное устройство может продолжать отправлять журналы на ноутбук. Но если периферийное устройство перестает отправлять протоколирование в течение (4-5) секунд и возобновляет работу после этого, ноутбук больше не будет распечатывать сообщение. Но это не отключено, потому что я все еще могу писать на периферийное устройство и получать нормальную обратную связь после этого. А также без ошибок типа (gatttool:5840): GLib-WARNING **: Invalid file descriptor.
Какая возможная причина этого и как можно это исправить? Спасибо!
Пример результата:
[02:02:02:02:02:02][LE]> connect
Attempting to connect to 02:02:02:02:02:02
Connection successful
[02:02:02:02:02:02][LE]> char-write-cmd 0x000f 70
listen:02:02:02:02][LE]> char-write-req 0x000c 0100 --l
Characteristic value was written successfully
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 31 0d 0a
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 31 0d 0a
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 30 0d 0a
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 31 0d 0a
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 30 0d 0a
[02:02:02:02:02:02][LE]> char-write-cmd 0x000f 01
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 31 0d 0a
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 30 0d 0a
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 31 0d 0a
Notification handle = 0x000b value: 31 00 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 64 00 00
После тестирования я думаю, что ближе к получению уведомления и его сохранению, но не выводит его на терминал доследующая команда для gatttool «Если я отправлю некоторые команды на периферийное устройство, что означает, что периферийное устройство также отправит некоторые команды на ноутбук, оно будет печатать« сохраненные »уведомления независимо от того, какая следующая команда для gatttool. Результат теста:
[02:02:02:02:02:02][LE]> char-desc
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 30 0d 0a
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 30 0d 0a
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 30 0d 0a
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 30 0d 0a
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 30 0d 0a
handle: 0x0001, uuid: 00002800-0000-1000-8000-00805f9b34fb
handle: 0x0002, uuid: 00002803-0000-1000-8000-00805f9b34fb
[02:02:02:02:02:02][LE]> char-read-hnd 0x0007
Notification handle = 0x000b value: 4f 55 54 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 35 0d 0a
Notification handle = 0x000b value: 50 4f 53 5f 49 4e 53 31 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 35 0d 0a
Notification handle = 0x000b value: 50 4f 53 5f 49 4e 53 31 5f 4e 4f 5f 4d 4f 54 0d 0a
Notification handle = 0x000b value: 43 4d 44 3a 30 35 0d 0a
Characteristic value/descriptor: 08 00 10 00 00 00 64 00
Результат от btmon. Периферийное устройство отправляет уведомления около 19:36:30, но метка времени на btmon равна 19:37, когда я отправляю другой cmd в Linux.
> ACL Data RX: Handl.. flags 0x02 dlen 5 #40 [hci0] 2019-10-18 19:36:13.577156
ATT: Write Response (0x13) len 0
< ACL Data TX: Handl.. flags 0x00 dlen 9 #41 [hci0] 2019-10-18 19:37:02.057819
ATT: Write Request (0x12) len 4
Handle: 0x000c
Data: 0100
> ACL Data RX: Hand.. flags 0x02 dlen 19 #42 [hci0] 2019-10-18 19:37:02.154325
ATT: Handle Value Notification (0x1b) len 14
Handle: 0x000b
Data: 4f55545f4e4f5f4d4f540d0a