Я знаю, что это подробно обсуждалось, но я не нашел ответа, который бы решил проблему, с которой я столкнулся с Android Bluetooth LE.
Разработанная нами система позволяет подключаться к нескольким устройствам. Обнаружение и подключение к нескольким устройствам отлично работает. Каждый экземпляр объекта BluetoothGatt сохраняется на основе MAC-адреса устройства, и каждому из этих экземпляров назначается уникальный объект обратного вызова (это основано на информации с веб-сайта Nordic Semiconductor о подключениях нескольких устройств в Android).
Проблема возникает, когда я пытаюсь записать одни и те же данные на несколько устройств. Обычно каждая отдельная запись представляет собой одни и те же данные для одного и того же характеристического UUID, но в разных экземплярах BluetoothGatt. Все записи помещаются в очередь в приложении, чтобы гарантировать, что только один запрос записи ожидает в данный момент времени с помощью стека BT на Android. Я хорошо осведомлен об опасности поступить иначе, поскольку об этом имеется множество информации.
Я наблюдаю за тем, что одно из устройств, обычно первое, к которому я подключаюсь, всегда получает данные. Другие устройства никогда не получают данные. Однако стек BT возвращает onCharacteristicWrite для каждой отправляемой мной записи. Итак, стек BT, кажется, думает, что записал данные на все устройства, но вместо этого, кажется, ставит их в очередь. Если по прошествии некоторого времени (неизвестное количество времени) я отправляю команду только на одно из устройств, которое не получало данные, кажется, что стек BT отправляет все неотправленные данные на устройство, а затем любую команду, которую я последний раз отправлял как если ему была отправлена команда flush (). Вот логарифм поведения:
11-18 01: 58: 55.571 E / testapp (1110): writeDataToCharacteristic (характеристика. Значение: [111, -1, 95])
11-18 01: 58: 55.571 D / 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 D / BtGatt.GattService (1204): writeCharacteristic () - address = CF: 9E: D0: 9A: 98: 90
11-18 01: 58: 55.571 D / BtGatt.btif (1204): btif_gattc_write_char
11-18 01: 58: 55.571 D / 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 D / BtGatt.GattService (1204): onWriteCharacteristic () - адрес = CF: 9E: D0: 9A: 98: 90, статус = 0
11-18 01: 58: 55.571 D / BluetoothGatt (1110): onCharacteristicWrite () - Device = 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 D / 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 D / BluetoothGatt (1110): writeCharacteristic () - uuid: 9a143cb6-d775-4cfb-9eca-6e3a9b0f966b
11-18 01: 58: 55.581 D / BtGatt.GattService (1204): writeCharacteristic () - address = DB: 7B: 3E: 47: AF: 1A
11-18 01: 58: 55.581 D / BtGatt.btif (1204): btif_gattc_write_char
11-18 01: 58: 55.581 D / BtGatt.btif (1204): btgattc_handle_event: Событие 1015
11-18 01: 58: 55.581 D / BtGatt.btif (1204): btif_gattc_upstreams_evt: Событие 4
11-18 01: 58: 55.581 D / BtGatt.GattService (1204): onWriteCharacteristic () - address = DB: 7B: 3E: 47: AF: 1A, status = 0 Заявки на стек запись успешна, но данные никогда не поступают на устройство, и значение характеристики остается неизменным.
11-18 01: 58: 55.581 D / BluetoothGatt (1110): onCharacteristicWrite () - Устройство = DB: 7B: 3E: 47: AF: 1A UUID = 9a143cb6-d775-4cfb-9eca-6e3a9b0f966b Статус = 0
11-18 01: 58: 55.581 I / testapp (1110): onCharacterisiticWrite
В приведенном выше описании есть две характеристические записи в один и тот же характеристический UUID на двух разных устройствах. Основное отличие - это адрес устройства, который я выделил для ясности полужирным шрифтом. Стек утверждает, что выполнил обе записи, но на самом деле это не так. Я не нашел решения этой проблемы, так как кажется, что стек кэширует запись на второе устройство, но на самом деле не записывает ее. Обратите внимание, что у меня есть задержка между каждым набором записей, но каждая отдельная запись задерживается только из-за ожидания обратного вызова onCharacteristicWrite из стека.
Какой-то псевдокод, чтобы показать, как данные отправляются на все подключенные устройства. Если необходимо, для этого обсуждения я добавлю еще:
if(canWrite) {
for (BTDevice device : deviceList) {
/* Each write is queued at a lower level. */
device.sendData(data);
}
nextChangeAllowed = System.currentTimeMillis() + 100;
canWrite = false;
}
if(nextChangeAllowed < System.currentTimeMillis()) {
canWrite = true;
}
Кто-нибудь еще сталкивался с этой проблемой и решал ее?