2014-11-17 3 views
1

Я знаю, что это обсуждалось подробно, но я не нашел ответа, который, похоже, решает проблему, с которой я столкнулся с 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 из стека.

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

Есть ли у кого-нибудь еще проблемы с этим вопросом?

+0

Дополнительные испытания с помощью Samsung Galaxy S4 показывают, что код, который у меня работает, почти идеально подходит для S4.Есть еще ОЧЕНЬ немногие случаи, когда данные не отправляются, но в целом проблема, похоже, уходит. Таким образом, похоже, это может быть проблема Nexus 4 специально. –

+0

У меня такая же проблема, когда я пытаюсь читать данные с двух устройств. Фактически я подписываюсь на оба признака устройства. Я получаю только один поток данных. – DaviF

ответ

-1

Я столкнулся с аналогичной проблемой, как ваша. Мне нужно было написать одну и ту же характеристику для двух устройств, а то, что я сделал, - это реализовать алгоритм, который написал характеристику для второго устройства, только когда первая была написана и прочитана (когда вызывается onCharacteristicRead).

Так что canWrite flag (на вашем псевдокоде), должен быть изменен внутри обратного вызова onCharacteristicRead, когда написанная и прочитанная предыдущая характеристика была заполнена.

Надеюсь, это поможет.

+0

Я не уверен, почему нужно было бы читать после записи, учитывая, что метод onCharacteristicWrite показывает обновленное значение признака. Таким образом, запись по сути является «прочитанной» в этой точке в любом случае. Я попробую его на Nexus 4, чтобы понять, не имеет значения. –

+0

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

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