BluetoothGatt: onClientConnectionState() returns 状态=133
BluetoothGatt: onClientConnectionState() returns status=133
场景是:
我有一个 android dongle 运行 我的应用程序,在另一边我有一个连接到 esp8266 的 HM10 LE 蓝牙。
我正在尝试通过蓝牙将 android 加密狗通过我的应用程序连接到 HM10。
我已经在数周内成功完成了这项工作,甚至将 android 加密狗与不同的 HM10 连接,反之亦然,相同的 HM10 与其他加密狗连接。
问题:
一段时间后,在连接尝试期间,我开始收到状态为 133 的断开连接状态,但在一些连接重试后连接成功。
现在,我无法将特定的 android 加密狗(我们称之为有问题的加密狗)与特定的 HM10(我们称之为有问题的 HM10)连接。我总是收到 133,即使重试数百次也无法连接。
但是,如果我使用另一个加密狗,我可以连接到 "the problematic" HM10。另外,如果我使用另一个 HM10,我可以连接到 "the problematic" 加密狗。
最后,当我将另一个 HM10 连接到有问题的加密狗时,紧接着,我能够将有问题的 HM10 连接到有问题的加密狗。但是,如果我断开它,我将永远无法再次连接。
当我尝试连接到特定的 BLE 设备时,我总是收到状态为 133 的断开连接状态。
我尝试解决的问题:
重要的是,在正常使用期间,HM10 可以关闭,反之亦然。虽然,当我在 Gatt 回调中获取 "onConnectionStateChange" 上的断开连接事件时,我总是关闭 gatt(deviceGatt.close();)
我还阅读了一些 posts 以在关闭之前刷新 deviceGatt,所以我也在这样做:
//inside the onConnectionStateChange on the BluetoothGattCallback:
case BluetoothProfile.STATE_DISCONNECTED:
mConnectionState = ConnectionStatus.DISCONNECTED;
readCharacteristic = null;
writeCharacteristic = null;
if ( status != BluetoothGatt.GATT_SUCCESS ) {
if ( status == 133) {
refreshDeviceCache(deviceGatt);
}
}
deviceGatt.close();
deviceGatt = null;
break;
}
private boolean refreshDeviceCache(BluetoothGatt gatt){
try {
BluetoothGatt localBluetoothGatt = gatt;
Method localMethod = localBluetoothGatt.getClass().getMethod("refresh", new Class[0]);
if (localMethod != null) {
boolean bool = ((Boolean) localMethod.invoke(localBluetoothGatt, new Object[0])).booleanValue();
return bool;
}
}
catch (Exception localException) {
}
return false;
}
我也看了一个post在android设置->无线&网络->更多->网络设置重置中清理缓存,但是做了之后问题依旧
请在下面找到日志:
11-27 11:16:49.353 8104-8130/? D/bt_hci_h5: hci_hal_h5 h5_transmit_data, data type: 1
11-27 11:16:49.353 8104-8130/? D/bt_hci_h5: cmd opcode = 0xfc19
11-27 11:16:49.353 8104-8130/? D/bt_hci_h5: hci_hal_h5 h5_int_transmit_data_cb data type: 5
11-27 11:16:49.353 8104-8144/? W/bt_btif: bta_gattc_conn_cback() - cif=3 connected=0 conn_id=3 reason=0x0008
11-27 11:16:49.353 8104-8144/? W/bt_btif: bta_gattc_conn_cback() - cif=4 connected=0 conn_id=4 reason=0x0008
11-27 11:16:49.353 8104-8144/? W/bt_btif: bta_gattc_conn_cback() - cif=5 connected=0 conn_id=5 reason=0x0008
11-27 11:16:49.353 8104-8144/? W/bt_btif: bta_gattc_conn_cback() - cif=6 connected=0 conn_id=6 reason=0x0008
11-27 11:16:49.353 8104-8144/? W/bt_btif: bta_gattc_conn_cback() - cif=7 connected=0 conn_id=7 reason=0x0008
11-27 11:16:49.353 8104-8144/? E/rtk_parse: rtk_delete_le_profile, hci_conn not exist with handle ffff
11-27 11:16:49.353 8104-8144/? I/bt_btm_sec: btm_sec_disconnected clearing pending flag handle:16 reason:8
11-27 11:16:49.354 8104-8126/? D/BtGatt.GattService: onConnected() - clientIf=7, connId=0, address=34:15:13:E6:50:8F
11-27 11:16:49.354 8104-8130/? D/bt_hci_h5: hci_hal_h5 h5_int_transmit_data_cb data type: 5
11-27 11:16:49.354 24277-24288/? D/BluetoothGatt: onClientConnectionState() - status=133 clientIf=7 device=34:15:13:E6:50:8F
11-27 11:16:49.358 24277-24288/? D/BluetoothComm: Error connecting to device: com.polidea.rxandroidble.exceptions.BleDisconnectedException: Disconnected from 34:15:13:E6:50:8F
11-27 11:16:49.359 24277-24288/? W/System.err: com.polidea.rxandroidble.exceptions.BleDisconnectedException: Disconnected from 34:15:13:E6:50:8F
11-27 11:16:49.359 24277-24288/? W/System.err: at com.polidea.rxandroidble.internal.connection.RxBleGattCallback.onConnectionStateChange(RxBleGattCallback.java:76)
11-27 11:16:49.359 24277-24288/? W/System.err: at android.bluetooth.BluetoothGatt.onClientConnectionState(BluetoothGatt.java:184)
11-27 11:16:49.359 24277-24288/? W/System.err: at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:70)
11-27 11:16:49.359 24277-24288/? W/System.err: at android.os.Binder.execTransact(Binder.java:565)
11-27 11:16:49.362 24277-24324/? D/BluetoothManager: getConnectionState()
11-27 11:16:49.362 24277-24324/? D/BluetoothManager: getConnectedDevices
11-27 11:16:49.367 24277-24324/? D/BluetoothGatt: close()
11-27 11:16:49.367 24277-24324/? D/BluetoothGatt: unregisterApp() - mClientIf=7
11-27 11:16:49.368 8104-8158/? D/BtGatt.GattService: unregisterClient() - clientIf=7
11-27 11:16:49.465 8104-8130/? D/bt_vendor_uart: op for 7
11-27 11:16:49.465 8104-8130/? D/bt_hci_h5: hci_hal_h5 h5_transmit_data, data type: 1
11-27 11:16:49.465 8104-8130/? D/bt_hci_h5: cmd opcode = 0xfc94
这是 btsnoop_hci.cfa 的屏幕截图:
//更新-添加文件日志
这是log file
//结束更新
我阅读了很多关于此问题的 post 但还是没有解决方案,或者提供的解决方案不起作用。
我别无选择,所以我想知道是否有人可以帮助我解决这个问题。有什么想法吗?
Android软件没有问题。问题是 BLE 无线电 link 似乎没有保持连接。您可以使用空气嗅探器来尝试监控空气中发生的事情;为什么数据包丢失。当然也有可能是两个蓝牙控制器中的任何一个 Link 层行为不端。我会建议验证硬件是否真的能正常工作。
场景是:
我有一个 android dongle 运行 我的应用程序,在另一边我有一个连接到 esp8266 的 HM10 LE 蓝牙。
我正在尝试通过蓝牙将 android 加密狗通过我的应用程序连接到 HM10。
我已经在数周内成功完成了这项工作,甚至将 android 加密狗与不同的 HM10 连接,反之亦然,相同的 HM10 与其他加密狗连接。
问题:
一段时间后,在连接尝试期间,我开始收到状态为 133 的断开连接状态,但在一些连接重试后连接成功。
现在,我无法将特定的 android 加密狗(我们称之为有问题的加密狗)与特定的 HM10(我们称之为有问题的 HM10)连接。我总是收到 133,即使重试数百次也无法连接。
但是,如果我使用另一个加密狗,我可以连接到 "the problematic" HM10。另外,如果我使用另一个 HM10,我可以连接到 "the problematic" 加密狗。
最后,当我将另一个 HM10 连接到有问题的加密狗时,紧接着,我能够将有问题的 HM10 连接到有问题的加密狗。但是,如果我断开它,我将永远无法再次连接。
当我尝试连接到特定的 BLE 设备时,我总是收到状态为 133 的断开连接状态。
我尝试解决的问题:
重要的是,在正常使用期间,HM10 可以关闭,反之亦然。虽然,当我在 Gatt 回调中获取 "onConnectionStateChange" 上的断开连接事件时,我总是关闭 gatt(deviceGatt.close();)
我还阅读了一些 posts 以在关闭之前刷新 deviceGatt,所以我也在这样做:
//inside the onConnectionStateChange on the BluetoothGattCallback:
case BluetoothProfile.STATE_DISCONNECTED:
mConnectionState = ConnectionStatus.DISCONNECTED;
readCharacteristic = null;
writeCharacteristic = null;
if ( status != BluetoothGatt.GATT_SUCCESS ) {
if ( status == 133) {
refreshDeviceCache(deviceGatt);
}
}
deviceGatt.close();
deviceGatt = null;
break;
}
private boolean refreshDeviceCache(BluetoothGatt gatt){
try {
BluetoothGatt localBluetoothGatt = gatt;
Method localMethod = localBluetoothGatt.getClass().getMethod("refresh", new Class[0]);
if (localMethod != null) {
boolean bool = ((Boolean) localMethod.invoke(localBluetoothGatt, new Object[0])).booleanValue();
return bool;
}
}
catch (Exception localException) {
}
return false;
}
我也看了一个post在android设置->无线&网络->更多->网络设置重置中清理缓存,但是做了之后问题依旧
请在下面找到日志:
11-27 11:16:49.353 8104-8130/? D/bt_hci_h5: hci_hal_h5 h5_transmit_data, data type: 1
11-27 11:16:49.353 8104-8130/? D/bt_hci_h5: cmd opcode = 0xfc19
11-27 11:16:49.353 8104-8130/? D/bt_hci_h5: hci_hal_h5 h5_int_transmit_data_cb data type: 5
11-27 11:16:49.353 8104-8144/? W/bt_btif: bta_gattc_conn_cback() - cif=3 connected=0 conn_id=3 reason=0x0008
11-27 11:16:49.353 8104-8144/? W/bt_btif: bta_gattc_conn_cback() - cif=4 connected=0 conn_id=4 reason=0x0008
11-27 11:16:49.353 8104-8144/? W/bt_btif: bta_gattc_conn_cback() - cif=5 connected=0 conn_id=5 reason=0x0008
11-27 11:16:49.353 8104-8144/? W/bt_btif: bta_gattc_conn_cback() - cif=6 connected=0 conn_id=6 reason=0x0008
11-27 11:16:49.353 8104-8144/? W/bt_btif: bta_gattc_conn_cback() - cif=7 connected=0 conn_id=7 reason=0x0008
11-27 11:16:49.353 8104-8144/? E/rtk_parse: rtk_delete_le_profile, hci_conn not exist with handle ffff
11-27 11:16:49.353 8104-8144/? I/bt_btm_sec: btm_sec_disconnected clearing pending flag handle:16 reason:8
11-27 11:16:49.354 8104-8126/? D/BtGatt.GattService: onConnected() - clientIf=7, connId=0, address=34:15:13:E6:50:8F
11-27 11:16:49.354 8104-8130/? D/bt_hci_h5: hci_hal_h5 h5_int_transmit_data_cb data type: 5
11-27 11:16:49.354 24277-24288/? D/BluetoothGatt: onClientConnectionState() - status=133 clientIf=7 device=34:15:13:E6:50:8F
11-27 11:16:49.358 24277-24288/? D/BluetoothComm: Error connecting to device: com.polidea.rxandroidble.exceptions.BleDisconnectedException: Disconnected from 34:15:13:E6:50:8F
11-27 11:16:49.359 24277-24288/? W/System.err: com.polidea.rxandroidble.exceptions.BleDisconnectedException: Disconnected from 34:15:13:E6:50:8F
11-27 11:16:49.359 24277-24288/? W/System.err: at com.polidea.rxandroidble.internal.connection.RxBleGattCallback.onConnectionStateChange(RxBleGattCallback.java:76)
11-27 11:16:49.359 24277-24288/? W/System.err: at android.bluetooth.BluetoothGatt.onClientConnectionState(BluetoothGatt.java:184)
11-27 11:16:49.359 24277-24288/? W/System.err: at android.bluetooth.IBluetoothGattCallback$Stub.onTransact(IBluetoothGattCallback.java:70)
11-27 11:16:49.359 24277-24288/? W/System.err: at android.os.Binder.execTransact(Binder.java:565)
11-27 11:16:49.362 24277-24324/? D/BluetoothManager: getConnectionState()
11-27 11:16:49.362 24277-24324/? D/BluetoothManager: getConnectedDevices
11-27 11:16:49.367 24277-24324/? D/BluetoothGatt: close()
11-27 11:16:49.367 24277-24324/? D/BluetoothGatt: unregisterApp() - mClientIf=7
11-27 11:16:49.368 8104-8158/? D/BtGatt.GattService: unregisterClient() - clientIf=7
11-27 11:16:49.465 8104-8130/? D/bt_vendor_uart: op for 7
11-27 11:16:49.465 8104-8130/? D/bt_hci_h5: hci_hal_h5 h5_transmit_data, data type: 1
11-27 11:16:49.465 8104-8130/? D/bt_hci_h5: cmd opcode = 0xfc94
这是 btsnoop_hci.cfa 的屏幕截图:
//更新-添加文件日志
这是log file
//结束更新
我阅读了很多关于此问题的 post 但还是没有解决方案,或者提供的解决方案不起作用。
我别无选择,所以我想知道是否有人可以帮助我解决这个问题。有什么想法吗?
Android软件没有问题。问题是 BLE 无线电 link 似乎没有保持连接。您可以使用空气嗅探器来尝试监控空气中发生的事情;为什么数据包丢失。当然也有可能是两个蓝牙控制器中的任何一个 Link 层行为不端。我会建议验证硬件是否真的能正常工作。