每天记录学习的新知识:BLE连接状态码
创始人
2025-05-28 05:25:32
0

BLE连接状态码

    • 一、BluetoothGattCallback
      • 原方法
      • GPT检索
    • 二、newState
    • 三、status
      • BluetoothGatt 层CODE
      • HCI 层的CODE
      • 总结下CODE表
      • CODE中文描述
        • CODE 0x08
        • CODE 0x13
        • CODE 0x14
        • CODE 0x15
        • CODE 0x16
        • CODE 0x22
        • CODE 0x29
        • CODE 0x3B
        • CODE 0x3E
  • 参考地址

一、BluetoothGattCallback

原方法

获取链接状态来自 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) {
}

GPT检索

蓝牙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

描述蓝牙连接状态

newStateDescription描述
2STATE_CONNECTED连接成功
0STATE_DISCONNECTED连接失败
1STATE_CONNECTING表示已经连接到远程设备
3STATE_DISCONNECTING表示正在断开连接

三、status

描述错误信息

BluetoothGatt 层CODE

https://developer.android.google.cn/reference/android/bluetooth/BluetoothGatt

https://www.apiref.com/android-zh/android/bluetooth/BluetoothGatt.html

StatusStatus HexDescription描述
1430x8fGATT_CONNECTION_CONGESTED远程设备连接拥塞
50x5GATT_INSUFFICIENT_AUTHENTICATION给定操作的认证不足
150xfGATT_INSUFFICIENT_ENCRYPTION给定操作的加密不足
130xdGATT_INVALID_ATTRIBUTE_LENGTH写操作超过了属性的最大长度
70x7GATT_INVALID_OFFSET请求读取或写入操作的偏移量无效
20x2GATT_READ_NOT_PERMITTEDGATT读取操作不被允许
60x6GATT_REQUEST_NOT_SUPPORTED给定的请求不受支持
30x3GATT_WRITE_NOT_PERMITTEDGATT写入操作是不允许的
00GATT_SUCCESSGATT操作成功完成
2570x101GATT_FAILUREGATT操作失败,除上述以外的错误

虽然,以上GATT_FAILURE 描述除上述以外的错误,但是实际中还是直接透传HCI层CODE。我理解即使上面BluetoothGatt类定义的CODE也不过是把HCI层的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

总结下CODE表

内容来自Github上老板的总结

https://gist.github.com/arstagaev/77526561791629c73613823bccd68daf

StatusStatus HexDescriptionExplanation
00x00BLE_HCI_STATUS_CODE_SUCCESSEverything ok!😃
10x01BLE_HCI_STATUS_CODE_UNKNOWN_BTLE_COMMAND
20x02BLE_HCI_STATUS_CODE_UNKNOWN_CONNECTION_IDENTIFIER
20x2GATT_READ_NOT_PERMITTEDGATT读取操作不被允许
30x03GATT_WRITE_NOT_PERMITTED GATTwrite operation is not permitted
50x05BLE_HCI_AUTHENTICATION_FAILUREInsufficient authentication for a given operation
50x05GATT_INSUFFICIENT_AUTHENTICATION
60x06BLE_HCI_STATUS_CODE_PIN_OR_KEY_MISSING
60x06GATT_REQUEST_NOT_SUPPORTEDThe given request is not supported
70x07BLE_HCI_MEMORY_CAPACITY_EXCEEDED
70x07GATT_INVALID_OFFSETA read or write operation was requested with an invalid offset
80x08BLE_HCI_CONNECTION_TIMEOUTCould not establish a connection in specified period. Maybe device is currently connected to something else?
120x0CBLE_HCI_STATUS_CODE_COMMAND_DISALLOWED
130xDGATT_INVALID_ATTRIBUTE_LENGTHA write operation exceeds the maximum length of the attribute
150xFGATT_INSUFFICIENT_ENCRYPTIONInsufficient encryption for a given operation
180x12BLE_HCI_STATUS_CODE_INVALID_BTLE_COMMAND_PARAMETERS
190x13BLE_HCI_REMOTE_USER_TERMINATED_CONNECTIONRemote device has forced a disconnect.
200x14BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_LOW_RESOURCES
210x15BLE_HCI_REMOTE_DEV_TERMINATION_DUE_TO_POWER_OFF
220x16BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION
260x1ABLE_HCI_UNSUPPORTED_REMOTE_FEATURE
300x1EBLE_HCI_STATUS_CODE_INVALID_LMP_PARAMETERS
310x1FBLE_HCI_STATUS_CODE_UNSPECIFIED_ERROR
340x22BLE_HCI_STATUS_CODE_LMP_RESPONSE_TIMEOUT
360x24BLE_HCI_STATUS_CODE_LMP_PDU_NOT_ALLOWED
400x28BLE_HCI_INSTANT_PASSED
410x29BLE_HCI_PAIRING_WITH_UNIT_KEY_UNSUPPORTED
420x2ABLE_HCI_DIFFERENT_TRANSACTION_COLLISION
580x3ABLE_HCI_CONTROLLER_BUSY
590x3BBLE_HCI_CONN_INTERVAL_UNACCEPTABLE
600x3CBLE_HCI_DIRECTED_ADVERTISER_TIMEOUT
610x3DBLE_HCI_CONN_TERMINATED_DUE_TO_MIC_FAILURE
620x3EBLE_HCI_CONN_FAILED_TO_BE_ESTABLISHED
1280x80GATT_NO_RESSOURCES
1290x81GATT_INTERNAL_ERROR
1300x82GATT_WRONG_STATE
1310x83GATT_DB_FULL
1320x84GATT_BUSY
1330x85GATT_ERRORCan be anything, from device not in Range to a random error.
1350x87GATT_ILLEGAL_PARAMETER
1370x89GATT_AUTH_FAILA GATT operation failed, errors other than the above
1430x8fGATT_CONNECTION_CONGESTEDA remote device connection is congested.
2570x101GATT_FAILURE

CODE中文描述

CODE 0x08

无法在指定时间内建立连接。也许设备当前连接到其他设备?

在连接中走远至断开时,遇见过此CODE

CODE 0x13

远程用户终止连接

转(https://blog.csdn.net/zhuyonghou/article/details/119084343)

该状态的连接断开,属于手机端连接断开导致,当主从机交互信息时,主机可能由于没有解开从机的某条消息,导致主动断开连接

CODE 0x14

由于资源不足,远程设备连接终止

CODE 0x15

远程设备由于电源关闭而终止连接
不支持的远程功能

CODE 0x16

连接被本地主机终止

转(https://blog.csdn.net/zhuyonghou/article/details/119084343):
连接被本地主机终止,可以解释为手机连接外围设备,但是连接过程中出现一些比如配对或者鉴权等问题,
认为此次配对连接为非法连接,主动执行了断开操作。

CODE 0x22

转(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//蓝牙连接参数的更新如无必要可以不用这么频繁的更新,可以修改设备代码,  
只有当某些条件满足时再接受更新。

CODE 0x29

不支持与设备密钥配对错误代码

CODE 0x3B

不可接受的连接参数

CODE 0x3E

转(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

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
美团联名卡审核成功待激活(美团... 今天百科达人给各位分享美团联名卡审核成功待激活的知识,其中也会对美团联名卡审核未通过进行解释,如果能...
一帆风顺二龙腾飞三阳开泰祝福语... 本篇文章极速百科给大家谈谈一帆风顺二龙腾飞三阳开泰祝福语,以及一帆风顺二龙腾飞三阳开泰祝福语结婚对应...