【问题标题】:Android, How to properly scan and filter ble UUID'sAndroid,如何正确扫描和过滤 ble UUID
【发布时间】: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


【解决方案1】:

掩码 i 应该相反 - 使用 1 表示要包含的位,使用 0 表示应该忽略的位。

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

结果是包含任何具有“0D0C”的设备。您可能需要一个“更严格”的过滤器,其中包含更多相似之处。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我试过这个没有运气...... onScanResult 永远不会返回。
    • 您的广告数据和扫描响应究竟如何?
    • ScanResult{mDevice=F5:00:00:05:70:83, mScanRecord=ScanRecord [mAdvertiseFlags=6, mServiceUuids=[1f0e0d0c-0b0a-0909-0807-060504030201], mManufacturerSpecificData={} , mServiceData={}, mTxPowerLevel=-2147483648, mDeviceName=BLUE], mRssi=-38, mTimestampNanos=624459810326031}
    • 不确定如何从 android studio 中的设备获取所有广告数据。以上是根据回调给出的结果从调试器复制粘贴。
    • 嗯,根据应该可以工作的文档...您尝试过其他 Android 设备吗?
    【解决方案3】:

    您应该根据 MA​​C 地址过滤 BLE,它们过滤就像一个魅力,也许如果您找到了 UUID 过滤的解决方案,请分享。

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多