我在一个原型中使用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
错误。
问题:
这里是source code of the Android Things app to test BLE pairing and bonding
从Android Things特定元素中剥离的相同代码,在作为外围设备(服务器)的Android手机和作为中心(客户端)的Android设备或iPhone上运行时,可以成功完成BLE配对和绑定。
答案 0 :(得分:0)
通常来说,如果您尝试在配对之前读取加密的GATT特征(这会自动触发配对逻辑),则会导致从读取请求(AUTH_FAIL
)返回GATT错误137。这是因为设备没有足够的时间在蓝牙堆栈发送响应之前完成绑定设置。 重新输入读取请求通常可以成功。
我还没有在iOS客户端设备上对此进行过测试,但是对于连接到Android(事物)外围设备的Android客户端来说,它确实适用。因此,我将推荐一些东西:
让客户端(移动)设备显式启动配对,Android Things应该只对BluetoothPairingCallback
中的这些传入请求做出反应。这样,移动设备可以根据报告的IoT设备功能来决定配对类型。
将配对流程与GATT流程分开。与尝试读取特征的任何尝试分开配对至发现的设备。这往往是避免计时问题的最佳方法。
关于功能选择,这取决于您的设备。以我的经验,如果您选择IO_CAPABILITY_NONE
,则会在PAIRING_VARIANT_CONSENT
内产生onPairingInitiated()
,一旦调用finishPairing()
,配对操作就会成功。如果您要调整功能,则应该准备好各种变体,要求您显示PIN以便移动设备输入。我还没有亲自测试这些路径。