前言:
最近在调试项目产品时遇到一个蓝牙连接的问题,模组用的是低功耗蓝牙,
在多次触发某个功能时发现蓝牙连接断开。自检代码,发现触发的功能并没有问题。抓取日志进行分析。
蓝牙常见问题宏定义:
#define BTA_GATT_OK GATT_SUCCESS
#define BTA_GATT_INVALID_HANDLE GATT_INVALID_HANDLE /* 0x0001 */
#define BTA_GATT_READ_NOT_PERMIT GATT_READ_NOT_PERMIT /* 0x0002 */
#define BTA_GATT_WRITE_NOT_PERMIT GATT_WRITE_NOT_PERMIT /* 0x0003 */
#define BTA_GATT_INVALID_PDU GATT_INVALID_PDU /* 0x0004 */
#define BTA_GATT_INSUF_AUTHENTICATION GATT_INSUF_AUTHENTICATION /* 0x0005 */
#define BTA_GATT_REQ_NOT_SUPPORTED GATT_REQ_NOT_SUPPORTED /* 0x0006 */
#define BTA_GATT_INVALID_OFFSET GATT_INVALID_OFFSET /* 0x0007 */
#define BTA_GATT_INSUF_AUTHORIZATION GATT_INSUF_AUTHORIZATION /* 0x0008 */
#define BTA_GATT_PREPARE_Q_FULL GATT_PREPARE_Q_FULL /* 0x0009 */
#define BTA_GATT_NOT_FOUND GATT_NOT_FOUND /* 0x000a */
#define BTA_GATT_NOT_LONG GATT_NOT_LONG /* 0x000b */
#define BTA_GATT_INSUF_KEY_SIZE GATT_INSUF_KEY_SIZE /* 0x000c */
#define BTA_GATT_INVALID_ATTR_LEN GATT_INVALID_ATTR_LEN /* 0x000d */
#define BTA_GATT_ERR_UNLIKELY GATT_ERR_UNLIKELY /* 0x000e */
#define BTA_GATT_INSUF_ENCRYPTION GATT_INSUF_ENCRYPTION /* 0x000f */
#define BTA_GATT_UNSUPPORT_GRP_TYPE GATT_UNSUPPORT_GRP_TYPE /* 0x0010 */
#define BTA_GATT_INSUF_RESOURCE GATT_INSUF_RESOURCE /* 0x0011 */
#define BTA_GATT_NO_RESOURCES GATT_NO_RESOURCES /* 0x80 */
#define BTA_GATT_INTERNAL_ERROR GATT_INTERNAL_ERROR /* 0x81 */
#define BTA_GATT_WRONG_STATE GATT_WRONG_STATE /* 0x82 */
#define BTA_GATT_DB_FULL GATT_DB_FULL /* 0x83 */
#define BTA_GATT_BUSY GATT_BUSY /* 0x84 */
#define BTA_GATT_ERROR GATT_ERROR /* 0x85 */
#define BTA_GATT_CMD_STARTED GATT_CMD_STARTED /* 0x86 */
#define BTA_GATT_ILLEGAL_PARAMETER GATT_ILLEGAL_PARAMETER /* 0x87 */
#define BTA_GATT_PENDING GATT_PENDING /* 0x88 */
#define BTA_GATT_AUTH_FAIL GATT_AUTH_FAIL /* 0x89 */
#define BTA_GATT_MORE GATT_MORE /* 0x8a */
#define BTA_GATT_INVALID_CFG GATT_INVALID_CFG /* 0x8b */
#define BTA_GATT_SERVICE_STARTED GATT_SERVICE_STARTED /* 0x8c */
#define BTA_GATT_ENCRYPED_MITM GATT_ENCRYPED_MITM /* GATT_SUCCESS */
#define BTA_GATT_ENCRYPED_NO_MITM GATT_ENCRYPED_NO_MITM /* 0x8d */
#define BTA_GATT_NOT_ENCRYPTED GATT_NOT_ENCRYPTED /* 0x8e */
#define BTA_GATT_CONGESTED GATT_CONGESTED /* 0x8f */
#define BTA_GATT_DUP_REG 0x90 /* 0x90 */
#define BTA_GATT_ALREADY_OPEN 0x91 /* 0x91 */
#define BTA_GATT_CANCEL 0x92 /* 0x92 */
0x13问题:
该状态的连接断开,属于手机端连接断开导致,当主从机交互信息时,主机可能由于没有解开从机的某条消息,导致主动断开连接
0x16问题:
连接被本地主机终止,可以解释为手机连接外围设备,但是连接过程中出现一些比如配对或者鉴权等问题,
认为此次配对连接为非法连接,主动执行了断开操作。
0x22问题:
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
//蓝牙连接参数的更新如无必要可以不用这么频繁的更新,可以修改设备代码,
只有当某些条件满足时再接受更新。