CoreBluetooth writeValue: forDescriptor: проблема

Моему приложению CoreBluetooth необходимо включить «бит индикации» в дескрипторах конфигурации характеристик клиента. Вот что я сделал:

  1. Начать сканирование
  2. Начать подключаться к устройству
  3. Позвоните discoverServices
  4. Вызов discoverCharacteristics внутри обратного вызова

    - (void) периферийное устройство: (CBPeripheral *) периферийное устройство didDiscoverServices: (NSError *) ошибка

  5. Вызов discoverDescriptorsForCharacteristic внутри обратного вызова

    - (void) периферийное устройство: (CBPeripheral *) периферийное устройство didDiscoverCharacteristicsForService: (CBService *) ошибка службы: (NSError *) ошибка

  6. Внутренний обратный вызов

    - (void) периферийное устройство: (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:. Сообщение об ошибке в консоли:

Невозможно записать дескрипторы конфигурации характеристик клиента с помощью этого метода!

Любая идея? Спасибо


person Bagusflyer    schedule 26.11.2012    source источник
comment
Мне интересно, есть ли какой-нибудь образец кода с использованием writeVale: forDescriptor.   -  person Bagusflyer    schedule 27.11.2012
comment
На самом деле мое решение не использовать writeValue: forDescriptor.   -  person Bagusflyer    schedule 11.03.2013
comment
Не могли бы вы объяснить, как включить индикацию без использования writeValue: forDescriptor? Я застрял на том же месте ...   -  person imcc    schedule 11.12.2013
comment
Вы нашли здесь какое-нибудь решение?   -  person Naren    schedule 30.12.2019


Ответы (2)


Довольно старый вопрос, но, поскольку на него не было ответа, похоже, что если метод setNotifyValue(_:for:) справится с этим за вас, это зависит от свойств характеристики ниже:

  • Только уведомления: уведомления будут включены.
  • Только указать: индикация будет включена.
  • Укажите и уведомите: будут включены ТОЛЬКО уведомления.

Поэтому, если вам нужно включить индикацию, характеристика должна иметь только свойство индикации, а уведомление должно быть удалено.

Я предполагаю, что основная причина этого заключается в том, что индикация намного медленнее, поэтому iOS всегда будет предпочитать самый быстрый вариант, если это не требуется указывать.

Подробнее в документации Apple

person Mostafa Berg    schedule 13.07.2017

Проблема в том, что вы не можете использовать метод writeValue: forDescriptor: для записи значения дескриптора конфигурации клиента (UUID = 2902), как это делали вы.

Вместо этого вам следует использовать метод setNotifyValue: forCharacteristic: класса CBPeripheral для настройки клиентских индикаторов или уведомлений о значении характеристики на сервере.

person Eduardo Costa    schedule 31.08.2013