我正在尝试从蓝牙 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 服务“应该”为了性能而组合在一起,但我认为它们不是必须的。
- 0001–0004 0001–0004 uuid:1801
- 0005–0009 0005–0009 uuid:1800
- 0010–0019 0010–0019 uuid:128 位 UUID
- 001A–0020 001A–001A uuid:180a
- 0021–0023 缺少uuid:180f
- 0024–002A 0021–0027 uuid:128 位 UUID
- 002E–0031 002B –002E uuid:128 位 UUID