Android 12+ BLE Байты разныеAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Android 12+ BLE Байты разные

Сообщение Anonymous »


Я разработал небольшое приложение на Kotlin, которое сканирует близлежащие BLE-маяки с помощью bluetoothLeScanner.startScan(scanCallback). Это работает очень хорошо (часть сканирования/обнаружения).

После тестирования моего приложения на Android 10, Android 12 и на Android 13 я обнаружил, что ScanResult.scanRecord Массив .bytes совершенно другой для одного и того же BLE-маяка (то же имя устройства и тот же MAC-адрес устройства) в Android 12 и Android 13.
У меня есть полный доступ к «правильному» байту в Android 10, который позволяет мне читать Major, Minor, *UUID *и Добавлено пользователем BatteryLevel. BatteryLevel — это всего лишь дополнительный байт, который может находиться в диапазоне от 00 до 64 (00 = 0% и 64 = 100%).
В Android 12+ я получаю байтовый массив, который содержит только MAC-адрес (это то, что я смог выяснить после преобразования каждого байта в шестнадцатеричный). Байтов больше, чем MAC-адрес, но они мне неизвестны (упомянутые байты не похожи на UUID, Major, Minor или BatteryLevel).

По сути, моя проблема заключается в получении того же объема данных с Android 12+, что и с Android 10. Вот почему я предполагаю, что bluetoothLeScanner.startScan(scanCallback) необходимо настроить для Android 12+ для правильной работы, или мне нужно изменить способ сбора данных для каждого ScanResult для Android 12+.

Буду признателен за любую помощь.

Я просмотрел документ Android BLE, но нигде не написано, что массив ScanResult.scanRecord.bytes изменяется начиная с Android 12. Также не упоминается какой-либо другой подход для Android 12+, кроме разрешений Bluetooth, которые необходимо установить для Android 12+.

Я просмотрел байтовый массив, преобразовал его в шестнадцатеричный и искал шаблоны, если нужно найти UUID, Major, Minor или BatteryLevel, к сожалению, безрезультатно. Поиск руководств по BLE на YT тоже не помог. В основном это теоретические видеоролики или видеоролики для BLE на Android 11 и более ранних версиях
.
Код для сканирования BLE-маяка:bluetoothLeScanner.startScan(scanCallback)

Разрешения манифеста Android:

Код внутри ScanCallback onScanResult:
if(result.scanRecord?.bytes != null){ вал сб = StringBuilder() for (b в result.scanRecord!!.bytes) { sb.append(String.format("%02X", b)) } val tripmedSb = sb.toString().trim() if(trimmedSb.endsWith("000000000000000000000000000000000000000000000000000000000000")) { вернуть // бесполезные данные } if(trimmedSb.length >= 61){ if(trimmedSb.endsWith("0000")){ Уровень батареи = -1 }еще{ BatteryLevel = TrimmedSb.substring(IntRange(60, 61)).toInt(16) } } if(trimmedSb.length >= 50){ val uuid_first = TrimmedSb.substring(18,26) val uuid_ Second = TrimmedSb.substring(26, 30) val uuid_ Third = TrimmedSb.substring(30,34) val uuid_fourth = TrimmedSb.substring(34, 38) val uuid_fith = TrimmedSb.substring(38,50) uuid = "$uuid_first-$uuid_вторых-$uuid_третьих-$uuid_fourth-$uuid_fith" } if(trimmedSb.length >= 54){ Major = TrimmedSb.substring(50, 54).padStart(4,'0') } if(trimmedSb.length >= 58){ минор = TrimmedSb.substring(54, 58).padStart(4,'0') }
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»