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

Seb*_*ien 5 android bluetooth-lowenergy beacon

我们的设备使用 \xc2\xabService 数据发送信标数据 - 128 位 UUID\xc2\xbb AD 类型:0x21。\n对于 Android 扫描,我们通过 MAC 地址过滤 BLE 设备。\n效果很好。

\n\n

因为我们需要更大的灵活性,所以我们想通过 UUID 进行过滤。

\n\n

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

\n\n

它不适用于小米 MI A1 (Android 9) 和华为 P10 (Android 8)。\n(但当我使用其他应用程序(例如 nRF Connect)启动 BLE 扫描仪时它可以工作)

\n\n

任何人都知道如何解决这个问题,或者某些手机根本不支持某些类型的过滤?

\n\n
static final UUID SERVICE_DATA_UUID = UUID.fromString("00010001-0000-1000-8000-112233445566");\n\nbyte[] setServiceData = new byte[] {\n        0x11\n};\n\nfilters = new ArrayList<>();\nScanFilter.Builder builder = new ScanFilter.Builder()\n        .setServiceData(new ParcelUuid(SERVICE_DATA_UUID), setServiceData);\n        //.setDeviceAddress(Globals.MAC[1]);\n        filters.add(builder.build());\n\nmBluetoothLeScanner.startScan(filters, settings, mLeScanCallback);\n
Run Code Online (Sandbox Code Playgroud)\n\n

Logcat 工作时(MI9 或当我并行激活 nRF 时)

\n\n
D/Constraints: ScanRecord [mAdvertiseFlags=2, mServiceUuids=null, mServiceSolicitationUuids=null, mManufacturerSpecificData={}, mServiceData={00020001-0000-1000-8000-112233445566=[17]}, mTxPowerLevel=-2147483648, mDeviceName=null]\n
Run Code Online (Sandbox Code Playgroud)\n

dav*_*ung 2

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

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

我怀疑您使用的全零掩码适用于某些设备,而不适用于其他设备,因为全零掩码的行为是不确定的。不同 BLE 芯片组的情况可能有所不同。

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