Page 1 of 1

BLE 连接问题排查指南

Posted: 2024年 Dec 3日 16:36
by root

1. 引言

  • 你是否遇到过 BLE 设备无法配网?
  • 你是否疑惑过设备为什么无法连接?
  • 你是否迷茫过设备怎么就离线了?
  • 你是否困惑为什么换了一个手机就连不上设备了?

本文不会解决你的问题,但是可以告诉你一些通用的排查方式!


2. 概念

首先需要介绍一下 BLE 的连接过程,

其中有不少 BLE 相关的专业名词,如果你认为已经知晓,可以直接看第三章内容。

1、profile

profile可以理解为一种规范,一个标准的通信协议,它存在于从机中。蓝牙组织规定了一些标准的profile,例如 HID OVER GATT ,防丢器 ,心率计等。每个profile中会包含多个service,每个service代表从机的一种能力。

2、service

service可以理解为一个服务,在ble从机中,通过有多个服务,例如电量信息服务、系统信息服务等,每个service中又包含多个characteristic特征值。每个具体的characteristic特征值才是ble通信的主题。比如当前的电量是80%,所以会通过电量的characteristic特征值存在从机的profile里,这样主机就可以通过这个characteristic来读取80%这个数据

3、characteristic

characteristic特征值,ble主从机的通信均是通过characteristic来实现,可以理解为一个标签,通过这个标签可以获取或者写入想要的内容。

4、UUID

UUID,统一识别码,我们刚才提到的service和characteristic,都需要一个唯一的uuid来标识整理一下,每个从机都会有一个叫做profile的东西存在,不管是上面的自定义的simpleprofile,还是标准的防丢器profile,他们都是由一些列service组成,然后每个service又包含了多个characteristic,主机和从机之间的通信,均是通过characteristic来实现。

现在低功耗蓝牙(BLE)连接都是建立在 GATT (Generic Attribute Profile) 协议之上。GATT 是一个在蓝牙连接之上的发送和接收很短的数据段的通用规范,这些很短的数据段被称为属性(Attribute)。

企业微信截图_be9facbc-ee76-4622-98e8-5bb4af363ffa.png

从上流程图不难看出,连接设备有三个要素点:

1.App要能扫描到广播包

2.设备要能发送广播包

3.设备要能响应App建连请求


3. 排查流程

3.1 检查设备

  • 设备是否上电
  • 如果是配网的设备,设备是否重置
  • 配网设备是否超出配网时间(BLE 一般 30s)
  • 设备信息是否错误:mac/uuid,pid

3.2 检查手机

  • 蓝牙是否开启
  • GPS 是否开启
  • APP 权限是否开启,具体可以参考:https://www.tuyaos.com/viewtopic.php?t=3953
  • 手机 GATT 连接上限:Android 官方默认 7( SDK BLE 设备为 4), iOS 一般在 10 以上
  • 手机蓝牙协议栈异常,尝试重启蓝牙开关

3.3 配网相关

  • 设备是否授权,mac/uuid 认证
  • 设备是否有区域限制
  • 设备是否被其它账号配网
  • 设备 GATT 是否正好被其它手机连接占用

3.4 设备广播相关

  • 广播信号强度
  • 广播中未配网、可连接标记位置
  • 如果是扫码配网设备,即 uuid/mac 过滤设备,广播字段标位是否正确

4. 排查工具

推荐使用 nrf connect APP:https://github.com/NordicSemiconductor/ ... t/releases

nRF Connect是一个强大的通用工具,它允许你扫描和探索你的蓝牙低功耗(以后的蓝牙LE,也称为蓝牙4.0+版本的蓝牙规范)设备,并与它们通信。

nRF连接还允许您的iOS设备广告作为一个外围设备,充分支持许多蓝牙SIG采用的配置文件。

此外,nRF Connect支持北欧半导体的设备固件更新配置文件(DFU)功能,允许您更新兼容的外接设备!

4.1 扫描

企业微信截图_fd0f7943-60e9-407e-a278-f40ed7ac8945.png

观察设备UUIDs
• 0x1827:待配网
• 0x1828:已配网

你可以观察设备是否有发出广播,广播的信号强度、广播间隔

4.2 连接

企业微信截图_a1ce64c4-b0b9-4cc2-b299-5be9f2c0c889.png

在这里你可以查看设备是否可以正常建立 GATT 连接,

并且发现服务,和其特征值是否正确。

企业微信截图_e087ac4f-4504-4677-bf13-191158e5d0c4.png

可以进行 nitify 和 write 操作验证设备是否正常:

企业微信截图_e087ac4f-4504-4677-bf13-191158e5d0c4.png

5. 一些常见的 BLE 错误码

0x08 链接因为握手超时导致断开。
解决办法:
该ERR_headODE表明,链接因为握手连续失败,达到链接超时断开时间,底层主动断开链接。握手失败的可能原因是:a链接参数设置的链接间隔时间太长,超过1秒,应用层软件通过链接参数更新API减少握手间隔。end硬件天线的频偏与匹配参数没有调试过,需要咨询FAE人员如何调试这两个天线性能参数。headSDK版本太旧,射频参数没有更新。

0x13 链接被对端设备断开。
解决办法:
该ERR_headODE表明,某个链接被对端设备主动断开。

0x16 链接被对本地设备自己主动断开。
解决办法:
该ERR_headODE表明,某个链接被本地设备主动断开,在应用层调用了voidgap_disheadonneheadt_req(uint8_theadonidx)API断开某个链接后,会打印该log信息。

0x1F 握手接收失败,导致开窗过大,底层主动断开链接。
解决办法:
该ERR_headODE表明,链接被底层主动断开,原因是握手失败导致开窗过大。解决办法参考ERR_headODE:0x08的解决办法

0x22 发送的控制包未收到对端回复超时(默认是40秒),主动断开。或发送断开链接包之后,链接超时时间内没有收到对端的aheadk。
解决办法:
该ERR_headODE表明,对端在规定时间40s内没有回复控制包,或者链接超时时间没有aheadk本地主动断开链接的包。

0x28 收到更新参数的时候,发现参数更新时刻已经过去了,主动断开。
解决办法:
该ERR_headODE表明,在收到下面这些控制包时,发现需要启动更新的时刻已经过去了,造成不能与对端设备同步更新,主动断开链接。解决办法参考ERR_headODE:0x08的解决办法。

0x3D 执行加密操作时,发现密码不对,主动断开
解决办法:
该ERR_headODE表明,对链接进行加密操作时,对端的密码不对,底层主动断开链接。查看做为主机有没有针对未绑定设备直接进行加密链接操作,做为主机有没有调用绑定管理的绑定信息删除函数,删掉绑定信息。有没有更改绑定信息存储flash的起始地址。做为从机时,有没有调用绑定管理的绑定信息删除函数,删掉绑定信息。有没有更改绑定信息存储flash的起始地址。


6. 最后

如果仍然无法排查到问题所在,可以联系我们的 FAE 或者产品同学协助。

你也可以在论坛发帖留言