Делегат CoreBlueTooth didWriteValueForCharacteristic вызывается со значением null

Я устанавливаю уведомление для характеристики, а затем записываю некоторые данные (это адрес для чтения и длина данных для чтения) для другой характеристики. Будет вызван делегат didUpdateValueForCharacteristic, но character.value равен нулю (должен иметь какое-то значение) с правильной длиной. Я также проверяю делегат didWriteValueForCharacteristic. Это будет вызвано после того, как я запишу данные, но в делегате character.value имеет значение null, а character.UUID такой же, как я написал.

Итак, когда didWriteValueForCharacteristic вызывается без ошибок, означает ли это, что операция записи прошла успешно? Если да, то почему значение характеристики равно null? (Я думаю, что значение должно равняться тому, что я написал в writeValue: forCharacteristic:type:)


person realsnake    schedule 24.01.2013    source источник


Ответы (1)


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

didWriteValueForCharacteristic — это не то, что вам нужно, когда вы пытаетесь получить данные с периферийного устройства. Хотя вы говорите, что пытаетесь куда-то записать данные, я не уверен, какое это имеет отношение к получению уведомления об обновлении.

Если вы используете параметр уведомления, вам следует сосредоточиться на didUpdateValueForCharacteristic.

Когда вызывается didUpdateValueForCharacteristic, это не обязательно означает, что значение передано полностью. Вы должны иметь в виду, что отправляемые данные могут быть отправлены только в небольших количествах (20 байт, если я правильно помню), поэтому может быть случай, когда данные, которые вы просматриваете, являются неполными.

Еще я заметил, что на периферийной стороне, когда вы звоните

 [peripheralManager updateValue:dataToSent forCharacteristic:aCustomCharacteristic onSubscribedCentrals:nil];

он возвращает BOOL, который сообщает вам, были ли данные успешно отправлены. Если он не был успешно отправлен, он прекращает попытки отправить последующие, что может быть проблемой.

Когда я пытался отправить значение int в виде данных с периферийного устройства клиенту, я использовал iPad и iPhone. У меня были проблемы, когда iPhone был клиентом, а iPad — периферийным устройством. Я получил нулевые значения, очень похожие на то, с чем вы имели дело, но когда я поменял их местами, я получил правильные значения, которые должен был получить. Это также может быть проблема с вашими устройствами, которые вы используете, так как я не совсем уверен, что вы можете использовать iPad в качестве периферийного устройства.

person bolnad    schedule 03.05.2013