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 对象)。

您不能使用带有CBCentralManagerCBMutableCharacteristic 实例与远程外围设备进行通信。

在连接的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 框架重复连接和断开连接时发生

CoreBluetooth [警告] 未知错误:2

Mac App 中的 CoreBluetooth 权利

iOS之CoreBluetooth

使用 CoreBluetooth 通过 iOS 设备连接到 Windows 10

iOS CoreBluetooth 教程 蓝牙