Android BLE: получение служебного UUID в обратном вызове onLeScan() при рекламе от iOS Peripheral
Я использую Nexus 4 (4.4 kitkat) как центральный и iPad как периферийный. Периферийный сервис, который он рекламирует. В рекламном пакете есть некоторые данные (22 байт) + сервис UUID. Когда я пытаюсь отсканировать периферию от Android, iPad периферия обнаружена.Однако, когда я пытаюсь получить UUID службы из параметра scanRecord в обратном вызове, я не смог его найти. Все, что я получаю, это данные в 20байт, которые посылает периферийное устройство. Когда я пытаюсь сканировать устройства с UUID, я не могу обнаружить эти периферийные устройства.
Ниже приведен код iOS для рекламы сервиса. Используемый идентификатор службы "0000192f-0000-1000-8000-00805f9b34fb"
CBUUID *serviceUuid = [CBUUID UUIDWithString:TRANSFER_SERVICE_UUID];
[self.peripheralManager startAdvertising:@{CBAdvertisementDataServiceUUIDsKey : @[serviceUuid],
CBAdvertisementDataLocalNameKey:[[BTLEConfigs sharedBTLEConfig] getAdvertizingUUID]}];
Устройство обнаруживается при сканировании без служебного UUID.
// Device scan callback.
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, final byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
//-- how to retrieve the service id from scanRecord
}
});
}
};
Службы обнаруживаются между двумя устройствами iOS, но между Android-устройством и периферией iOS его не работает. Как сканировать периферийное устройство с 16-разрядным UUID службы? Любая помощь приветствуется.
Ответы
Ответ 1
Байт байта записи сканирования содержит данные в формате EIR. См. Раздел Основные характеристики Bluetooth.
Запись сканирования содержит одну или несколько последовательных записей EIR, которые имеют следующий формат:
<entry length (1 byte)> <data type (1 byte)> <data (length - 1 bytes)>
Вы ищете запись EIR с типом 0x02 или 0x03 (см. Спецификация ядра Bluetooth, раздел 18.2). Данные для записи будут содержать один или несколько UUID в формате Little Endian.
Пример записи сканирования:
02011a0303b4540a094c69676874426c7565
Можно разбить на:
02 01 1a Flags - 1a
03 03 b454 16-bit service UUID - 54b4
0a 09 4c69676874426c7565 Local name - LightBlue
Ответ 2
Это известная ошибка в Android BLE - фильтрация работает только с 16-битным UUID, не полным 128-битным.
См. Проблема с Google 58931