我试图重现发送到已连接到手机的蓝牙LE设备的ATT数据包。
这甚至可能吗?
我已经弄清楚数据包应该是什么样的,我只是无法绕过GATT以及它在这种特定情况下如何转换为ATT。
wireshark转储看起来像这样:
localhost () remote () ATT 26 Sent Handle Value Notification, Handle: 0x0035 (Unknown)
Bluetooth Attribute Protocol
Opcode: Handle Value Notification (0x1b)
0... .... = Authentication Signature: False
.0.. .... = Command: False
..01 1011 = Method: Handle Value Notification (0x1b)
Handle: 0x0035 (Unknown)
Value: 0a0b313233343536373839303132
我已经发现实际的应用程序有效负载在句柄0x0035之后开始,其中0x0a 0x0b是一些自定义控制字符,之后是一个数字(123456789012),正如我预期的那样。
如何翻译"句柄" GATT协议?这是通过UUID在Android GATT中完成的吗?如果我遍历该设备上的所有服务,就会得到一堆服务,大量特征,描述符和我丢失。
哦,我忘了提到:我得到的服务和特性似乎都与句柄0x0035无关。
是" getInstanceId"应该返回将要使用的句柄?在该设备上写入可写特征会导致Wireshark显示与getInstanceId对应的句柄值。
答案 0 :(得分:1)
首先要知道的是,在Android中,您不能直接使用Handles作为开发人员。你必须处理UUID。在Wireshark中查看ATT Protocoll时,您应该能够在打开Handle下拉列表时看到服务的UUID和特征。有了这些信息,您应该能够检测到您需要的UU https://developer.android.com/guide/topics/connectivity/bluetooth-le向您展示了如何向通知发送值。通常,您可以使用常量来例如ebanle通知。我想如果你的服务器需要特定的字节,你应该能够以相同的方式发送它们。
答案 1 :(得分:0)
好吧,在检查了日志和文档之后,我得出的结论是,这里的远程设备(应该提供服务)实际上是在本地主机上使用服务器,这是从主机发送到服务器的值通知远程