iOS CoreBluetooth 不太可能的错误
Posted
技术标签:
【中文标题】iOS CoreBluetooth 不太可能的错误【英文标题】:iOS CoreBluetooth unlikely error 【发布时间】:2015-05-15 19:20:38 【问题描述】:我正在开发一个使用 Core Bluetooth 的 Appcelerator 模块。我可以毫无问题地连接到外围设备,并订阅一个特性。我已经实现了所有委托功能,并且一切似乎都按预期触发,除了在尝试读取或写入时出现“不太可能的错误”。我的中心方法如下所示。
-(void)readValueForCharacteristicByUUID:(NSString *)uuidstring
if (self.connectedService)
CBMutableCharacteristic* characteristic = [self characteristicFromUUIDstring:uuidstring];
if (characteristic)
[self.connectedPeripheral readValueForCharacteristic:characteristic];
else
NSLog(@"[INFO] No service to read");
-(void)writeValue:(NSData*)value ForCharacteristicByUUID:(NSString*)uuidstring
if (self.connectedService)
CBMutableCharacteristic* characteristic = [self characteristicFromUUIDstring:uuidstring];
if (characteristic)
[self.connectedPeripheral writeValue:value forCharacteristic:characteristic type:CBCharacteristicWriteWithResponse];
else
NSLog(@"[INFO] No service to write to");
-(CBMutableCharacteristic*)characteristicFromUUIDstring:(NSString*)uuidstring
for (CBMutableCharacteristic* c in self.connectedService.characteristics)
if ([c.UUID.UUIDString isEqualToString:uuidstring])
return c;
NSLog(@"No Characteristic found with that uuid");
我认为这可能是权限问题,所以这是我用来在外围设备中创建特征的代码。
CBMutableCharacteristic* c = [[CBMutableCharacteristic alloc] initWithType:cuuid
properties:CBCharacteristicPropertyRead|CBCharacteristicPropertyWrite|
CBCharacteristicPropertyNotify
value:nil
permissions:CBAttributePermissionsReadable|CBAttributePermissionsWriteable];
【问题讨论】:
【参考方案1】:来自CBMutableCharacteristic class reference
CBMutableCharacteristic 对象表示一个特征 本地外围设备的服务(表示本地外围设备 通过 CBPeripheralManager 对象)。
您不能使用带有CBCentralManager
的CBMutableCharacteristic
实例与远程外围设备进行通信。
在连接的CBPeripheral
上调用discoverCharacteristics:forService:
后,您必须使用返回到外围设备的peripheral:didDiscoverCharacteristicsForService:error:
委托方法的CBCharacteristic
。
【讨论】:
对 CoreBluetooth 新手的澄清:与此答案的措辞相反,没有 CBCharacteristic 直接返回到委托方法。委托只是一个发现新特征的通知。您需要扫描服务(传递给上述委托)以获取任何新特征。它们将出现在 CBService 对象的“特征”属性中。根据您的实施,这可能需要存储已知特征的列表,以便在发现新特征时可以识别。 这不是我的正确答案。我正在存储按照建议返回的 CBCharacteristic,并将它们用于我的读/写操作。我的读数没有错误。我收到“值写入错误:不可能的错误”发送到didWriteValueForCharacteristic
方法。无论类型如何(即 withResponse 和 withoutResponse),我每次都会收到此错误。此外,我编写了 GATT 服务器 (BlueZ+D-Bus/Linux),因此我对双方都有完全的了解,并且一切正常。就我而言,这感觉像是一个虚假的错误。
@pauln 你解决了这个问题吗?我有完全相同的情况(在 linux 下用 python + ios swift 应用程序编写的 gatt),我坚持这个“不太可能的错误”......
我做到了,但不幸的是,我无法提供具体的解决方案。就我而言,这些错误只是虚假的,有一天我注意到它们不再发生了。不过,我当时的 git 日志提供了一种可能性:我修复了一个错误,该错误超出了数据包限制(只有 20 个字节)超过 3 倍。我希望我能提供更多见解。
更新:我没有解决它,但其他人解决了。我的情况非常具体。我正在使用的 GATT 服务器中的一个错误。这个 GATT 服务器是我自己的工作,后来我开源了。该错误与我对 DBus 的(错误)使用有关。如果有帮助,这里是修复的链接,这只是一行代码:github.com/nettlep/gobbledegook/pull/15/commits/…以上是关于iOS CoreBluetooth 不太可能的错误的主要内容,如果未能解决你的问题,请参考以下文章
CoreBluetooth [警告] 未知错误:311 在 iOS 中使用 CoreBluetooth 框架重复连接和断开连接时发生