BLE 设备在完美运行数周后停止与 Android 连接 [英] BLE-device stops connecting with Android after working flawlessly for weeks

查看:40
本文介绍了BLE 设备在完美运行数周后停止与 Android 连接的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一台配备 Blue Gecko BLE 的设备,在各种 Android 手机和平板电脑上似乎一切正常:连接、数据传输和断开后重新连接.注意:我们不配对刚刚连接的设备,也不使用自动连接.

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?

线索:从手机查看 btsnoop_hci.log 似乎当连接开始失败时,对Sent LE Create Connection"的响应是Command disallowed".

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".

查看 logcat,我看到得到状态 133 和状态 0",这会导致我们的应用程序中的蓝牙重置.

Looking at logcat I have seen "Got status 133 and state 0" which causes Bluetooth Reset in our App.

每 5 秒检查一次连接状态,然后重新连接...如果需要.

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!

我被要求提供一些 HCI LOG,所以就在这里.帧 28305 和 28309 具有创建连接命令,而帧 28306 和 28310 具有状态为命令不允许 (0x0c)"的响应

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]

编辑 2:

这是从 Wireshark 导出的 hci 日志文件的链接:

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

应用过滤器:frame.number > 17025 &&帧数<28311.第 17032 帧:最后一次成功连接.帧 28222:没有命令不允许状态的最后连接尝试

Applied filter: frame.number > 17025 && frame.number < 28311. Frame 17032: last successful connection. Frame 28222: last connection attempt without command disallowed status

编辑 3:

这是连接设备的代码.如前所述,我没有使用自动连接.我确实希望尽可能可靠和快速地重新连接.如果连接丢失,我会定期(每 5 秒)调用此 connectBLEDevice.

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);

    }

}

这是重置蓝牙的代码

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).

Do not call refreshDeviceCache(btGatt) after android P.

这篇关于BLE 设备在完美运行数周后停止与 Android 连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆