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

时间:2015-04-16 02:26:05

标签: 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();

2 个答案:

答案 0 :(得分:8)

我是上述博文的作者。以下是解决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;
}

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

答案 1 :(得分:2)

过滤可能会在&#34;服务UUID&#34;中查找服务UUID。广告类型广告结构。这实际上是有意义的,以及它应该如何运作。

对于信标,您要查找的UUID实际上位于&#34;制造商特定数据&#34; AD类型结构。并且没有人关心在那里寻找服务UUID

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

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