因此,在正常情况下,我能够很好地连接到 BLE 设备。我想做的是处理异常情况,比如当与设备的连接失败或已建立的连接丢失时(可能它被扔下悬崖或被公共(public)汽车撞了)
我正在使用 CyPress BLE 模块对此进行测试,我正在进行的其中一项测试是断开模块的电源。但是,onConnectionStateChange
永远不会被调用!我所看到的所有响应都是成功的连接。它会花费数小时尝试连接并且从不明显放弃。我会延迟取消连接尝试,但无法取消蓝牙设备(据我所知)的连接尝试!据我所知,它会一直尝试直到电池电量耗尽。
这是我的 onConnectionStateChange
现在在 Gatt 回调中的样子。请注意,我正在 try catch 并记录涉及任何类型的连接状态更改的任何类型的回调......除非连接成功,否则永远不会被调用。请注意,这是代码不在 Activity 本身上。它在一个由单例持有的对象中。 (我想保持跨多个 Activity 的连接)
@Override
public void onConnectionStateChange(BluetoothGatt gatt, int status, int newState) {
mGatt = gatt;
Logy.CallPrint(LOGY_ENABLE, CLASSNAME, "Status: "+status+ " Newstate: "+newState);
switch(status)
{
case BluetoothGatt.GATT_SUCCESS:
mReconnectAttempts = MAX_ATTEMPTS;
if(newState == BluetoothGatt.STATE_CONNECTED)
{
DispatchEvent(Event.Type.BT_ON_CONNECT);
bIsConnected = true;
gatt.discoverServices();
} else if (newState == BluetoothGatt.STATE_DISCONNECTED)
{
DispatchEvent(Event.Type.BT_ON_DISCONNECT);
bIsConnected = false;
}
break;
default:
if(newState == BluetoothGatt.STATE_DISCONNECTED)
{
bIsConnected = false;
if(mReconnectAttempts > 0)
{ // if we have attempts left, auto attempt to reconnect
DispatchEvent(Event.Type.BT_RECONNECTING);
mReconnectAttempts--;
gatt.connect();
bIsConnected = false;
}
else
{
mReconnectAttempts = MAX_ATTEMPTS;
DispatchEvent(Event.Type.BT_ON_CONNECT_FAIL);
bIsConnected = false;
}
} else {
Logy.CallPrint(LOGY_ENABLE, CLASSNAME, "onConnectionStateChange: Failed?");
}
}
super.onConnectionStateChange(gatt, status, newState);
}
无法检测断开连接是我代码中其他地方的一个问题,例如我在其中显示一个进度对话框,指示应用程序正在连接到 BLE 设备。好吧,该对话框永远不会消失,因为永远不会抛出“On Connect Fail”事件。
最佳答案
我想你要找的是Bluetooth Supervision timeout
这是根据 Bluetooth LE specifications :
a parameter that defines the maximum time between two received Data Packet PDUs before the connection is considered lost
默认 Supervision timeoout
在 Android 上设置为 20 秒(取决于 Android 版本和设备)。例如,here是 Supervision Timeout
的值在 Android 5.1 上。
没有用于设置此参数的 API,因此您必须等待 20 秒(取决于您的 Android 版本和设备)才能获取 onConnectionStateChange
回调状态 BluetoothGatt.STATE_DISCONNECTED
关闭 BLE 模块后
关于Android:捕获 BLE 连接失败/断开连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38666462/