低功耗BLE调试总结之0x13,0x16,0x22问题

前言:
最近在调试项目产品时遇到一个蓝牙连接的问题,模组用的是低功耗蓝牙,  
在多次触发某个功能时发现蓝牙连接断开。自检代码,发现触发的功能并没有问题。抓取日志进行分析。

蓝牙常见问题宏定义:

#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

//蓝牙连接参数的更新如无必要可以不用这么频繁的更新,可以修改设备代码,  
只有当某些条件满足时再接受更新。
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
根据提供的引用内容,没有提到uniapp低功耗蓝牙写入文件的相关信息。但是,如果你想要在uniapp中使用低功耗蓝牙进行数据传输,可以按照以下步骤进行: 1.引入uni-ble库 ```javascript import Ble from '@/common/uni-ble/uni-ble.js' ``` 2.初始化蓝牙适配器 ```javascript Ble.openAdapter({ success: function(res) { console.log('openAdapter success', res) }, fail: function(res) { console.log('openAdapter fail', res) } }) ``` 3.搜索蓝牙设备 ```javascript Ble.startBluetoothDevicesDiscovery({ allowDuplicatesKey: false, success: function(res) { console.log('startBluetoothDevicesDiscovery success', res) }, fail: function(res) { console.log('startBluetoothDevicesDiscovery fail', res) } }) ``` 4.连接蓝牙设备 ```javascript Ble.createBLEConnection({ deviceId: deviceId, success: function(res) { console.log('createBLEConnection success', res) }, fail: function(res) { console.log('createBLEConnection fail', res) } }) ``` 5.写入数据 ```javascript Ble.writeBLECharacteristicValue({ deviceId: deviceId, serviceId: serviceId, characteristicId: characteristicId, value: buffer, success: function(res) { console.log('writeBLECharacteristicValue success', res) }, fail: function(res) { console.log('writeBLECharacteristicValue fail', res) } }) ``` 注意:在进行数据传输时,需要将数据转换为ArrayBuffer类型的数据,可以使用以下代码进行转换: ```javascript let buffer = new Uint8Array([0x01, 0x02, 0x03]).buffer ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值