在我的Nexus7上使用android 4.4 BLE API,我能够成功地与外围BLE设备进行交互 - 连接,断开连接,读取,写入....
但是,如果活动连接因任何原因而中断(在这种情况下,外围设备被重置),我会观察到以下行为....
-
我的外围设备(按设计)在任何活动连接终止后(无论出于何种原因)开始做广告;我可以通过我的蓝牙数据包嗅探器看到这个....
-
我在我的Android应用程序中按预期收到onConnectionStateChanged回调,此时我在我的活动BluetoothGatt实例上调用close();这是我在客户端发起的“正常”断开连接时遵循的相同程序...
-
之后不久,android BLE堆栈尝试重新连接到同一个外设;通过数据包嗅探器,我可以看到BLE连接请求通过空中传播...
但是,我的应用程序没有启动此重新连接;事实上,我看不到任何蓝牙日志中的信息表明这甚至发生了!
在BLE堆栈中是否有一些“模式”,它会尝试自动重新 Build 已断开的连接?
谢谢....
2 回答
无论
autoConnect
标志设置为false还是true,都会在各种Android手机上发生这种情况 .还没有找到一个完整的解决方案,似乎Android BLE堆栈一旦再次获得广告信号就会自发地重新启动连接,只是忽略它是故意断开的应用程序...
部分解决方案可能涉及不使用
BluetoothGatt.connect()
方法,如下所述:https://stackoverflow.com/a/23749770/4144487
因此,示例连接方法可能如下所示:
为了解释这个问题的重要性,当它发生时,外设认为它是连接的,我的“真正的”应用程序再也找不到了 . 在某些手机如Galaxy S3和Redmi note 3中,我发现从通知栏关闭蓝牙开关是“释放”外围设备并允许我发现设备 . 在像Nexus 5x这样的其他产品中,只有手机重启才能解决问题 .
如果您在调用
BluetoothGatt#connectGatt()
时使用autoConnect=true
,我发现这种情况正在发生 . 通常我发现最好使用autoConnect=false
,但是对于某些设备,除非你使用true
,否则你根本无法连接,所以我通常都会这样做 . 我首先尝试false
然后如果失败则使用true
然后你描述的行为就是你必须解决的问题 .