通过服务数据UUID进行BLE扫描过滤

时间:2019-10-31 12:46:11

标签: android bluetooth-lowenergy beacon

我们拥有带有“服务数据-128位UUID” AD类型的信标数据的设备:0x21。 对于Android扫描,我们正在按MAC地址过滤BLE设备。 很好。

由于我们需要更大的灵活性,因此我们希望按UUID进行过滤。

我的代码仅适用于小米MI9(Android 9)。

它不适用于小米MI A1(Android 9)和华为P10(Android 8)。 (但是当我使用nRF Connect之类的其他应用启动BLE扫描仪时,它可以工作)

任何人都知道如何解决此问题,或者某些电话根本不支持某些类型的过滤?

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 :(得分:0)

掩码不应该全部为零-如果是这样,它将不匹配任何内容。通常应将其设置为如下所示,以便与服务UUID的所有字节匹配:

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

我怀疑您正在使用的全零掩码在某些设备上而不是在其他设备上起作用,因为全零掩码的行为是不确定的。可能会因一个BLE芯片组而异。

大多数现成的移动应用程序不使用扫描过滤器,因此它们不能很好地判断过滤器是否在特定设备上正常工作。

相关问题