BLE-device stops connecting with Android after working flawlessly for weeks

☆樱花仙子☆ 提交于 2020-01-04 06:01:21

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!