Я знаю, что это обсуждалось подробно, но я не нашел ответа, который, похоже, решает проблему, с которой я столкнулся с Android Bluetooth LE.Запись на несколько объектов BluetoothGatt на Android 4.4.4 Nexus 4
Система, которую мы разработали, позволяет подключаться к нескольким устройствам. Обнаружение и подключение к нескольким устройствам отлично работают. Каждый экземпляр объекта BluetoothGatt сохраняется на основе MAC-адреса устройства, и каждому из этих экземпляров присваивается уникальный объект обратного вызова (это основано на информации веб-сайта Nordic Semiconductor относительно нескольких подключений устройств в Android).
Проблема возникает, когда я пытаюсь записать одни и те же данные на несколько устройств. Как правило, каждая отдельная запись представляет собой одни и те же данные на одном и том же характерном UUID, но в разных экземплярах BluetoothGatt. Все записи помещаются в очередь в приложении, чтобы гарантировать, что только один запрос на запись ожидает в данный момент с BT Stack на Android. Я хорошо осведомлен о рискованных действиях, так как существует множество сведений об этом.
Поведение, которое я вижу, заключается в том, что одно из устройств, обычно первое, к которому я подключаюсь, всегда получает данные. Другие устройства никогда не получают данные. Тем не менее, BT-стек возвращает onCharacteristicWrite для каждой отправляемой мной записи. Итак, стек BT кажется, что он написал данные для всех устройств, но вместо этого кажется, что он стоит в очереди. Если через какое-то время прошло (неизвестное количество времени), я отправляю команду только одному из устройств, которые не получали данные, стек BT, похоже, нажимает на все неотправленные данные на устройство, а затем любую команду, которую я последний раз отправил, если ему была отправлена команда flush(). Вот LogCat поведения:
11-18 01: 58: 55,571 Е/TestApp (1110): writeDataToCharacteristic (Характеристика Значение:. [111, -1, 95])
11- 18 01: 58: 55,571 Д/TestApp (1110): Характеристика WriteType: 1
11-18 01: 58: 55,571 I/TestApp (1110): writeCharacteristic для CF: 9E: D0: 9A: 98: 90 со значением - [-1, -102, -112]
11-18 01: 58: 55.571 D/BluetoothGatt (1110): writeCharacteristic() - uuid: 9a143cb6-d775 -4cfb-9eca-6e3a9b0f966b
11-18 01: 58: 55,571 Д/BtGatt.GattService (1204): writeCharacteristic() - адрес = CF: 9E: D0: 9A: 98: 90
11-18 01: 58: 55,571 Д/BtGatt.btif (1204): btif_gattc_write_char
11-18 01: 58: 55,571 Д/BtGatt.btif (1204): btgattc_handle_event: Событие 1015
11-18 01: 58: 55.571 D/BtGatt.btif (1204): btif_gattc_upstreams_evt: Событие 4
11-18 01: 58: 55,571 Д/BtGatt.GattService (1204): onWriteCharacteristic() - адрес = CF: 9E: D0: 9A: 98: 90, статус = 0
11-18 01: 58: 55,571 Д/BluetoothGatt (1110): onCharacteristicWrite() - устройство = CF: 9E: D0: 9A: 98: 90 UUID = 9a143cb6-d775-4cfb-9eca-6e3a9b0f966b состояния = 0
11-18 01: 58: 55.571 I/testapp (1110): onCharacterisiticWrite
11-18 01: 58: 55.571 E/testapp (1110): writeDataToCharacteristic (характеристика.Значение: [111, -1, 95])
11-18 01: 58: 55,581 Д/TestApp (1110): Характеристика WriteType: 1
11-18 01: 58: 55,581 I/TestApp (1110): writeCharacteristic для DB: 7b: 3E: 47: AF: 1A со значением - [-1, -102, -112]
11-18 01: 58: 55,581 Д/BluetoothGatt (1110): writeCharacteristic() - UUID: 9a143cb6-d775-4cfb-9eca-6e3a9b0f966b
11-18 01: 58: 55,581 Д/BtGatt.GattService (1204): writeCharacteristic() - адрес = БД: 7B: 3E: 47 : AF: 1A
11-18 01: 58: 55,581 Д/BtGatt.btif (1204): btif_gattc_write_char
11-18 01: 58: 55,581 Д/BtGatt.btif (1204): btgattc_handle_event: Событие 1015
11-18 01: 58: 55,581 Д/BtGatt.btif (1204): btif_gattc_upstreams_evt: Событие 4
11-18 01: 58: 55,581 Д/BtGatt.GattService (1204): onWriteCharacteristic() - адрес = DB: 7B: 3E: 47: AF: 1A, status = 0 Stack утверждает, что успех записи, но данные никогда не принимаются на устройстве и chara cteristic значение остается неизменной
11-18 01: 58: 55,581 Д/BluetoothGatt (1110): onCharacteristicWrite() - Устройство = БД: 7B: 3E: 47: АФ: 1A UUID = 9a143cb6-d775-4cfb -9eca-6e3a9b0f966b состояния = 0
11-18 01: 58: 55,581 I/TestApp (1110): onCharacterisiticWrite
В приведенном выше, существуют две характерные записи на одной и той же характерной UUID на двух разных устройства. Основное отличие - это адрес устройства, который я выделил для ясности. Стек утверждает, что выполнил как записи, так и не сделал этого. Я не нашел решения этой проблемы, так как кажется, что стек кэширует запись на второе устройство, но не записывает его. Обратите внимание, что у меня есть задержка между каждым набором записей, но каждая отдельная запись задерживается только путем ожидания обратного вызова onCharacteristicWrite из стека.
Некоторые псевдо-коды, показывающие, как данные отправляются на все подключенные устройства. При необходимости я добавлю больше, если это необходимо для обсуждения:
Есть ли у кого-нибудь еще проблемы с этим вопросом?
Дополнительные испытания с помощью Samsung Galaxy S4 показывают, что код, который у меня работает, почти идеально подходит для S4.Есть еще ОЧЕНЬ немногие случаи, когда данные не отправляются, но в целом проблема, похоже, уходит. Таким образом, похоже, это может быть проблема Nexus 4 специально. –
У меня такая же проблема, когда я пытаюсь читать данные с двух устройств. Фактически я подписываюсь на оба признака устройства. Я получаю только один поток данных. – DaviF