Надежная связь с несколькими устройствами 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 структурирована вокруг этого.