Проблема построения рекламы iBeacon в Android - PullRequest
0 голосов
/ 10 января 2019

Я пытаюсь смоделировать iBeacon с помощью BluetoothLeAdvertiser. Мне удалось без труда отсканировать и найти iBeacon, но при создании iBeacon отправленные рекламные данные кажутся неверными.

Маяки, которые я нашел, имеют следующий формат: Значение байта 0: 0x02 Длина данных - 2 байта Значение байта 1: 0x01 Тип данных - флаги Значение байта 2: 0x06 флаг LE и BR / EDR Значение байта 3: 0x1a Длина данных - 26 байтов Значение байта 4: 0xff Тип данных - данные производителя Значение байта 5: 0x4c Данные производителя Значение байта 6: 0x00 Данные производителя .. и т. д.

Я попытался создать аналогичные рекламные данные для имитации iBeacon, используя AdvertiseData.Builder.addManufacturerData, создав массив и скопировав значения выше. Однако, когда я отправляю рекламные данные, в начале добавляются дополнительные байты: 0x1a 0xff 0x4c 0x00

Я заметил, что количество дополнительных байтов и их значения меняются в зависимости от того, как я установил параметры рекламы. Например, AdvertiseData.Builder.setConnectable (истина); добавляет еще 3 байта в начале моих рекламных данных (как обнаружено в BluetoothAdapter.LeScanCallback).

Есть ли способ получить абсолютный контроль над тем, что Рекламодатель отправляет в виде данных? Я проверил https://github.com/AltBeacon/android-beacon-library/blob/master/src/main/java/org/altbeacon/beacon/BeaconTransmitter.java,, но это делает более или менее то, что я делаю, насколько я могу судить. Использование Bluetooth 5 на Android 9.0

1 Ответ

0 голосов
/ 10 января 2019

API рекламы Android BLE не дают вам полного контроля над передаваемым пакетом. Фрейм "объявления производителя" начинается с байта длины, затем 0xff, чтобы указать, что это тип производителя, а затем два Байтовый код производителя.

Поэтому, когда вы видите 0x1a 0xff 0x4c 0x00, вы имеете только частичный контроль над этими байтами. 0xff фиксируется в зависимости от типа рекламы, которую вы отправляете. 0x1a - это длина вашего пакета (которую вы можете частично контролировать, исходя из того, сколько байт вы поместили в рекламу), а 0x4c 0x00, которую вы можете контролировать, установив код производителя.

Остальные байты являются вашей полезной нагрузкой, и вы имеете полный контроль над ними вплоть до ограниченного размера пакета. Любые исходящие байты до длины (0x1a в вашем случае) являются заголовками флагов, и Android не дает вам никакого контроля над ними.

...