BLE 设备在完美运行数周后停止与 Android 连接

Posted

技术标签:

【中文标题】BLE 设备在完美运行数周后停止与 Android 连接【英文标题】:BLE-device stops connecting with Android after working flawlessly for weeks 【发布时间】:2019-01-30 17:12:45 【问题描述】:

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

现在的问题是:有时某些设备 - 电话设置连接会在工作数周后停止运行。我不知道它何时或为什么会发生,但在那之后就不可能使用之前完美运行的同一部手机重新连接该设备。该设备仍然可以与其他手机正常工作。手机可以与其他设备配合使用。我们尝试了各种技巧:重启手机、卸载并重新安装应用程序、重置设备。这些都不起作用。我们能够重新连接的唯一方法是从手机设置中删除蓝牙数据(重置网络和蓝牙,或者只是从手机的应用程序设置中删除蓝牙数据)。原因是什么,我们该如何解决?有什么想法吗?

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

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

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

出现问题时,无法使用同一部手机与其他应用建立连接。就像设备被列入黑名单一样,可以通过删除蓝牙数据来清除。

我希望有人能够帮助解决这个问题。 提前致谢!

编辑:我被要求提供一些 HCI LOG,所以就在这里。帧 28305 和 28309 具有创建连接命令,而帧 28306 和 28310 具有状态为“命令不允许 (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

编辑 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;

【问题讨论】:

我不太了解这个设备 但是看看这个.....也许它可以帮助github.com/noble/noble/issues/412 github.com/noble/noble/issues/283#issuecomment-164266207 你能把hci日志贴出来吗? 感谢您的回复,第一个链接...问题是没有BLE,我们的设备是BLE。第二个链接......这也是关于错误的设备类型据我所知,两者都一直失败,而在我的情况下一切正常,然后停止工作。 【参考方案1】:

android P 之后不要调用 refreshDeviceCache(btGatt)。

【讨论】:

以上是关于BLE 设备在完美运行数周后停止与 Android 连接的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中保存 xml 文件的问题

如何在 Android 中获取当前连接的 BLE 外围设备

与 BLE 设备保持连接的 Android 应用

Android BLE GATT 断开与设备断开

Android BLE 通知

Android和双模蓝牙设备:与BR / EDR(经典)配对时未找到自定义BLE服务