我正在尝试找到一个蓝牙le bug osx 。特别是,我想知道osx在读取蓝牙le gatt表时出错了。因此,我正在在 packetlogger中查看l2cap数据包从硬件io Xcode 的工具。

当我使用蓝牙资源管理器连接到蓝牙LE设备时,我期待看到3.4.4.9 按组类型请求读取(UUID= 0x2800«主要服务»,hiveHandle= 0x0001,EndingHandle= 0xFFFF)要发现主要服务(或)类型值请求(UUID= 0x2800,Value:UUID)),后跟3.4.4.1 类型请求 (UUID= 0x2803«特征»)以发现特征。当我从iPhone嗅出数据包时,这就是我所看到的(使用CC2540)。

但是在OSX上,在连接后我在PacketLogger(和CC2540)中看到的唯一L2CAP请求是:

  1. 按类型请求读取(attributeType= 0x2803,hiveHandle= 0x001a,EndingHandle= 0x001a)
  2. 按类型请求读取(attributeType= 0x2802«,hiveHandle= 0x0001,EndingHandle= 0x0004)
  3. 按类型请求读取(attributeType= 0x2802,hiveHandle= 0x0005,EndingHandle= 0x0009)
  4. 按类型请求读取(attributeType= 0x2802,hiveHandle= 0x0010,EndingHandle= 0x0019)
  5. 按类型请求读取(attributeType= 0x2802,hiveHandle= 0x001a,EndingHandle= 0x001a)
  6. 按类型请求读取(attributeType= 0x2803,hiveHandle= 0x001a,EndingHandle= 0x001a)
  7. 按类型请求读取(attributeType= 0x2802,hiveHandle= 0x0021,EndingHandle= 0x0027)
  8. 类型请求读取(attributeType= 0x2802,highhandle= 0x002b,endinghandle= 0x002e)
  9. 这些是无法解决服务的请求,但蓝牙资源管理器在此时列出所有服务UUID。这表示OSX已经知道服务在此蓝牙LE设备上的位置。 Blued缓存设备服务是否在启动时读取它们?如果是,我如何清除缓存?

    我已经尝试关闭蓝牙,杀死blued和重新启动osx,但每次OSX都不会重新发现服务。

有帮助吗?

解决方案

是,Blued确实缓存了蓝牙LE GATT表。如果缓存坏了,请执行以下操作以删除它,谢谢“Blued Process正在杀死我的CPU”

  1. 删除/library/preferences/com.apple.bluetooth.plist。这将删除所有粘合蓝牙和蓝牙LE设备的知识。
  2. 杀死/ usr / sbin / blued。它将通过Launchd重新启动。
  3. 再次运行蓝牙LE程序。packetlogger现在将显示按组类型请求读取,以重新发现主要服务。
  4. 允许缓存当中央建立了“不仅是配对”的“债券”时,根据蓝牙4.0卷3部分G第2.5.2个属性缓存。我不确定如何验证中心确实与外围设备绑定,但我认为它确实如此。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top