首页 文章

检测BLE设备是否可在Android上连接

提问于
浏览
8

我正在开发一个配置信标的项目 . 通电一段时间后,信标变为不可配置,直到电源循环 . 为了显示可配置信标的列表,我正在查看某些特征(蓝牙设备名称,广告包中的某些制造商数据) . 我还需要知道它是否“可连接”,我 . 即如果设备的BLE通告数据包中的PDU类型指示它是可连接的 . 我已经在Android 4.X和5.X中搜索了高低的Android蓝牙类,并且无法找到能告诉我这些信息的任何内容 .

我意识到确定信标可连接性的一种方法是连接到它,例如 . g . : device.connectGatt(...) . 但是,我已经看到有时需要花费两分钟才能回复 onConnectionStateChange 回来 STATE_DISCONNECTED . 此外,在一个环境中可能存在许多这些信标,并且连接到可能可配置的每个信标将是低效的 .

可以在 advertisementData 回调方法 centralManager:didDiscoverPeripheral:advertisementData:RSSI 中的键 CBAdvertisementDataIsConnectable 下的 advertisementData 字典中找到此属性的iOS等价物 .

因此,问题是:在Android上是否有办法确定BLE设备是否可以与广告数据或扫描结果“连接”或......?

2 回答

  • 7

    UPDATE: 在Android O SDK的最终API中, ScanResult 类(自Android 5.0添加)现在具有 isConnectable() 方法 . 只能在Android 8.0上检测可连接的广告 . 有关详细信息,请参阅此处:https://developer.android.com/reference/android/bluetooth/le/ScanResult.html#isConnectable()

    在Android 8.0之前,遗憾的是它是不可能的 .

    可连接的广告由PDU标头字节0确定 . 您可以在下面的示例结构中看到这一点:

    d6 be 89 8e # Access address for advertising data (this is always the same fixed value)
    40 # Advertising Channel PDU Header byte 0.  Contains: (type = 0), (tx add = 1), (rx add = 0)
    24 # Advertising Channel PDU Header byte 1.  Contains:  (length = total bytes of the advertising payload + 6 bytes for the BLE mac address.)
    05 a2 17 6e 3d 71 # Bluetooth Mac
    

    问题出在Anroid 8.0之前的设备上,Android扫描API无法访问这些标头 . 你在Android 4.x的回调中得到了三个字段:

    onLeScan(BluetoothDevice device, rssi, byte[] scan data)
    

    扫描数据字节数组从上面提到的头字节开始 after . 从我所看到的 BluetoothDevice 定义中,没有一个字段或方法告诉你它是否是一个可连接的广告 - 该类只是蓝牙mac地址的容器,其方法是在蓝牙堆栈上运行功能 . 并且 IBluetooth.aidl 中没有方法可以获得此标志,该方法是蓝牙堆栈的私有接口(以及 BluetoothDevice 调用以获取其信息) .

    看来这些信息不会从Android 8.0之前的BlueDroid堆栈传递到Java层 .

  • 4

    应该可以,因为Nordic的nRF主控制面板就是这样做的 .

    经过一番挖掘后,我想我知道它是如何做到的 . 我不确定这是做正确的方法 .

    我尝试使用LE Advertiser并将设备设置为可连接 . 在Nordic应用程序中,根据scanResult.getFlags()中找到的字节,将设备设置为可连接 .

    我发现此代码适用于我的设备:

    int flags = scanResult.getScanRecord().getAdvertiseFlags();
    if ((flags & 2) == 2) {
      //connectable
    }
    

相关问题