2012-11-26 16 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