Надежная связь с несколькими устройствами BLE одновременно на Android

Несмотря на недокументированную традиционную мудрость с использованием Android BLE apis, некоторые операции, такие как чтение/запись характеристик и дескрипторов, должны выполняться по одному (хотя некоторые устройства более снисходительны, чем другие). Однако я не знаю, следует ли применять эту политику только к одному соединению или по всем активным соединениям.

Я слышал, что лучше всего начать подключение к устройствам по одному за раз. Это может быть пример операций (connect/connectGatt), которые должны выполняться последовательно среди всех устройств.

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

Ответы

Ответ 1

В Android на каждый объект BluetoothGatt вы должны выполнять только одну операцию за раз (запрос mtu, поиск сервисов, чтение/запись характеристики/дескриптор), иначе все пойдет не так. Вам нужно подождать, пока соответствующий вызов будет вызван, пока вы не сможете выполнить следующую операцию.

В случае одновременного подключения к нескольким устройствам, если вы используете autoConnect = true, тогда нет проблем, но если вы используете autoConnect = false, тогда стек Android bluetooth будет пытаться только подключиться к одному устройству за раз, что означает он будет выдавать запросы на соединение, если имеется несколько выпусков. Существует одна конкретная ошибка, в которой он не может отменить ожидающее соединение, которое все еще находится в очереди (когда вы вызываете .disconnect() или .close()), однако это недавно было исправлено в Android.

Обратите внимание, что существует также максимальное количество подключений/ожидающих соединений/gatt-объектов, для которых поведение полностью недокументировано, что происходит, когда вы превышаете эти пределы. В лучших случаях вы просто получаете обратный вызов со статусом ошибки, но в некоторых случаях я видел, что стек bluetooth Android застрял в бесконечном цикле, где он на каждой итерации сообщает контроллеру bluetooth подключиться к устройству, но контроллер отправляет обратно достигнуты максимальные соединения с кодом ошибки.

Ответ 2

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

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

BLE работает на 40 канальных диапазонах, в которых 3 используются для широковещательной и другой передачи данных. Это делается для того, чтобы иметь возможность взаимодействия множества устройств, ограничивающих столкновение, находясь на других частотных диапазонах.

Эти полосы выбираются на основе одного с самым низким уровнем шума (или трафика).

Сам приемопередатчик способен общаться (говорить и слушать) в одной полосе за раз и переключается между диапазонами для доступа к другим устройствам. Это делается очень плотным сроком связи.

Еще один факт заключается в том, что беспроводной приемопередатчик представляет собой в основном своего рода полудуплексную связь с обнаружением столкновения, он не может одновременно отправлять и слушать, а также не может одновременно излучать два устройства в одном и том же диапазоне. Поэтому по дизайну (и законам природы) последовательный или последовательный.

Если вы реализуете какую-то операционную очередь или поточную реализацию, в конце все должно будет обрабатываться последовательно/последовательно приемопередатчиком.

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

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

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

Ответ 3

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

Это говорит о том, что я не уверен, как библиотека Android структурирована вокруг этого.