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