Непоследовательная видимость рекламных пакетов Ble
Я работаю над приложением для Android, где мы используем отличное устройство, которое я нашел, чтобы получить rssi для расчета расстояния. Я работаю над маяками уже несколько месяцев вместе, но все еще понять его поведение очень сложно.
У меня есть устройство BLE, транслирующее на 10hz
(10 пакетов / сек). С помощью BluetoothLeScanner.startScan(scanCallback)
чтобы получить RSS. Сканирование происходит непрерывно, и поэтому для понимания мы предполагаем получать все 10 расширенных пакетов в секунду. Поскольку сканирование продолжается, нет пропущенных пакетов данных. Но поведение отличается на каждом телефоне. Я проверил на нескольких телефонах и наблюдал поведение на нескольких телефонах, как показано ниже,
Moto C Plus, AV: 7.0: 6-8 Callbacks/s
Redmi Note 4, Av: 7.0: 4-6 Callbacks/s
Moto G 2ng generation, AV: 6.0: android finds 1-3 callbacks for few seconds and no callbacks for seconds like 5,10 even for around 20+sec.
One Plus one, AV: 6.0.1 : frequent is 1-3 callbacks and rest of behaviour is same as Moto G, no callbacks for seconds( like 5,10 even for around 20+sec)..
У меня нет устройства под управлением Android версии 5, чтобы найти поведение на этом.
Запрос:
Почему это несоответствие в рекламной видимости на Android варьируется? Это из-за версий Android или отдельных устройств Android?
(Уверен, что мое устройство BLE вещает с частотой 10 Гц)
Я нашел разные блоги на маяках, Bluetooth с низким энергопотреблением, но не нашел достаточной информации об этом конкретном поведении. Любые идеи очень ценятся.
1 ответ
Не 100% пакетов маяка обнаруживаются устройствами Android по ряду причин. Среди них:
- Рекламные пакеты отправляются по нескольким различным радиоканалам, и передатчик и приемник должны находиться на одном и том же канале одновременно.
- Радиошум иногда вызывает ошибки в битах в цифровом сигнале на стороне приемника, из-за чего CRC (т.е. контрольная сумма) не совпадает, поэтому приемник игнорирует пакет.
- Происходят коллизии в передаваемых пакетах от нескольких устройств Bluetooth поблизости. Когда имеют место коллизии, пакеты, как правило, не принимаются, потому что они перекрывают друг друга и мешают друг другу.
- Рекламодатели Bluetooth автоматически рандомизируют интервал между своими пакетами, поэтому передатчик с частотой 10 Гц не отправляет ровно 10 пакетов каждую секунду. Некоторые секунды могут иметь 11 пакетов, другие 9.
Даже в самых лучших условиях вы не получите 100% пакетов, переданных на приемник. Приемники самого высокого качества, получающие сильные сигналы в условиях с низким уровнем шума, могут получать 90% объявленных пакетов.
Существует также огромная разница между различными моделями устройств Android, вызванная использованием разных наборов микросхем Bluetooth, разных антенн Bluetooth, разных случаев (которые могут блокировать, усиливать или пропускать сигналы), помехами сигнала в WiFi (который использует одну и ту же полосу частот и часто разделяет тот же чип.) Как вы видели, количество пакетов, обнаруженных на некоторых моделях Android, может быть значительно меньше даже при одинаковых условиях тестирования.
Основной драйвер различий в скорости приема пакетов между моделями Android, вероятно, связан с антенной Bluetooth и помехами от цепей WiFi. Я заметил, что некоторые модели Android (например, мое тестовое устройство Huawei P9 Lite) показывают значительно более слабый RSSI (уровень сигнала) в среднем для того же передатчика маяка, чем приемник Android Nexus 5X. Этот сигнал на 20 дБ слабее. Более слабые сигналы относительно шума обычно означают более высокие показатели потери пакетов по причинам, описанным выше. Одно из первых устройств Android, поддерживающих BLE, Nexus 4, обычно вообще не могло обнаружить пакеты BLE, если WiFi был включен.
На Samsung Galaxy S6 Edge + я заметил, что в зависимости от того, на каком канале был включен рекламный пакет, RSSI будет значительно выше или ниже, возможно, из-за того, что антенна меньше настроена на слегка изменяющуюся радиочастоту некоторых каналов. Это означает, что шум был выше относительно сигнала на более слабых каналах, и более высокая скорость потери пакетов при обнаружении рекламы на этих каналах. К сожалению, API-интерфейсы Android не указывают, какой канал использовался для обнаружения пакета, поэтому исправить это невозможно.
Итог: это сложная проблема, которая имеет много, много переменных. Результаты, которые вы наблюдаете, не являются необычными.