Как предоставить пользовательский UUID для сканирования Beacon в Android?

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

startLeScan(UUID[], BluetoothAdapter.LeScanCallback) 

вместо

startLeScan(BluetoothAdapter.LeScanCallback) 

сканировать только определенные маяки. Но он не сканирует маяки. Может кто подскажет как реализовать этот функционал.


person HeadOnn    schedule 11.06.2014    source источник


Ответы (1)


Не путайте UUID службы Bluetooth с UUID Proximity iBeacon. Они могут выглядеть одинаково, но иметь совершенно разные значения и цели.

Упомянутый вами метод startLeScan использует необязательный UUID службы для фильтрации сканирования устройств Bluetooth, предлагающих конкретную услугу. Это не сработает для сканирования iBeacons, которые не рекламируют определенные услуги и нуждаются в дополнительном программном обеспечении для декодирования своих полей.

Чтобы отсканировать iBeacons с определенным UUID Proximity и расшифровать их значения, попробуйте Android iBeacon Library который предназначен именно для того, что вы описываете. Настроить фильтр для одного Proximity UUID очень просто:

iBeaconManager.startMonitoringBeaconsInRegion(new Region("myRegion", "2F234454-CF6D-4A0F-ADF2-F4911BA9FFA6", null, null));

Полный пример можно увидеть здесь.

Если вы хотите свернуть свою собственную, вам нужно декодировать каждую рекламу bluetooth, возвращенную в BluetoothAdapter.LeScanCallback, отбросить рекламу, не относящуюся к iBeacon, затем сравнить UUID Proximity UUID каждой рекламы iBeacon с той, которую вы ищете, и игнорировать все, что не соответствует. совпадение. Упомянутая выше библиотека с открытым исходным кодом имеет метод fromScanData, который декодирует рекламу в поля iBeacon здесь.

person davidgyoung    schedule 11.06.2014
comment
Спасибо за вашу помощь. То есть вы имеете в виду, что устройство будет сканировать все бесконтактные UUID, и мне нужно сравнить uuid из результата сканирования с моим пользовательским uuid, чтобы получить результаты для конкретного маяка? - person HeadOnn; 11.06.2014
comment
Да, смотрите мой отредактированный ответ вместе со ссылкой на код, который преобразует данные рекламы в поля iBeacon. - person davidgyoung; 11.06.2014
comment
Спасибо. Также не подскажете, как увеличить время сканирования до 1 секунды как на ios? В Android он сканируется в миллисекундах. - person HeadOnn; 11.06.2014
comment
Я не уверен, что именно вы имеете в виду под 1 секундой, например, в iOS. Вы должны понимать, что если вы используете метод Android startLeScan, он будет продолжать сканирование вечно, пока вы его не остановите. Аналогичный метод на iOS работает точно так же. Функции ранжирования iOS CoreLocation предоставляют обновления каждые 1 с, но это более высокий API, функционально эквивалентный тому, что делает библиотека Android iBeacon с собственными обновлениями ранжирования примерно каждую секунду. Несмотря на это, это немного не соответствует исходной теме, поэтому вам обязательно следует опубликовать это как новый вопрос. - person davidgyoung; 11.06.2014
comment
В порядке. Я разместил новый вопрос. Пожалуйста, взгляните на следующую ссылку: stackoverflow.com/questions/24180849/ - person HeadOnn; 12.06.2014
comment
@HeadOnn Можете ли вы найти какое-либо решение для сканирования устройства Android на наличие BLE каждую секунду вместо миллисекунд ?? Пожалуйста, дай мне знать - person KK_07k11A0585; 26.07.2017
comment
Как упоминал @davidyoung здесь stackoverflow.com/questions/24180849/, я смог остановить таймер и перезапускать каждую 1 секунду, так что вместо этого я не проверяю каждое слово ‹ 100 мс от 1 секунды. - person HeadOnn; 26.07.2017