问题
I have a device with Blue Gecko BLE and everything seems to be working fine with various Android phones and tablets: connecting, data transfer and reconnect after disconnection. Note: we do not pair our device it is just connected and we do not use auto connect.
Now the problem: sometimes with some of the devices-phone setups connecting stops functioning after working for weeks. I do not know when or why it happens, but after that it is impossible to reconnect the device using the same phone it was previously working flawlessly with. The device still works normally with other phones. And the phone works with other devices. We have tried various tricks: rebooting the phone, uninstalling and reinstalling the app, resetting the device. None of those work. The only way we have been able to reconnect is to erase Bluetooth data from phone settings (either reset Network and Bluetooth or just erase Bluetooth data from phone's app settings). What is the reason and how can we fix this? Any ideas?
Clues: Looking at the btsnoop_hci.log from the phone it seems that when connections start to fail, the response to "Sent LE Create Connection" is "Command disallowed".
Looking at logcat I have seen "Got status 133 and state 0" which causes Bluetooth Reset in our App.
Connection status check is done every 5 seconds and reconnection after that... if needed.
When the problem is occurring, connection to the device cannot be made with other apps either using that same phone. It is like the device was put on a black list that can be cleared by deleting the Bluetooth data.
I hope someone would be able to help with this problem. Thanks in advance!
EDIT: I was requested for some HCI LOG, so here it is. The frames 28305 and 28309 have the create connection commands while frames 28306 and 28310 have the response with status: "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]
EDIT 2:
Here is a link to the hci log file that was exported from Wireshark:
https://www.dropbox.com/s/6t8hqde4a9mxt0u/btsnoop_hci_1_cut.log?dl=0
And here is link to the same data as plain text:
https://www.dropbox.com/s/o4lzoyxkg7gk8de/btsnoop_hci_1_cut.TXT?dl=0
Applied filter: frame.number > 17025 && frame.number < 28311. Frame 17032: last successful connection. Frame 28222: last connection attempt without command disallowed status
EDIT 3:
Here's the code for connecting the device. As said I'm not using autoconnect. I do want to reconnect as reliably and fast as possible. I'm calling this connectBLEDevice regularly (every 5sec) if the connection is lost.
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);
}
}
Here's the code for reseting the Bluetooth
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;
}
来源:https://stackoverflow.com/questions/52000776/ble-device-stops-connecting-with-android-after-working-flawlessly-for-weeks