【发布时间】:2018-04-05 19:38:15
【问题描述】:
我正在 Android 上使用 BluetoothLe(最低 API:21+)。目前过滤服务 uuid 的程序可以正常工作,但并不像预期的那样。下面是用于设置基本扫描仪参数的代码段,这是当前工作的。基于 Ble 的其他工作领域(iOS、嵌入式硬件),很明显有能力仅根据 16 位 UUID 分配过滤 Ble 设备。这让我想到了 Android……我意识到 android 对 Ble 及其相当分段的设备生态系统的起步相当艰难,但我看不出 android 如何/为什么不能像其他平台一样遵循与 UUID 类似的路径。由于来自蓝牙 SIG 的所有 UUID 都是 16 位标识符,仅具有 UUID_BASE (00000000-0000-1000-8000-00805F9B34FB) 的定义。
...
// devices UUID service
ParcelUuid parcelUuid = new ParcelUuid(UUID.fromString("1F0E0D0C-0B0A-0909-0807-060504030201"));
// devices UUID service mask
ParcelUuid parcelUuidMask = new ParcelUuid(UUID.fromString("00000D0C-0000-0000-0000-000000000000"));
// Filters and Settings
scanFilter = new ScanFilter.Builder().setServiceUuid(parcelUuid, parcelUuidMask).build();
scanFilterList.add(scanFilter);
scanSettings = new ScanSettings.Builder().setScanMode(ScanSettings.SCAN_MODE_LOW_POWER).build();
// Scanning Started
mBluetoothLeScanner.startScan(scanFilterList, scanSettings, scanCallback);
...
如上所述,我有两个嵌入式硬件设备广播它们自己的两个 UUID 服务,它们彼此非常相似,但不同之处却不少。以下是那些 UUID,在所有帐户中,只有 MSB(Most Signifigant Byte)是它们之间的区别。还有设备名称不同。
Device One:
Service 1 - 1F0E0D0C-0B0A-0909-0807-060504030201
Service 2 - 2F0E0D0C-0B0A-0909-0807-060504030201
Device Two:
Service 1 - EF0E0D0C-0B0A-0909-0807-060504030201
Service 2 - FF0E0D0C-0B0A-0909-0807-060504030201
Common Identifier amongst the UUID's:
0x0D0C
从前面提供的代码段来看,setServiceUuid 方法中使用的 ParcelUuid 似乎需要完全匹配才能使扫描仪甚至返回设备,尽管需要匹配掩码。那么,您如何向驱动程序/硬件请求仅按 16 位标识符而不是完整的 128 位标识符进行过滤?因为我在上面介绍的两个不同设备的模型,每个设备都有自己的服务 UUID,因此无法扫描并返回所有想要或预期的设备。
我觉得我遇到的问题是双重的,但需要解决,因为我似乎无法在任何地方找到答案。我已经搜索了所有论坛帖子的高低,堆栈问题/答案涉及该主题,但它们似乎都没有像我正在寻找的那样弹出。我不确定我对 android 过滤的理解是否有问题,android 是否缺少功能,或者无法在提供的 android 类中找到此类功能。我对如何在软件中实现这个“功能”有一些想法,但它会相当丑陋、耗时且对电池造成负担。一个这样的例子是公开扫描并手动过滤。但我认为在扫描设备时有或应该有支持 128 位和 16 位 UUID 过滤的功能。
谁能帮忙解释一下????
另外,对于这个发布的问题的长度表示歉意......
【问题讨论】:
-
运气好了吗?我也在努力解决这个问题,但到目前为止还没有成功。
标签: java android bluetooth-lowenergy