如何在iOS8上启用客户端配置描述符上的指示

时间:2015-11-02 08:13:28

标签: ios iphone swift bluetooth bluetooth-lowenergy

我试图在特征值更改时从蓝牙设备获取通知。为此,我需要启用客户端特性配置(CCC)描述符的通知。我已使用setNotifyValue(enabled: Bool, forCharacteristic characteristic: CBCharacteristic)作为特征但未获得值更改的更新。

我尝试使用writeValue(data: NSData, forDescriptor descriptor: CBDescriptor)为CCC启用指示,但我的应用程序因此API崩溃并显示错误

  

无法使用此方法编写客户端特征配置描述符!

任何帮助!!

2 个答案:

答案 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)

您需要检查特征通知的可用性。

From Apple's doc

当您订阅(或取消订阅)特征值时, 外设呼叫 peripheral:didUpdateNotificationStateForCharacteristic:error:方法 其委托对象。如果任何订阅请求失败 原因,您可以实现此委托方法以访问引起错误的原因 错误,如以下示例所示:

 -(void)peripheral:(CBPeripheral *)peripheral
didUpdateNotificationStateForCharacteristic:(CBCharacteristic *)characteristic
             error:(NSError *)error {

    if (error) {
        NSLog(@"Error changing notification state: %@",
           [error localizedDescription]);
    }
    ...

注意:并非所有特征都提供订阅。你可以确定 特征是否通过检查其属性来提供订阅 属性包括CBCharacteristicPropertyNotifyCBCharacteristicPropertyIndicate常量。