Связь между устройством BLE и различными приложениями Android на одном устройстве

Я новичок в Android BLE, поэтому мой вопрос может быть неправильным или наивным в некотором роде. Если это так, пожалуйста, объясните мне, где я не прав, и, пожалуйста, покажите мне правильный способ управления этим сценарием.

Сценарий следующий: мое приложение Android связывается с устройством BLE, отправляя команды и получая ответы от устройства, используя характеристики BLE.

Последовательность:

  • Устройство запускает приложение (onConnectionStateChange метод называется)
  • Мое приложение пишет команду в характеристике (я называю writeCharacteristic положить команду в value параметр).
  • Устройство отправляет ответ на команду в мое приложение (onCharacteristicChanged метод срабатывает и value параметр содержит ответ)

После пробуждения приложения устройство ничего не делает, пока команда не отправлена ​​через writeCharacteristic, Устройство принимает разные команды.

Пока все хорошо, но недавно я разработал второе другое приложение для связи с одним и тем же устройством.

Когда я запускаю оба приложения на одном телефоне Android, одно приложение отправляет команду на устройство, и оба приложения получают ответ! Конечно, приложение, которое не отправило команду, получает неожиданный ответ и переходит в неожиданное состояние.

Хорошо, зная проблему, я могу изменить оба моих приложения, чтобы справиться с этой ситуацией, но возникает вопрос: нормально ли это поведение, когда два приложения на одном устройстве взаимодействуют с одним и тем же устройством BLE?

Есть ли способ для приложения установить канал связи с устройством BLE, чтобы избежать отправки ответа на конкретные команды любому другому приложению, кроме того, которое отправило запрос?

Я думаю, что writeCharacteristic а также onNotificationChanged не правильные функции для такого рода коммуникации, но в этом случае, какие альтернативы?

1 ответ

Сам по себе стандарт Bluetooth ничего не определяет, как будут вести себя несколько приложений, если оба будут иметь соединение GATT с одним и тем же устройством. В стандарте есть только один "клиент ГАТТ".

Теперь и iOS, и Android сделали еще один шаг вперед, что может показаться не интуитивным. Вместо того, чтобы разрешать связь только одному приложению одновременно, к одному клиенту GATT можно подключить несколько приложений к устройству. ОС "мультиплексирует" связь между приложениями и приложениями. Поведение заключается в том, что ответы на запросы на чтение и запись могут видеть только приложение, сделавшее запрос. Поэтому, если вы выполните readCharacteristic, только это приложение получит обратный вызов onCharacteristicRead. Однако уведомления будут доставляться обоим приложениям на обратный вызов onCharacteristicChanged, поскольку отправлять уведомления только одному не имеет смысла.

Когда вы говорите, что "ответом" на запрос на запись является уведомление, это неверно с точки зрения терминологии GATT. Ответ на запрос записи всегда пуст для каждой спецификации (или ошибка). Если ваше периферийное устройство отправляет уведомление, то в вашем случае это может быть "ответ" в соответствии с вашей собственной логикой, но это не ответ или какое-либо отношение к вашему запросу на запись в соответствии со спецификацией GATT. Вот почему Android не может (и не должен) отправлять уведомления только на одно устройство.

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

Когда я пишу "приложение" выше, я действительно имею в виду объекты BluetoothGatt. Вы можете дважды вызвать connectGatt с одного и того же удаленного устройства в одном приложении, которое будет вести себя так же, как если бы вы подключились из двух разных приложений.

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