Проблема с последовательной передачей

Я работаю над простой оболочкой для CoreBluetooth для отправки любых данных на любое устройство. Во время разработки я столкнулся с множеством ошибок в фреймворке, они очень раздражали, и чтобы сделать мою оболочку стабильной, мне пришлось сократить некоторые функциональные возможности для надежности.

Сейчас я работаю над отправкой данных с периферийных устройств.

Итак, у меня есть следующий случай:

  • Клиент запрашивает значение динамической характеристики
  • Я получаю обратный вызов на стороне сервера - периферийное устройство:didReceiveReadRequest:.

Примечание. Мне нужно ответить на этот запрос CBATTR этим способом - я не могу сохранить его в другом месте и отвечать на него асинхронно. (Я просто помещаю некоторый кусок @ "PrepareToReceiveValue", который будет игнорироваться на центральной стороне. Вся отправка выполняется в очереди.)

  • Для предоставления данных для различных устройств я построил очередь с BTMessage в нем. (Таким образом, для readRequest я создаю сообщение и добавляю его в очередь отправки. Если отправка чанка не удалась - я получу обратный вызов от диспетчера периферийных устройств о readyToUpdateSubscribeers и попросит очередь повторно отправить сбойный чанк)
  • Поэтому, когда я немедленно запрашиваю большое количество значений динамических характеристик и отправляю данные из периферийного устройства в центральное одновременно, иногда это просто останавливает процесс отправки и приводит к отключению.

После нескольких испытаний я обнаружил, что все дело в очереди на передачу: если очередь на передачу заполнена и вы получите запрос на чтение - он просто не ответит на него.

Итак, у меня есть потенциальное нестабильное состояние системы:

  1. Периферийное устройство отправляет данные в какой-то центральный узел.
  2. В моем методе отправки updateValue:forCharac… возвращает NO, потому что очередь передачи заполнена.
  3. В этот момент центральный запрос динамического значения для характеристики и периферийного устройства: didReceiveReadRequest: вызов будет добавлен к текущему циклу выполнения.
  4. После возврата из метода отправки он отключит периферийное устройство: didReceiveReadRequest: метод, и ответ на этот запрос не будет иметь никакого эффекта (очередь передачи заполнена).
  5. Так что в этом случае responseToRequest: игнорируется, как будто я его вообще не вызывал.
  6. CoreBluetooth не сможет отправлять / получать какие-либо данные, пока я не отвечу на запрос. Это было причиной остановки любого процесса отправки / получения с сопутствующим отключением.
  7. Как я упоминал ранее - я должен ответить на запрос соответствующим способом - иначе это также не будет иметь никакого эффекта. (Я говорю это, потому что я пытался поместить эти запросы в массив, если очередь заполнена, и отвечать на них, когда у нее будет место, но безуспешно).

Я жду ваших предложений / предложений, как решить эту проблему, любая помощь будет оценена.

0 ответов

Другие вопросы по тегам