获取链接状态来自 BluetoothGattCallback 接口的 onConnectionStateChange 方法
/*** Callback indicating when GATT client has connected/disconnected to/from a remote* GATT server.** @param gatt GATT client* @param status Status of the connect or disconnect operation. {@link* BluetoothGatt#GATT_SUCCESS} if the operation succeeds.* @param newState Returns the new connection state. Can be one of {@link* BluetoothProfile#STATE_DISCONNECTED} or {@link BluetoothProfile#STATE_CONNECTED}*/
public void onConnectionStateChange(BluetoothGatt gatt, int status,int newState) {
}
蓝牙GattCallback的onConnectionStateChange方法是一种回调方法,当低功耗蓝牙(BLE)设备的连接状态更改时调用。此方法通常用于处理连接状态的更改,例如建立或断开连接时。
onConnectionStateChange 方法采用四个参数:
蓝牙GATT:这是已更改连接状态的蓝牙设备的 GATT 配置文件。
int status:此参数指示连接更改的状态。状态可以是蓝牙 Gatt 类中定义的几个常量之一,例如 GATT_SUCCESS、GATT_FAILURE 或 GATT_CONNECTION_CONGESTED。
int newState:此参数指示新的连接状态。它可以是以下两个值之一:BluetoothProfile.STATE_CONNECTED 或 BluetoothProfile.STATE_DISCONNECTED。
蓝牙设备:此参数是连接状态已更改的蓝牙设备。
若要使用 onConnectionStateChange 方法,必须首先创建一个 BluetoothGattCallback 对象并重写其 onConnectionStateChange 方法。然后,您可以调用 BluetoothGatt.connect() 方法来启动与 BLE 设备的连接。建立连接后,将调用 onConnectionStateChange 方法,并将 newState 参数设置为 BluetoothProfile.STATE_CONNECTED。
如果连接丢失,将再次调用 onConnectionStateChange 方法,并将 newState 参数设置为 BluetoothProfile.STATE_DISCONNECTED。然后,您可以处理断开连接,并根据需要尝试重新连接到设备。
总体而言,onConnectionStateChange 方法是处理 BLE 设备连接状态更改并根据当前连接状态采取适当操作的重要方法。
描述蓝牙连接状态
newState | Description | 描述 |
---|---|---|
2 | STATE_CONNECTED | 连接成功 |
0 | STATE_DISCONNECTED | 连接失败 |
1 | STATE_CONNECTING | 表示已经连接到远程设备 |
3 | STATE_DISCONNECTING | 表示正在断开连接 |
描述错误信息
https://developer.android.google.cn/reference/android/bluetooth/BluetoothGatt
https://www.apiref.com/android-zh/android/bluetooth/BluetoothGatt.html
Status | Status Hex | Description | 描述 |
---|---|---|---|
143 | 0x8f | GATT_CONNECTION_CONGESTED | 远程设备连接拥塞 |
5 | 0x5 | GATT_INSUFFICIENT_AUTHENTICATION | 给定操作的认证不足 |
15 | 0xf | GATT_INSUFFICIENT_ENCRYPTION | 给定操作的加密不足 |
13 | 0xd | GATT_INVALID_ATTRIBUTE_LENGTH | 写操作超过了属性的最大长度 |
7 | 0x7 | GATT_INVALID_OFFSET | 请求读取或写入操作的偏移量无效 |
2 | 0x2 | GATT_READ_NOT_PERMITTED | GATT读取操作不被允许 |
6 | 0x6 | GATT_REQUEST_NOT_SUPPORTED | 给定的请求不受支持 |
3 | 0x3 | GATT_WRITE_NOT_PERMITTED | GATT写入操作是不允许的 |
0 | 0 | GATT_SUCCESS | GATT操作成功完成 |
257 | 0x101 | GATT_FAILURE | GATT操作失败,除上述以外的错误 |
虽然,以上GATT_FAILURE 描述除上述以外的错误,但是实际中还是直接透传HCI层CODE。我理解即使上面BluetoothGatt类定义的CODE也不过是把HCI层的CODE重新定义了一下。
https://infocenter.nordicsemi.com/index.jsp?topic=%2Fcom.nordic.infocenter.s132.api.v2.0.0%2Fgroup___b_l_e___h_c_i___s_t_a_t_u_s___c_o_d_e_s.html
#define BLE_HCI_STATUS_CODE_SUCCESS 0x00#define BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND 0x01#define BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER 0x02#define BLE_HCI_AUTHENTICATION_FAILURE 0x05#define BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING 0x06#define BLE_HCI_MEMORY_CAPACITY_EXCEEDED 0x07#define BLE_HCI_CONNECTION_TIMEOUT 0x08#define BLE_HCI_STATUS_CODE_COMMAND_DISALLOWED 0x0C#define BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS 0x12#define BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION 0x13#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES 0x14#define BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF 0x15#define BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION 0x16#define BLE_HCI_UNSUPPORTED_REMOTE_FEATURE 0x1A#define BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS 0x1E#define BLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR 0x1F#define BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT 0x22#define BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED 0x24#define BLE_HCI_INSTANT_PASSED 0x28#define BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED 0x29#define BLE_HCI_DIFFERENT_TRANSACTION_COLLISION 0x2A#define BLE_HCI_CONTROLLER_BUSY 0x3A#define BLE_HCI_CONN_INTERVAL_UNACCEPTABLE 0x3B#define BLE_HCI_DIRECTED_ADVERTISER_TIMEOUT 0x3C#define BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE 0x3D#define BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED 0x3E
内容来自Github上老板的总结
https://gist.github.com/arstagaev/77526561791629c73613823bccd68daf
Status | Status Hex | Description | Explanation |
---|---|---|---|
0 | 0x00 | BLE_HCI_STATUS_CODE_SUCCESS | Everything ok!😃 |
1 | 0x01 | BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND | |
2 | 0x02 | BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER | |
2 | 0x2 | GATT_READ_NOT_PERMITTED | GATT读取操作不被允许 |
3 | 0x03 | GATT_WRITE_NOT_PERMITTED GATT | write operation is not permitted |
5 | 0x05 | BLE_HCI_AUTHENTICATION_FAILURE | Insufficient authentication for a given operation |
5 | 0x05 | GATT_INSUFFICIENT_AUTHENTICATION | |
6 | 0x06 | BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING | |
6 | 0x06 | GATT_REQUEST_NOT_SUPPORTED | The given request is not supported |
7 | 0x07 | BLE_HCI_MEMORY_CAPACITY_EXCEEDED | |
7 | 0x07 | GATT_INVALID_OFFSET | A read or write operation was requested with an invalid offset |
8 | 0x08 | BLE_HCI_CONNECTION_TIMEOUT | Could not establish a connection in specified period. Maybe device is currently connected to something else? |
12 | 0x0C | BLE_HCI_STATUS_CODE_COMMAND_DISALLOWED | |
13 | 0xD | GATT_INVALID_ATTRIBUTE_LENGTH | A write operation exceeds the maximum length of the attribute |
15 | 0xF | GATT_INSUFFICIENT_ENCRYPTION | Insufficient encryption for a given operation |
18 | 0x12 | BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS | |
19 | 0x13 | BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION | Remote device has forced a disconnect. |
20 | 0x14 | BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES | |
21 | 0x15 | BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF | |
22 | 0x16 | BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION | |
26 | 0x1A | BLE_HCI_UNSUPPORTED_REMOTE_FEATURE | |
30 | 0x1E | BLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS | |
31 | 0x1F | BLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR | |
34 | 0x22 | BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT | |
36 | 0x24 | BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED | |
40 | 0x28 | BLE_HCI_INSTANT_PASSED | |
41 | 0x29 | BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED | |
42 | 0x2A | BLE_HCI_DIFFERENT_TRANSACTION_COLLISION | |
58 | 0x3A | BLE_HCI_CONTROLLER_BUSY | |
59 | 0x3B | BLE_HCI_CONN_INTERVAL_UNACCEPTABLE | |
60 | 0x3C | BLE_HCI_DIRECTED_ADVERTISER_TIMEOUT | |
61 | 0x3D | BLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE | |
62 | 0x3E | BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED | |
128 | 0x80 | GATT_NO_RESSOURCES | |
129 | 0x81 | GATT_INTERNAL_ERROR | |
130 | 0x82 | GATT_WRONG_STATE | |
131 | 0x83 | GATT_DB_FULL | |
132 | 0x84 | GATT_BUSY | |
133 | 0x85 | GATT_ERROR | Can be anything, from device not in Range to a random error. |
135 | 0x87 | GATT_ILLEGAL_PARAMETER | |
137 | 0x89 | GATT_AUTH_FAIL | A GATT operation failed, errors other than the above |
143 | 0x8f | GATT_CONNECTION_CONGESTED | A remote device connection is congested. |
257 | 0x101 | GATT_FAILURE |
无法在指定时间内建立连接。也许设备当前连接到其他设备?
在连接中走远至断开时,遇见过此CODE
远程用户终止连接
转(https://blog.csdn.net/zhuyonghou/article/details/119084343)
该状态的连接断开,属于手机端连接断开导致,当主从机交互信息时,主机可能由于没有解开从机的某条消息,导致主动断开连接
由于资源不足,远程设备连接终止
远程设备由于电源关闭而终止连接
不支持的远程功能
连接被本地主机终止
转(https://blog.csdn.net/zhuyonghou/article/details/119084343):
连接被本地主机终止,可以解释为手机连接外围设备,但是连接过程中出现一些比如配对或者鉴权等问题,
认为此次配对连接为非法连接,主动执行了断开操作。
转(https://blog.csdn.net/zhuyonghou/article/details/119084343)
0x22通过上边的宏可以直到属于LMP或者 LL层超时响应问题。
LMP是链路控制协议,用于分配链路,并不发送到上层。
可以理解未握手,当一方发送请求握手的数据包,
需要对方在规定的时间内返回带有有效响应的数据包。
如果超过时间没有收到该数据包,则断开连接并抛出该状态码。
一般协议规定超时时间为40s.
//从设备频繁接收连接参数的更新
[12:04:39.203] [15241] [55030] [ ] [ ] [ ] BT /I : [gatt_if]-gatt_conn_param_update_result_cb: status=0
[12:04:39.203] [15242] [55031] [ ] [ ] [ ] BT /I : func [gatt_conn_param_update_result_cb] will call [conn_param_update_result_cb]
//某一个从设备收到连接参数更新后,间隔约40s后无响应。蓝牙断开。
[12:05:19.605] [21834] [14459] [ ] [ ] [ ] BT /I : [gatt_if]-gatt_srv_connection_cb: conn_id=0, connected=0, reason=34
[12:05:19.605] [21834] [14460] [ ] [ ] [ ] BT /I : func [gatt_srv_connection_cb] will call [connection_state_change_cb]
[12:05:19.605] [21834] [14461] [ ] [ ] [ ] ADPT/I : conn_id:0 connected:0//蓝牙连接参数的更新如无必要可以不用这么频繁的更新,可以修改设备代码,
只有当某些条件满足时再接受更新。
不支持与设备密钥配对错误代码
不可接受的连接参数
转(https://devzone.nordicsemi.com/f/nordic-q-a/95074/lots-of-ble_hci_conn_failed_to_be_established-0x3e-when-using-pca10100):
当中心发送连接请求并假设外围设备收到该请求时,返回代码BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED发生。它将继续根据连接参数发送连接事件数据包,以查看是否从外围设备获得任何响应。通常 6 个数据包没有任何响应后,它将终止连接并返回 BLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED .
当外围设备未收到连接请求或由于接受列表(白名单)而忽略它时,通常会发生这种情况。因此,它没有回应中央。在您的情况下,它偶尔会工作,因此它更有可能与您板上的硬件有关,无线电无法正常工作。
https://juejin.cn/post/6903729016147017741
https://www.cnblogs.com/zzxStudy/p/14636476.html