因此,我可以在正常情況下連接到BLE設備。我想要做的是處理異常情況,比如當連接到設備失敗或建立的連接丟失(也許它被拋出懸崖或被總線擊中)Android:捕獲BLE連接失敗/斷開連接?
我正在使用CyPress BLE模塊測試這個,我正在做的一個測試是從模塊中去掉電源。但是,onConnectionStateChange永遠不會被調用!我所見過的所有迴應都是成功的關係。它會花費數小時嘗試連接,並永不放棄。我會延遲取消連接嘗試,但是沒有辦法取消BluetoothDevice上的連接嘗試(我知道)!據我所知,它會繼續嘗試,直到電池耗盡。
下面是我的onConnectionStateChange現在在Gatt Callback中的外觀。請注意,我試圖捕捉並記錄任何類型的回調,涉及任何類型的連接狀態更改......永遠不會被調用,除非連接成功。請注意,這是代碼不在活動本身。它在一個由單身人士持有的對象中。 (我想維護多個活動連接)
@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裝置。那麼對話永遠不會消失,因爲事件「連接失敗」永遠不會被拋出。
我的擔心,雖然是你只有BluetoothDevice並呼籲連接的時間段。沒有BluetoothGatt可以撥打斷開連接。在經過長時間的「嘗試連接到設備」後,沒有調用onConnectionStateChange,並且如果連續嘗試時間過長,我發現沒有明顯的方法取消連接嘗試,這讓我擔心如果嘗試連接到不同的設備通過開始與它連接,這個先前與其他設備的連接嘗試可能最終也會通過! –