mha*_*per 8 android bluetooth-lowenergy
我正在开发一个配置信标的项目.通电一段时间后,信标变为不可配置,直到电源循环.为了显示可配置信标的列表,我正在查看某些特征(蓝牙设备名称,广告包中的某些制造商数据).我还需要知道它是否是"可连接的",即设备的BLE通告数据包中的PDU类型是否表明它是可连接的.我已经在Android 4.X和5.X中搜索了高低的Android蓝牙类,并且无法找到能告诉我这些信息的任何内容.
我意识到确定信标可连接性的一种方法是连接到它,例如:device.connectGatt(...).但是,我已经看到有时需要花费两分钟才能onConnectionStateChange回复STATE_DISCONNECTED.此外,在一个环境中可能存在许多这些信标,并且连接到可能可配置的每个信标将是低效的.
可以在回调方法中advertisementData的键下的字典中找到此属性的iOS等效项.CBAdvertisementDataIsConnectableCBCentralManagerDelegatecentralManager:didDiscoverPeripheral:advertisementData:RSSI
因此,问题是:在Android上是否有办法确定BLE设备是否可以与广告数据或扫描结果"连接"或......?
更新:作为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
Run Code Online (Sandbox Code Playgroud)
问题出在Anroid 8.0之前的设备上,Android扫描API无法访问这些标头.你在Android 4.x的回调中得到了三个字段:
onLeScan(BluetoothDevice device, rssi, byte[] scan data)
Run Code Online (Sandbox Code Playgroud)
扫描数据字节数组在上述头字节之后开始.从我所看到的BluetoothDevice定义来看,没有任何字段或方法告诉你它是否是一个可连接的广告 - 该类只是蓝牙mac地址的容器,具有在蓝牙堆栈上运行功能的方法.并且没有IBluetooth.aidl哪种方法BluetoothDevice可以获得蓝旗堆栈的私有接口(以及获取其信息的调用).
看来这些信息不会从Android 8.0之前的BlueDroid堆栈传递到Java层.
| 归档时间: |
|
| 查看次数: |
4919 次 |
| 最近记录: |