我正在尝试扫描BLE设备并仅使用我的设备UUID过滤结果。
我使用了here
中的Google示例代码找到设备并列出它们。
但是当我尝试通过我的UUID进行过滤时,方法device.getUuids()始终返回null,而不是返回带有设备的UUID的有效数组。
private BluetoothAdapter.LeScanCallback mLeScanCallback =
new BluetoothAdapter.LeScanCallback() {
@Override
public void onLeScan(final BluetoothDevice device, int rssi, byte[] scanRecord) {
runOnUiThread(new Runnable() {
@Override
public void run() {
List<String> uuids = new ArrayList<String>();
uuids.add("MY_VALID_UID");
ParcelUuid[] deviceUuids = device.getUuids();
// this if is never exeuted device deviceUuids is always null.
if (deviceUuids != null) {
for (ParcelUuid uuid : device.getUuids()) {
if (uuids.contains(uuid.toString())) {
mLeDeviceListAdapter.addDevice(device);
mLeDeviceListAdapter.notifyDataSetChanged();
}
}
}
}
});
}
};
我还尝试将我的uuids作为过滤器传递给startLEScan方法,如下所示,但没有返回任何结果。
String s = "MY_UUID";
String s2 = s.replace("-", "");
UUID uuid = new UUID(
new BigInteger(s2.substring(0, 16), 16).longValue(),
new BigInteger(s2.substring(16), 16).longValue());
System.out.println(uuid);
UUID[] uuids = {uuid};
mBluetoothAdapter.startLeScan(uuids, mLeScanCallback);
OR
UUID.fromString("MY UUID");
A
答案 0 :(得分:2)
中央应用程序有两种方式来了解信标支持的服务UUID。
一种方法是从信标发出的广告包中提取信息。但是,如果信标不发出此类数据包(例如AD类型为0x03的数据包),则中央应用程序无法通过这种方式获取有关服务UUID的信息。
另一种方法是连接目标信标并明确要求有关信标支持的服务UUID的信息。
JavaDoc of getUuids()方法说明如下:
此方法不会启动服务发现过程以从远程设备检索UUID。而是返回服务UUID的本地缓存副本。
因此,(1)如果信标不发出包含服务UUID信息的数据包,(2)如果您没有要求信标返回有关服务UUID的信息(例如,如果您没有执行'服务发现') ,getUuids()返回null。