Получить BLE-сканирование без дублирования фильтра UUID

Я пишу приложение BLE, где нужно отслеживать, продается ли устройство периферийных устройств или останавливается.

Я следил за получением периферийных устройств без дублирования и BLE Фильтрация поведения startLeScan(), и я полностью согласен здесь.

Чтобы сделать это возможным, я сохранил таймер, который повторно сканирует для периферийных устройств через определенное время (3 секунды). Но с новым устройством, доступным на рынке (с обновлением 5.0), некоторое время повторного сканирования занимает немного времени, чтобы найти периферийные устройства.

Любое предложение или если кто-либо достиг этого?

Ответ 1

Похоже, вы заинтересованы в сканировании рекламы, а не в подключении к устройствам. Это роль наблюдателя в Bluetooth Low Evergy и соответствует роли "вещателя", которая чаще известна как "Маяк". (Bluetooth Core 4.1 Vol.1, часть A, раздел 6.2)

Обычно вы включаете пассивное сканирование, ищите пакеты ADV_IND, транслируемые с помощью маяков. Они могут содержать или не содержать UUID. Кроме того, вы можете осуществлять активное сканирование, передавая SCAN_REQ, к которому вы можете получить SCAN_RSP. Многие устройства используют различные рекламные материалы в ADV_IND и SCAN_RSP, чтобы увеличить объем информации, которую можно транслировать, - например, вы можете установить UUID128 в ADV_IND, а затем имя устройства в SCAN_RSP. (Bluetooth Core 4.1 Vol.2 Part E Section 7.8.10)

Теперь вам нужно определить "уйти" - вы ожидаете, что реклама остановится или исчезнет? - это то, как работает iBeacon позиционирование, и есть много поддержки для приемников маяков в Android.

В качестве альтернативы вы ожидаете N секунд для рекламы, которая должна быть передана каждые T секунд, где N > 2T. Недостатком подхода, основанного на сроках, является то, что, вероятно, не получение маякового радиосигнала не то же самое, что определенно получение слабого маяка; убедитесь, что вам нужно, чтобы N было большим, и это влияет на задержку между выключенным вещателем или выходом из диапазона, и ваше приложение обнаруживает его.

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

Ответ 2

Первый сценарий: Связанные устройства

Мы знаем, что если a bond, то большинство коммерческих устройств отправляют directed advertisements во время повторного соединения. В таких ситуациях, как в соответствии со спецификацией BLE 4.0, вы не можете сканировать эти устройства на любом сниффере BLE.

Второй сценарий: подключаемые устройства

Периферийные устройства обычно находятся в этом режиме, когда они первоначально находятся в фазе reset. Центр отправляет инициатор connect в ответ на пакет advertisement. Этот сценарий предлагает вам большую гибкость, поскольку вы можете играть с двумя преобладающими параметрами конфигурации, чтобы изменить время соединения. Это: slavelatency на периферии и conninterval на центральном. Теперь я не знаю, сколько усилий потребуется для его работы на платформе Android, но если вы используете стек Bluez BLE и настраиваемое периферийное устройство, такое как тег датчика TI, вы можете играть с этими значениями.

Третий сценарий: устройства маяка

Так как это ваш вопрос вращается вокруг, в соответствии с архитектурой BLE, нет никаких параметров для игры. В этом случае центральный - это просто немое устройство, оставшееся во власти, когда периферия выбирает отправку сигнала маяка.

Ссылка:

http://www.amazon.com/Inside-Bluetooth-Communications-Sensing-Library/dp/1608075796/ref=pd_bxgy_14_img_z

http://www.amazon.com/Bluetooth-Low-Energy-Developers-Handbook/dp/013288836X/ref=pd_bxgy_14_img_y

Ответ 3

Изменить: я забыл, вы пытались настроить рекламодателя на невозможность подключения? Таким образом, вы должны иметь возможность получать повторяющиеся результаты сканирования.

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

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

Я запускаю LE-сканирование, как только получаю обратный вызов, я устанавливаю флаг для остановки и снова запускаю сканирование. Таким образом, вы обойдете эту проблему DUPLICATE_PACKET фильтра, так как она сбрасывается всякий раз, когда вы начинаете новое сканирование.

ScanResults я сбрасываю в sqlite db, который я сжимаю и оцениваю один раз каждые х секунд.

Легко адаптировать сокращение к используемому случаю, т.е. удалять записи старше X, а затем запрашивать существование устройства, чтобы узнать, получил ли вы ScanResult за последние X секунд. Однако не ставьте слишком низкое значение X, так как вы должны учитывать, что вы все еще теряете много рекламных пакетов при сканировании в Android-браузере по сравнению со сканированием BLE, то есть bluez..

Изменить: Я могу добавить некоторую информацию, которую я уже нашел, чтобы ускорить работу над обнаружением рекламы. Он включает в себя модификацию и компиляцию источников bluedroid и корневой доступ к устройству. Самым простым было бы создание полного андроида, т.е. Cyanogenmod.

Когда выполняется сканирование LE, модуль bluetooth отправляет сканирующий ответ через HCI в стек bluedroid. Там выполняются различные проверки, пока он, наконец, не будет передан Java onScanResult(...), к которому осуществляется доступ через JNI.

Сравнивая журнал hci-данных, отправленных с модуля bluetooth (может быть включен в /etc/bluetooth/bt _stack.conf) с выходом отладки в стеке bluedroid, а также на стороне Java, я заметил, что много рекламных пакетов отброшен, особенно в некоторых случаях. Я действительно не понимаю, кроме того, что он имеет какое-то отношение к базе данных запросов bluedroid Из документации ScanResult мы видим, что ScanRecord включает в себя данные рекламы и данные ответа сканирования. Поэтому может быть, что андроид блокирует отчет до тех пор, пока он не получит данные ответа сканирования/пока не станет ясно, что нет данных ответа сканирования. Это я не смог проверить, однако, возможность.

Поскольку меня интересуют только быстрые обновления RSSI этих пакетов, я просто прокомментировал это. Кажется, что каждый пакет, который я получаю от bluetooth по модулю hci, передается на сторону Java.

В файле btm_ble_gap.c в функции BOOLEAN btm_ble_update_inq_result(tINQ_DB_ENT *p_i, UINT8 addr_type, UINT8 evt_type, UINT8 *p) прокомментируйте to_report = FALSE; в следующей проверке, начиная с строки 2265.

/* active scan, always wait until get scan_rsp to report the result */
if ((btm_cb.ble_ctr_cb.inq_var.scan_type == BTM_BLE_SCAN_MODE_ACTI &&
     (evt_type == BTM_BLE_CONNECT_EVT || evt_type == BTM_BLE_DISCOVER_EVT)))
{
    BTM_TRACE_DEBUG("btm_ble_update_inq_result scan_rsp=false, to_report=false,\
                          scan_type_active=%d", btm_cb.ble_ctr_cb.inq_var.scan_type);
    p_i->scan_rsp = FALSE;
    // to_report = FALSE; // to_report is initialized as TRUE, so we basically leave it to report it anyways.
}
else
    p_i->scan_rsp = TRUE;