Gatttool перестает получать уведомления через несколько секунд (не из-за отключения)
Я использую 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