7

我的 CoreBluetooth 应用程序需要启用客户端特征配置描述符中的“指示位”。这是我所做的:

  1. 开始扫描
  2. 开始连接设备
  3. 称呼discoverServices
  4. discoverCharacteristics在回调内部调用

    -(void)peripheral:(CBPeripheral *)peripheral didDiscoverServices:(NSError *)error

  5. discoverDescriptorsForCharacteristic在回调内部调用

    -(void)peripheral:(CBPeripheral *)peripheral didDiscoverCharacteristicsForService:(CBService *)service error:(NSError *)error

  6. 内部回调

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

我打了电话:

        if ( [[descriptor.UUID representativeString] isEqualToString:@"2902" ] )
        {
            const unsigned char raw_data[] = {0x02};
            NSData *myData = [NSData dataWithBytes: raw_data length: 2];
            [self.cBCP writeValue:myData forDescriptor:descriptor];
        }

但是我的应用程序在 : 中崩溃了writeVale。控制台中的错误消息是:

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

任何想法?谢谢

4

2 回答 2

1

很老的问题,但是由于没有回答,似乎该方法setNotifyValue(_:for:)是否会为您处理,这取决于以下特征属性:

  • 仅通知:将启用通知。
  • 仅指示:将启用指示。
  • 指示和通知:仅启用通知。

所以如果需要启用indications,characteristic 必须只有indicate 属性,并且notify 应该被移除。

我想这背后的主要原因是指示要慢得多,因此除非需要指示,否则 iOS 将始终更喜欢最快的选项。

阅读有关 Apple 文档的更多信息

于 2017-07-13T08:29:29.890 回答
0

问题是您不能像以前那样使用 writeValue:forDescriptor: 方法来写入客户端配置描述符 (UUID = 2902) 的值。

相反,您应该使用 CBPeripheral 类的 setNotifyValue:forCharacteristic: 方法来配置客户端指示或服务器上特征值的通知。

于 2013-08-31T04:58:17.803 回答