蓝牙LE扫描滤镜无法正常工作

Ali*_*and 8 android bluetooth-lowenergy

我想在我的Android代码中仅扫描具有特定UUID的BLE信标.即使我可以为特定的MAC地址添加过滤器,但我无法使其与UUID一起使用.永远不会调用onScanResult函数.为什么会这样?我正在使用API​​ 21,我没有收到任何项目错误.

final String tagUUID = "01122334-4556-6778-899a-abbccddeeff0";

//does not work
ScanFilter filter = new ScanFilter.Builder().setServiceUuid(new ParcelUuid(UUID.fromString(tagUUID))).build();

//works
ScanFilter filter = new ScanFilter.Builder().setDeviceAddress(tagMAC).build();
Run Code Online (Sandbox Code Playgroud)

小智 9

我是上面提到的博客文章的作者.以下是解决Android 21+问题的方法.

// Empty data
byte[] manData = new byte[]{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

// Data Mask
byte[] mask = new byte[]{0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0};

// Copy UUID into data array and remove all "-"
System.arraycopy(hexStringToByteArray("YOUR_UUID_TO_FILTER".replace("-","")), 0, manData, 2, 16);

// Add data array to filters
ScanFilter filter = new ScanFilter.Builder().setManufacturerData(76, manData, mask).build());

public static byte[] hexStringToByteArray(String s) {
    int len = s.length();
    byte[] data = new byte[len / 2];
    for (int i = 0; i < len; i += 2) {
        data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
                + Character.digit(s.charAt(i+1), 16));
    }
    return data;
}
Run Code Online (Sandbox Code Playgroud)

这里的问题是你可以添加UUID过滤但不完全直截了当


Bog*_*dru 4

过滤可能会在“服务 UUID”AD 类型广告结构中查找服务 UUID。这实际上是有道理的,这就是它应该如何运作。

对于信标,您尝试查找的 UUID 实际上位于“制造商特定数据”AD 类型结构中。没有人关心在那里寻找服务 UUID

我认为服务 UUID 过滤仅用于过滤GATT 数据库中服务的 UUID ;这些 UUID 的位置将如我在第一段中所解释的那样。

信标中的 UUID 本身并不是服务UUID。它是一个具有 UUID 格式的信标标识符。