![](/img/trans.png)
[英]Android BLE is NOT connecting again after BLE device timeout [Using RxAndroidBle ]
[英]BLE-device stops connecting with Android after working flawlessly for weeks
我有一台配備 Blue Gecko BLE 的設備,在各種 Android 手機和平板電腦上一切似乎都運行良好:連接、數據傳輸和斷開連接后重新連接。 注意:我們不配對我們剛剛連接的設備,我們不使用自動連接。
現在的問題是:有時使用某些設備 - 電話設置連接在工作數周后停止運行。 我不知道它何時或為什么會發生,但在那之后,不可能使用之前完美運行的同一部手機重新連接設備。 該設備在其他手機上仍然可以正常工作。 並且手機可以與其他設備配合使用。 我們嘗試了各種技巧:重啟手機、卸載並重新安裝應用程序、重置設備。 這些都不起作用。 我們能夠重新連接的唯一方法是從手機設置中刪除藍牙數據(重置網絡和藍牙或只是從手機的應用程序設置中刪除藍牙數據)。 這是什么原因,我們如何解決這個問題? 有任何想法嗎?
線索:從手機上看btsnoop_hci.log,似乎當連接開始失敗時,對“Sent LE Create Connection”的響應是“Command disallowed”。
查看 logcat,我看到“Got status 133 and state 0”導致我們的應用程序中的藍牙重置。
連接狀態檢查每 5 秒完成一次,然后重新連接......如果需要的話。
出現問題時,無法使用同一部手機與其他應用程序建立連接。 這就像設備被列入黑名單,可以通過刪除藍牙數據清除。
我希望有人能夠幫助解決這個問題。 提前致謝!
編輯:我被要求提供一些 HCI LOG,所以在這里。 幀 28305 和 28309 具有創建連接命令,而幀 28306 和 28310 具有狀態響應:“Command Disallowed (0x0c)”
No. Time Arrival Time Destination Info Protocol BD_ADDR Destination Source Unexpected event Initiator Filter Policy
28304 93430.042972 Aug 12, 2018 13:39:19.747836000 FLE Daylight Time host Rcvd Command Complete (LE Add Device To White List) HCI_EVT
Frame 28304: 7 bytes on wire (56 bits), 7 bytes captured (56 bits)
Encapsulation type: Bluetooth H4 with linux header (99)
Arrival Time: Aug 12, 2018 13:39:19.747836000 FLE Daylight Time
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1534070359.747836000 seconds
[Time delta from previous captured frame: 0.000870000 seconds]
[Time delta from previous displayed frame: 0.000000000 seconds]
[Time since reference or first frame: 93430.042972000 seconds]
Frame Number: 28304
Frame Length: 7 bytes (56 bits)
Capture Length: 7 bytes (56 bits)
[Frame is marked: False]
[Frame is ignored: False]
Point-to-Point Direction: Received (1)
[Protocols in frame: bluetooth:hci_h4:bthci_evt]
Bluetooth
[Source: controller]
[Destination: host]
Bluetooth HCI H4
[Direction: Rcvd (0x01)]
HCI Packet Type: HCI Event (0x04)
Bluetooth HCI Event - Command Complete
Event Code: Command Complete (0x0e)
Parameter Total Length: 4
Number of Allowed Command Packets: 1
Command Opcode: LE Add Device To White List (0x2011)
0010 00.. .... .... = Opcode Group Field: LE Controller Commands (0x08)
.... ..00 0001 0001 = Opcode Command Field: LE Add Device To White List (0x011)
Status: Success (0x00)
[Command in frame: 28303]
[Command-Response Delta: 0.87ms]
No. Time Arrival Time Destination Info Protocol BD_ADDR Destination Source Unexpected event Initiator Filter Policy
28305 93430.043242 Aug 12, 2018 13:39:19.748106000 FLE Daylight Time controller Sent LE Create Connection HCI_CMD Use White List. Ignore Peer Address
Frame 28305: 29 bytes on wire (232 bits), 29 bytes captured (232 bits)
Encapsulation type: Bluetooth H4 with linux header (99)
Arrival Time: Aug 12, 2018 13:39:19.748106000 FLE Daylight Time
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1534070359.748106000 seconds
[Time delta from previous captured frame: 0.000270000 seconds]
[Time delta from previous displayed frame: 0.000270000 seconds]
[Time since reference or first frame: 93430.043242000 seconds]
Frame Number: 28305
Frame Length: 29 bytes (232 bits)
Capture Length: 29 bytes (232 bits)
[Frame is marked: False]
[Frame is ignored: False]
Point-to-Point Direction: Sent (0)
[Protocols in frame: bluetooth:hci_h4:bthci_cmd]
[Coloring Rule Name: ___conversation_color_filter___06]
[Coloring Rule String: bthci_cmd.opcode == 0x200d]
Bluetooth
[Source: host]
[Destination: controller]
Bluetooth HCI H4
[Direction: Sent (0x00)]
HCI Packet Type: HCI Command (0x01)
Bluetooth HCI Command - LE Create Connection
Command Opcode: LE Create Connection (0x200d)
0010 00.. .... .... = Opcode Group Field: LE Controller Commands (0x08)
.... ..00 0000 1101 = Opcode Command Field: LE Create Connection (0x00d)
Parameter Total Length: 25
Scan Interval: 2048 (1280 msec)
Scan Window: 128 (80 msec)
Initiator Filter Policy: Use White List. Ignore Peer Address (0x01)
Peer Address Type: Public Device Address (0x00)
BD_ADDR: 00:00:00_00:00:00 (00:00:00:00:00:00)
Own Address Type: Random Device Address (0x01)
Connection Interval Min: 24 (30 msec)
Connection Interval Max: 40 (50 msec)
Connection Latency: 0 (number events)
Supervision Timeout: 2000 (20 sec)
Min CE Length: 0 (0 msec)
Max CE Length: 0 (0 msec)
[Response in frame: 28306]
[Command-Response Delta: 0.607ms]
No. Time Arrival Time Destination Info Protocol BD_ADDR Destination Source Unexpected event Initiator Filter Policy
28306 93430.043849 Aug 12, 2018 13:39:19.748713000 FLE Daylight Time host Rcvd Command Status (LE Create Connection) HCI_EVT
Frame 28306: 7 bytes on wire (56 bits), 7 bytes captured (56 bits)
Encapsulation type: Bluetooth H4 with linux header (99)
Arrival Time: Aug 12, 2018 13:39:19.748713000 FLE Daylight Time
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1534070359.748713000 seconds
[Time delta from previous captured frame: 0.000607000 seconds]
[Time delta from previous displayed frame: 0.000607000 seconds]
[Time since reference or first frame: 93430.043849000 seconds]
Frame Number: 28306
Frame Length: 7 bytes (56 bits)
Capture Length: 7 bytes (56 bits)
[Frame is marked: False]
[Frame is ignored: False]
Point-to-Point Direction: Received (1)
[Protocols in frame: bluetooth:hci_h4:bthci_evt]
[Coloring Rule Name: ___conversation_color_filter___01]
[Coloring Rule String: bthci_evt.status == 0x0c]
Bluetooth
[Source: controller]
[Destination: host]
Bluetooth HCI H4
[Direction: Rcvd (0x01)]
HCI Packet Type: HCI Event (0x04)
Bluetooth HCI Event - Command Status
Event Code: Command Status (0x0f)
Parameter Total Length: 4
Status: Command Disallowed (0x0c)
Number of Allowed Command Packets: 1
Command Opcode: LE Create Connection (0x200d)
0010 00.. .... .... = Opcode Group Field: LE Controller Commands (0x08)
.... ..00 0000 1101 = Opcode Command Field: LE Create Connection (0x00d)
[Command in frame: 28305]
[Command-Response Delta: 0.607ms]
No. Time Arrival Time Destination Info Protocol BD_ADDR Destination Source Unexpected event Initiator Filter Policy
28307 93430.044054 Aug 12, 2018 13:39:19.748918000 FLE Daylight Time controller Sent LE Create Connection Cancel HCI_CMD
Frame 28307: 4 bytes on wire (32 bits), 4 bytes captured (32 bits)
Encapsulation type: Bluetooth H4 with linux header (99)
Arrival Time: Aug 12, 2018 13:39:19.748918000 FLE Daylight Time
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1534070359.748918000 seconds
[Time delta from previous captured frame: 0.000205000 seconds]
[Time delta from previous displayed frame: 0.000205000 seconds]
[Time since reference or first frame: 93430.044054000 seconds]
Frame Number: 28307
Frame Length: 4 bytes (32 bits)
Capture Length: 4 bytes (32 bits)
[Frame is marked: False]
[Frame is ignored: False]
Point-to-Point Direction: Sent (0)
[Protocols in frame: bluetooth:hci_h4:bthci_cmd]
Bluetooth
[Source: host]
[Destination: controller]
Bluetooth HCI H4
[Direction: Sent (0x00)]
HCI Packet Type: HCI Command (0x01)
Bluetooth HCI Command - LE Create Connection Cancel
Command Opcode: LE Create Connection Cancel (0x200e)
0010 00.. .... .... = Opcode Group Field: LE Controller Commands (0x08)
.... ..00 0000 1110 = Opcode Command Field: LE Create Connection Cancel (0x00e)
Parameter Total Length: 0
[Response in frame: 28308]
[Command-Response Delta: 2.721ms]
No. Time Arrival Time Destination Info Protocol BD_ADDR Destination Source Unexpected event Initiator Filter Policy
28308 93430.046775 Aug 12, 2018 13:39:19.751639000 FLE Daylight Time host Rcvd Command Complete (LE Create Connection Cancel) HCI_EVT
Frame 28308: 7 bytes on wire (56 bits), 7 bytes captured (56 bits)
Encapsulation type: Bluetooth H4 with linux header (99)
Arrival Time: Aug 12, 2018 13:39:19.751639000 FLE Daylight Time
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1534070359.751639000 seconds
[Time delta from previous captured frame: 0.002721000 seconds]
[Time delta from previous displayed frame: 0.002721000 seconds]
[Time since reference or first frame: 93430.046775000 seconds]
Frame Number: 28308
Frame Length: 7 bytes (56 bits)
Capture Length: 7 bytes (56 bits)
[Frame is marked: False]
[Frame is ignored: False]
Point-to-Point Direction: Received (1)
[Protocols in frame: bluetooth:hci_h4:bthci_evt]
[Coloring Rule Name: ___conversation_color_filter___01]
[Coloring Rule String: bthci_evt.status == 0x0c]
Bluetooth
[Source: controller]
[Destination: host]
Bluetooth HCI H4
[Direction: Rcvd (0x01)]
HCI Packet Type: HCI Event (0x04)
Bluetooth HCI Event - Command Complete
Event Code: Command Complete (0x0e)
Parameter Total Length: 4
Number of Allowed Command Packets: 1
Command Opcode: LE Create Connection Cancel (0x200e)
0010 00.. .... .... = Opcode Group Field: LE Controller Commands (0x08)
.... ..00 0000 1110 = Opcode Command Field: LE Create Connection Cancel (0x00e)
Status: Command Disallowed (0x0c)
[Command in frame: 28307]
[Command-Response Delta: 2.721ms]
No. Time Arrival Time Destination Info Protocol BD_ADDR Destination Source Unexpected event Initiator Filter Policy
28309 93434.163337 Aug 12, 2018 13:39:23.868201000 FLE Daylight Time controller Sent LE Create Connection HCI_CMD Use Peer Address
Frame 28309: 29 bytes on wire (232 bits), 29 bytes captured (232 bits)
Encapsulation type: Bluetooth H4 with linux header (99)
Arrival Time: Aug 12, 2018 13:39:23.868201000 FLE Daylight Time
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1534070363.868201000 seconds
[Time delta from previous captured frame: 4.116562000 seconds]
[Time delta from previous displayed frame: 4.116562000 seconds]
[Time since reference or first frame: 93434.163337000 seconds]
Frame Number: 28309
Frame Length: 29 bytes (232 bits)
Capture Length: 29 bytes (232 bits)
[Frame is marked: False]
[Frame is ignored: False]
Point-to-Point Direction: Sent (0)
[Protocols in frame: bluetooth:hci_h4:bthci_cmd]
[Coloring Rule Name: ___conversation_color_filter___06]
[Coloring Rule String: bthci_cmd.opcode == 0x200d]
Bluetooth
[Source: host]
[Destination: controller]
Bluetooth HCI H4
[Direction: Sent (0x00)]
HCI Packet Type: HCI Command (0x01)
Bluetooth HCI Command - LE Create Connection
Command Opcode: LE Create Connection (0x200d)
0010 00.. .... .... = Opcode Group Field: LE Controller Commands (0x08)
.... ..00 0000 1101 = Opcode Command Field: LE Create Connection (0x00d)
Parameter Total Length: 25
Scan Interval: 96 (60 msec)
Scan Window: 48 (30 msec)
Initiator Filter Policy: Use Peer Address (0x00)
Peer Address Type: Public Device Address (0x00)
BD_ADDR: SiliconL_23:5e:25 (90:fd:9f:23:5e:25)
Own Address Type: Random Device Address (0x01)
Connection Interval Min: 24 (30 msec)
Connection Interval Max: 40 (50 msec)
Connection Latency: 0 (number events)
Supervision Timeout: 2000 (20 sec)
Min CE Length: 0 (0 msec)
Max CE Length: 0 (0 msec)
[Response in frame: 28310]
[Command-Response Delta: 8.734ms]
No. Time Arrival Time Destination Info Protocol BD_ADDR Destination Source Unexpected event Initiator Filter Policy
28310 93434.172071 Aug 12, 2018 13:39:23.876935000 FLE Daylight Time host Rcvd Command Status (LE Create Connection) HCI_EVT
Frame 28310: 7 bytes on wire (56 bits), 7 bytes captured (56 bits)
Encapsulation type: Bluetooth H4 with linux header (99)
Arrival Time: Aug 12, 2018 13:39:23.876935000 FLE Daylight Time
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1534070363.876935000 seconds
[Time delta from previous captured frame: 0.008734000 seconds]
[Time delta from previous displayed frame: 0.008734000 seconds]
[Time since reference or first frame: 93434.172071000 seconds]
Frame Number: 28310
Frame Length: 7 bytes (56 bits)
Capture Length: 7 bytes (56 bits)
[Frame is marked: False]
[Frame is ignored: False]
Point-to-Point Direction: Received (1)
[Protocols in frame: bluetooth:hci_h4:bthci_evt]
[Coloring Rule Name: ___conversation_color_filter___01]
[Coloring Rule String: bthci_evt.status == 0x0c]
Bluetooth
[Source: controller]
[Destination: host]
Bluetooth HCI H4
[Direction: Rcvd (0x01)]
HCI Packet Type: HCI Event (0x04)
Bluetooth HCI Event - Command Status
Event Code: Command Status (0x0f)
Parameter Total Length: 4
Status: Command Disallowed (0x0c)
Number of Allowed Command Packets: 1
Command Opcode: LE Create Connection (0x200d)
0010 00.. .... .... = Opcode Group Field: LE Controller Commands (0x08)
.... ..00 0000 1101 = Opcode Command Field: LE Create Connection (0x00d)
[Command in frame: 28309]
[Command-Response Delta: 8.734ms]
編輯2:
這是從 Wireshark 導出的 hci 日志文件的鏈接:
https://www.dropbox.com/s/6t8hqde4a9mxt0u/btsnoop_hci_1_cut.log?dl=0
這是指向與純文本相同的數據的鏈接:
https://www.dropbox.com/s/o4lzoyxkg7gk8de/btsnoop_hci_1_cut.TXT?dl=0
應用過濾器:frame.number > 17025 && frame.number < 28311。Frame 17032:最后一次成功連接。 幀 28222:最后一次連接嘗試沒有命令禁止狀態
編輯 3:
這是連接設備的代碼。 如前所述,我沒有使用自動連接。 我確實希望盡可能可靠和快速地重新連接。 如果連接丟失,我會定期(每 5 秒)調用此 connectBLEDevice。
private void connectBLEDevice() {
Log.d(TAG, "Start connect...");
if (btIsConnected) {
Log.e(TAG, "connectBLEDevice: do nothing because btIsConnected");
return;
}
Log.d(TAG, "connectBLEDevice: currentDevice = " + currentDevice);
Log.d(TAG, "connectBLEDevice: BT CONNECTION STATE = " + bluetoothManager.getConnectionState(currentDevice, BluetoothProfile.GATT) + " (0 = disconnected, 1 = connecting, 2 = connected, 3 = disconnecting)");
if (currentDevice != null) {
if (bluetoothManager.getConnectionState(currentDevice, BluetoothProfile.GATT) == BluetoothProfile.STATE_CONNECTED
|| bluetoothManager.getConnectionState(currentDevice, BluetoothProfile.GATT) == BluetoothProfile.STATE_CONNECTING
|| bluetoothManager.getConnectionState(currentDevice, BluetoothProfile.GATT) == BluetoothProfile.STATE_DISCONNECTING) {
Log.d("debug", "connectBLEDevice: connectBLEDevice ALREADY CONNECTED --> do nothing");
if(deviceConnectionRetryCount%30 != 0){
return;
}else { // RESET BT IF not communicating but BT claims to be connected for too long
Log.d("debug", "connectBLEDevice: STILL NOT COMMUNICATING for too long (2-3min) --> try to reconnect");
}
}
}
Log.e(TAG, "connectBLEDevice: Starting service discovery");
if (btGatt == null) {
// I was told there should be delay before connecting after disconnection (this could be accessed if user start and stop the service very fast)
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
Log.d("debug", "connectBLEDevice: connectGatt in BLESERVICE");
btGatt = currentDevice.connectGatt(BleService.this, false, gattCb);
}
}, 500);
} else {
Log.d(TAG, "connectBLEDevice: btGatt != null --> Disconnect BLE");
btGatt.disconnect();
// I was told there should be delay before connecting after disconnection
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
@Override
public void run() {
try {
boolean success = btGatt.connect();
if (!success || (deviceConnectionRetryCount > 0 && deviceConnectionRetryCount%10==0)) {
Log.d("debug", "connectBLEDevice: connect in BLESERVICE Failed OR retried 10 times (~ 1min) --> reset BT");
resetBluetooth();
}else{
Log.d("debug", "connectBLEDevice: connect in BLESERVICE Success");
}
}
catch (Exception e){
Log.e(TAG, "connectBLEDevice: Unable to connect BLE device (null pointer) --> reset BT", e);
resetBluetooth();
}
}
}, 500);
}
}
這是重置藍牙的代碼
private void resetBluetooth() {
Log.e(TAG, "*** Reseting Bluetooth! ***");
if (mGattManager != null) {
mGattManager.cancelCurrentOperationBundle();
disconnect(currentDevice);
mGattManager = null;
}
if (btGatt != null) {
btGatt.disconnect();
refreshDeviceCache(btGatt);
try {
btGatt.close();
}
catch (Exception e){
Log.e(TAG, "An exception occurred while closing btGatt");
}
}
initBluetooth();
btGatt = null;
}
不要在android P之后調用refreshDeviceCache(btGatt)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.