1

我正在尝试从蓝牙 LE 设备上的服务中读取特征。出于某种原因,对于某些特性,在调用 之后-[CBPeripheralManager discoverCharacteristics:forService]peripheral:didDiscoverServices:回调得到 0 个特性。是否有任何解决方法可以让我阅读此服务的特征?

在为 Xcode 安装硬件 IO 工具并运行 PacketLogger 时,很明显,discoverServices 调用导致了 0x08 Read By Type 请求(Bluetooth® 核心规范第 3 卷,第 F 部分,第 3.4.4.1 节),起始句柄=0x1a,结束句柄=0x1a,属性类型=0x2803。

此外,通过定义以下类扩展来读取受保护的字段,很明显,我感兴趣的服务 0x180a=设备信息也具有太接近舒适的 ATT 句柄:_startHandle=0x1a 和 _endHandle=0x1a。

@implementation CBService(ProtectedProps)
- (NSNumber*) startHandle {
    return self->_startHandle;
}
- (NSNumber*) endHandle {
    return self->_endHandle;
}
@end
@implementation CBCharacteristic(ProtectedProps)
- (NSNumber*) descriptorHandle {
    return self->_handle;
}
- (NSNumber*) valueHandle {
    return self->_valueHandle;
}
@end

顺便说一句,当我在 iPhone 4S 上从 LightBlue 读取设备时,该服务运行良好,我可以读取该服务的 3 个特征。

我正在使用 Apple 蓝牙软件版本:4.2.0f6 12982 在 OSX 10.9 Mavericks 上对此进行测试。我正在测试的设备是 Livescribe 3。

这是实际 GATT 句柄、CBService 句柄和 UUID 的表。在 128 位 UUID 弄乱了表格之后,它看起来像有一个 16 位 UUID。蓝牙 4.0 第 3.1 节规定 16 位 UUID 服务“应该”为了性能而组合在一起,但我认为它们不是必须的。

  1. 0001–0004 0001–0004 uuid:1801
  2. 0005–0009 0005–0009 uuid:1800
  3. 0010–0019 0010–0019 uuid:128 位 UUID
  4. 001A–0020 001A–001A uuid:180a
  5. 0021–0023 缺少uuid:180f
  6. 0024–002A 0021–0027 uuid:128 位 UUID
  7. 002E–0031 002B –002E uuid:128 位 UUID
4

1 回答 1

1

读取与 128 位 UUID 交错的 16 位 UUID 的错误可能已在 OSX 10.9.1 中修复。但是,由于计算机仍与外围设备绑定,因此仍会缓存错误值。因此,如果您之前连接到外围设备,由于缓存的 GATT 值错误,无论您重新连接或重新启动多少次,该错误仍然会出现。

我不得不删除绑定缓存 /Library/Preferences/com.apple.Bluetooth.plist 并杀死 blued。请参阅我的另一个问题blued 是否缓存 ATT 值,以及如何清除缓存?更多细节。

于 2014-03-03T21:48:07.760 回答