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过滤但不完全直截了当
过滤可能会在“服务 UUID”AD 类型广告结构中查找服务 UUID。这实际上是有道理的,这就是它应该如何运作。
对于信标,您尝试查找的 UUID 实际上位于“制造商特定数据”AD 类型结构中。没有人关心在那里寻找服务 UUID。
我认为服务 UUID 过滤仅用于过滤GATT 数据库中服务的 UUID ;这些 UUID 的位置将如我在第一段中所解释的那样。
信标中的 UUID 本身并不是服务UUID。它是一个具有 UUID 格式的信标标识符。
| 归档时间: |
|
| 查看次数: |
6563 次 |
| 最近记录: |