我正在开发一个配置信标的项目 . 通电一段时间后,信标变为不可配置,直到电源循环 . 为了显示可配置信标的列表,我正在查看某些特征(蓝牙设备名称,广告包中的某些制造商数据) . 我还需要知道它是否“可连接”,我 . 即如果设备的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 回答
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确定 . 您可以在下面的示例结构中看到这一点:
问题出在Anroid 8.0之前的设备上,Android扫描API无法访问这些标头 . 你在Android 4.x的回调中得到了三个字段:
扫描数据字节数组从上面提到的头字节开始 after . 从我所看到的
BluetoothDevice
定义中,没有一个字段或方法告诉你它是否是一个可连接的广告 - 该类只是蓝牙mac地址的容器,其方法是在蓝牙堆栈上运行功能 . 并且IBluetooth.aidl
中没有方法可以获得此标志,该方法是蓝牙堆栈的私有接口(以及BluetoothDevice
调用以获取其信息) .看来这些信息不会从Android 8.0之前的BlueDroid堆栈传递到Java层 .
应该可以,因为Nordic的nRF主控制面板就是这样做的 .
经过一番挖掘后,我想我知道它是如何做到的 . 我不确定这是做正确的方法 .
我尝试使用LE Advertiser并将设备设置为可连接 . 在Nordic应用程序中,根据scanResult.getFlags()中找到的字节,将设备设置为可连接 .
我发现此代码适用于我的设备: