3

Я пытаюсь выяснить, как сделать определенные триггеры обратных вызовов. На периферии peripheralManager:central:didSubscribeToCharacteristic: вызывается правильно и отправляет кусок (первый из двух) данных в центральный, который принимает его в peripheral:didUpdateValueForCharacteristic:error:, как и ожидалось.Процедура обратного вызова Bluetooth Core Framework периферийнаяManagerIsReadyToUpdateSubscribers: не называется

Теперь есть один кусок слева, который должен быть отправлен в обратном вызове периферии peripheralManagerIsReadyToUpdateSubscribers: в соответствии с Apple's test application.

Я проверял и проверял, и он отлично работает. Это немного подозрительно, хотя, согласно документам, это только должно быть вызвано, когда updateValue:forCharacteristic:onSubscribedCentrals: периферийного менеджера терпит неудачу.

Как сделать периферийную передачу оставшегося фрагмента? Я могу предоставить вам код, но он почти идентичен (я использую массив узлов NSData вместо одной большой NSData, такой как пример) к приложению, к которому я привязан, мне более любопытно, как цепочка обратного вызова работает и что должно быть на месте для запуска различных селекторов.

ответ

3

мне удалось вызвать peripheralManagerIsReadyToUpdateSubscribers: с помощью петли в sendData (который вызывается из peripheralManagerIsReadyToUpdateSubscribers: и peripheralManager:central:didSubscribeToCharacteristic:).

- (void)sendData { 
    BOOL success = YES; 
    while (success && ([_outgoingDataQueue count] > 0)) { 
     NSData *chunk = [_outgoingDataQueue peek]; 
     success = [self.peripheralManager updateValue:chunk 
            forCharacteristic:self.characteristic 
           onSubscribedCentrals:nil]; 
     if (success) { 
      [_outgoingDataQueue dequeue]; 
     } 
    } 
} 

Это не похоже на правильный способ отправки данных в виде кусков в центральный.

3

Что вы делаете, это обычный способ работы. Периферийный менеджер обрабатывает передачу данных и реализует управление потоком в соответствии с текущими настройками. Например. если вы используете индикаторы вместо уведомлений, то каждое обновление должно быть подтверждено приемником, прежде чем вы сможете отправить его снова.

Уведомления, с другой стороны, похожи на UDP-пакеты. Они могут потеряться. Чтобы убедиться, что данные получены без ошибок, вам необходимо реализовать дополнительное управление потоком управления.

В целом, вы делаете это правильно.

+0

Спасибо, мне удалось впитаться в то, что мне нужно возвращаться каждый раз, когда он не отправляет кусок для срабатывания обратного вызова. – MdaG

+0

@MdaG Да, это не очень хорошо сформулировано в документации, и пример самого приложения показывает очень плохую практику. (Конгломерация всех функций в одной функции.) Я просто подумал, что вам будет полезно получить некоторые отзывы о том, что вы делаете это более или менее правильно. – allprog

+0

Итак, в нетривиальном примере с несколькими характеристиками нужно было бы поддерживать набор очередей, по одному для каждого признака? Или, может быть, очередь, содержащая словари, связывающие данные с характеристикой? – Gorm

Смежные вопросы