Bluetooth Gatttool在秒后停止接收通知(不是因为断开连接)

Bluetooth Gatttool在秒后停止接收通知(不是因为断开连接),bluetooth,bluetooth-lowenergy,ubuntu-18.04,gatttool,Bluetooth,Bluetooth Lowenergy,Ubuntu 18.04,Gatttool,我使用gattool连接Linux虚拟机(Ubuntu)上的BLE设备。系统中有三个角色:外围设备、中央设备和笔记本电脑(仅接收用于调试的日志信息) 连接之后,我需要向外围设备发送一条消息,这样当中央设备与外围设备交互时,它将向Linux发送日志信息。所以我的代码是这样的: connect # cmd for the peripheral sending out logging char-write-cmd 0x000f 70 # enable notification char-write-r

我使用gattool连接Linux虚拟机(Ubuntu)上的BLE设备。系统中有三个角色:外围设备、中央设备和笔记本电脑(仅接收用于调试的日志信息)

连接之后,我需要向外围设备发送一条消息,这样当中央设备与外围设备交互时,它将向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警告**:无效的文件描述符。

可能的原因是什么?如何修复?谢谢

样本结果:

[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左右发出通知,但当我在Linux上发送另一个cmd时,btmon上的时间戳是19:37

> 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
>ACL数据接收:Handl。。标志0x02德伦5#40[hci0]2019-10-18 19:36:13.577156
附件:写入响应(0x13)len 0
ACL数据接收:手动。。标志0x02德伦19#42[hci0]2019-10-18 19:37:02.154325
附件:句柄值通知(0x1b)len 14
句柄:0x000b
数据:4F5545F4F440D0A

如果在第二个终端上运行“sudo btmon”,当您运行此命令时,您会看到那里的通知吗?嗨,Emil,如果我运行btmon,当前一个终端可以打印时,它会打印出相同的通知。当主终端停止输出时,btmon也将停止。这是否意味着笔记本电脑停止接收通知?同样,与测试类似,如果我发出随机命令,它会在两侧打印出之前发送的通知。从btmon的时间戳来看,是从笔记本电脑发出命令的时间,而不是从外围设备发出通知的时间。btmon应该非常准确地显示空中发生的情况。你真的确定当你认为外围设备发出通知时,它会发出通知吗?你也可以使用空气嗅探器。嗨@Emil,我认为外围设备应该正确发送通知,因为如果我使用手机作为记录设备,无论是BLE_扫描仪还是Serial_Bluetooth_终端应用程序,它都能正常工作。如果你在第二个终端上运行“sudo btmon”,你会看到那里的通知吗?嗨Emil,如果我运行btmon,当前一个终端可以打印时,它将打印出相同的通知。当主终端停止输出时,btmon也将停止。这是否意味着笔记本电脑停止接收通知?同样,与测试类似,如果我发出随机命令,它会在两侧打印出之前发送的通知。从btmon的时间戳来看,是从笔记本电脑发出命令的时间,而不是从外围设备发出通知的时间。btmon应该非常准确地显示空中发生的情况。你真的确定当你认为外围设备发出通知时,它会发出通知吗?你也可以使用空气嗅探器。嗨@Emil,我认为外围设备应该正确发送通知,因为如果我使用手机作为记录设备,无论是BLE_扫描仪还是串行_蓝牙_终端应用程序,它都可以正常工作。