2012-11-26 17 views
5

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

  1. 开始扫描
  2. 开始连接到设备
  3. 呼叫discoverServices
  4. 呼叫discoverCharacteristics回调

    内 - (空)周:(CBPeripheral *)外设didDiscoverServices:(NSError *)错误

  5. 呼叫discoverDescriptorsForCharacteristic内部callb ACK

    - (空)周:(CBPeripheral *)外围didDiscoverCharacteristicsForService:(CBService *)服务错误:(NSError *)错误

  6. 内回调

    - (空)周:(CBPeripheral * )外围didDiscoverDescriptorsForCharacteristic:(CBCharacteristic *)特性误差:(NSError *)错误

我称为:

 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:。控制台中的错误信息是:

Cannot write Client Characteristic Configuration descriptors using this method!

任何想法?谢谢

+1

我想知道是否有任何示例代码使用writeVale:forDescriptor。 –

+0

其实我的解决方案是不使用writeValue:forDescriptor。 –

+0

你能解释一下如何在不使用writeValue:forDescriptor的情况下启用指示吗?我被困在同一个地方... – imcc

回答

-1

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

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

0

漂亮的老问题,但因为它没有得到回答,好像如果该方法setNotifyValue(_:for:)会处理,对于你,这取决于以下charcateristics属性:

  • 只通知:通知将被启用。
  • 仅指示:指示将启用。
  • 指示&通知:ONLY通知将被启用。

所以,如果你需要启用指示,特征只能有指示属性,并且应该删除通知。

我想背后的主要原因是迹象要慢得多,所以iOS会始终更喜欢最快的选项,除非它是一个要求表明。

Read more on the Apple docs