Android,如何正确扫描和过滤ble UUID

时间:2017-04-28 19:03:17

标签: java android bluetooth-lowenergy

我在Android上使用BluetoothLe(最小API:21+)。目前过滤服务uuid​​的工作程序,但不完全符合预期。下面是用于设置基本扫描仪参数的代码段,这是目前的工作原理。基于Ble(iOS,嵌入式硬件)的其他工作领域,很明显有能力仅根据16位UUID分配过滤Ble设备。这让我想到了Android ......我意识到Android对Ble及其相当分散的设备生态系统有一个相当粗略的开始,但我没有看到如何/为什么android无法像其他平台一样跟随UUID的类似路径。由于所有来自Bluetooth 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(最有意义的字节)是它们之间的区别。设备名称也不同。

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位AND 16位UUID过滤。

任何人都可以帮助阐明这个????

另外,对这个已发布的问题的长度表示道歉......

3 个答案:

答案 0 :(得分:0)

我不确定你想要过滤什么,但如果你只是想应用过滤器???? 0D0C - ???? - ???? - ???? - ???? ????????,你应该将parcelUuid设置为00000D0C-0000-0000-0000-000000000000,并将parcelUuidMask设置为0000FFFF-0000-0000-0000-000000000000。

答案 1 :(得分:0)

你应该根据MAC地址过滤BLE,它们像魅力一样过滤,如果你找到了UUID过滤的解决方案,请分享。

答案 2 :(得分:0)

掩码我应该是相反的 - 使用1来表示要包含的位,使用0来表示应该被忽略的那些。

filter:  1F0E0D0C-0B0A-0909-0807-060504030201
mask:    0000FFFF-0000-0000-0000-000000000000

结果是包含任何具有'0D0C'的设备。你可能想要一个“更紧密”的过滤器,其中有更多相似之处。