Фильтр сканирования BLE по UUID служебных данных - PullRequest
0 голосов
/ 31 октября 2019

У нас есть устройства, которые передают данные с типом AD «Сервисные данные - 128-битный UUID»: 0x21. Для сканирования Android мы фильтруем устройство BLE по MAC-адресам. Это работает нормально.

Поскольку нам нужна большая гибкость, мы хотим фильтровать по UUID.

Мой код работает нормально только с Xiaomi MI9 (Android 9).

Это нене работает на Xiaomi MI A1 (Android 9) и Huawei P10 (Android 8). (Но он работает, когда я запускаю сканер BLE с другим приложением, например, nRF Connect)

Кто-нибудь знает, как решить эту проблему, или некоторые телефоны просто не поддерживают определенные типы фильтрации?

static final UUID SERVICE_DATA_UUID = UUID.fromString("00010001-0000-1000-8000-112233445566");

byte[] setServiceData = new byte[] {
        0x11
};

filters = new ArrayList<>();
ScanFilter.Builder builder = new ScanFilter.Builder()
        .setServiceData(new ParcelUuid(SERVICE_DATA_UUID), setServiceData);
        //.setDeviceAddress(Globals.MAC[1]);
        filters.add(builder.build());

mBluetoothLeScanner.startScan(filters, settings, mLeScanCallback);

Logcat, когда он работает (MI9 или когда я активирую nRF параллельно)

D/Constraints: ScanRecord [mAdvertiseFlags=2, mServiceUuids=null, mServiceSolicitationUuids=null, mManufacturerSpecificData={}, mServiceData={00020001-0000-1000-8000-112233445566=[17]}, mTxPowerLevel=-2147483648, mDeviceName=null]

1 Ответ

0 голосов
/ 31 октября 2019

Маска не должна быть полностью нулевой - в таком случае она не будет ничего совпадать. Как правило, он должен быть установлен примерно так, как показано ниже, чтобы он совпадал со всеми байтами UUID службы:

 String serviceUuidMaskString = "FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF";
 ParcelUuid parcelUuidMask = ParcelUuid.fromString(serviceUuidMaskString);
 builder.setServiceUuid(new ParcelUuid(SERVICE_DATA_UUID), parcelUuidMask);

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

Большинство готовых мобильных приложений не используют фильтры сканирования, поэтому они не могут судить о том, работают ли фильтры на конкретном устройстве.

...