我在原型中使用Android Things 1.0.4,它充当BLE外围设备:广告服务和运行GATT服务器 .
在尝试绑定Android Things板(Raspberry Pi 3)和智能手机时,我在BLE配对过程中遇到了一个问题 .
由于设备没有显示,我使用BluetoothConfigManager设置:
IoCapability = BluetoothConfigManager.IO_CAPABILITY_NONE
每次都会导致错误 AUTH_FAILED
.
代替,
IoCapability = BluetoothConfigManager.IO_CAPABILITY_OUT
记录配对键并提示智能手机在配对期间输入它,但会导致 REMOVED
错误 .
问题:
-
Android的外围角色是否能够处理BLE配对?
-
在应用程序的代码中是否还需要实现更多功能来复制完整的Android逻辑?
这是source code of the Android Things app to test BLE pairing and bonding
从Android Things特定元素中剥离的相同代码在作为外围设备(服务器)的Android手机上运行时成功完成BLE配对和绑定,并且作为中心(客户端)安装Android设备或iPhone .
1 回答
一般来说,如果您在配对之前尝试读取加密的GATT特性(自动触发配对逻辑),则会导致读取请求(
AUTH_FAIL
)返回GATT错误137 . 这是因为在蓝牙堆栈发送响应之前,设备没有足够的时间完成绑定设置 . Retying the read request again generally succeeds.我没有使用iOS客户端设备对此进行测试,但对于连接到Android(Things)外围设备的Android客户端,它确实适用 . 因此,我会建议一些事情:
让客户端(移动)设备明确启动配对,Android Things应该只对
BluetoothPairingCallback
中的这些传入请求作出反应 . 这使得移动设备基于所报告的IoT设备的能力来决定配对类型 .将配对流程与GATT流程分开 . 与发现的设备分开配对,不做任何尝试读取特征 . 这往往是避免计时问题的最佳方法 .
关于功能选择,这取决于您的设备 . 根据我的经验,如果选择
IO_CAPABILITY_NONE
,这将导致onPairingInitiated()
内的PAIRING_VARIANT_CONSENT
,并且一旦调用了finishPairing()
,配对操作就会成功 . 如果您调整功能,则应准备好任何数量的变体,要求您显示移动设备输入的PIN . 我还没有亲自测试过这些路径 .