我想在我的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();
答案 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格式的信标标识符。