我试图在特征值更改时从蓝牙设备获取通知。为此,我需要启用客户端特性配置(CCC)描述符的通知。我已使用setNotifyValue(enabled: Bool, forCharacteristic characteristic: CBCharacteristic)
作为特征但未获得值更改的更新。
我尝试使用writeValue(data: NSData, forDescriptor descriptor: CBDescriptor)
为CCC启用指示,但我的应用程序因此API崩溃并显示错误
无法使用此方法编写客户端特征配置描述符!
任何帮助!!
答案 0 :(得分:1)
提供更多代码可能有助于提高答案的准确性;但是,让我们假设您已经能够发现所有特征值。通常,您只需根据CBPeripheralDelegate
实现中的每个客户端特征配置(CCC)描述符迭代所有特征并设置/写入值。
下面附有一个例子:
- (void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error
{
if (error) {
NSLog(@"Error discovering characteristics: %@", error);
return;
}
for (CBCharacteristic *characteristic in service.characteristics) {
if ([characteristic.UUID isEqual:[CBManager accelDataUUID]]) {
[peripheral setNotifyValue:YES forCharacteristic:characteristic];
} else if ([characteristic.UUID isEqual:[CBManager accelConfigUUID]]) {
[peripheral writeValue:[CBManager switchData:YES]
forCharacteristic:characteristic
type:CBCharacteristicWriteWithResponse];
}
//... if you have more to iterate
}
}
答案 1 :(得分:0)
您需要检查特征通知的可用性。
当您订阅(或取消订阅)特征值时, 外设呼叫
peripheral:didUpdateNotificationStateForCharacteristic:error:
方法 其委托对象。如果任何订阅请求失败 原因,您可以实现此委托方法以访问引起错误的原因 错误,如以下示例所示:
-(void)peripheral:(CBPeripheral *)peripheral
didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic
error:(NSError *)error {
if (error) {
NSLog(@"Error changing notification state: %@",
[error localizedDescription]);
}
...
注意:并非所有特征都提供订阅。你可以确定 特征是否通过检查其属性来提供订阅 属性包括
CBCharacteristicPropertyNotify
或CBCharacteristicPropertyIndicate
常量。