【应用笔记】LAT1413+快速开关蓝牙导致设备无广播

news2025/1/4 17:43:56

1. 问题背景

客户使用 BlueNRG-345MC 开发了一个 BLE 外设,和手机连接。在测试中发现,手机连接上外设之后,不断地在手机上点击蓝牙的开关按钮,造成设备不断地断开、重连;少则几次,多则几十次。点击之后,必然出现 BLE 外设无广播信号的现象。该问题已经得到了解决。本文将展开聊聊该问题的解决过程和思路,并就该问题总结、分享一些 BLE 连接过程的处理经验。

2. 定位问题

拿到该反馈描述后,第一时间和客户沟通了几个问题,明确了大概的方向。沟通的思路按照:硬件问题、软件问题?硬件问题是和设备相关,板子相关、还是芯片相关?软件问题根据设备类型,是和 APP 相关、手机系统相关、BLE 主机固件相关、还是 BLE 外设固件相关这样的思路进行排查。通过以下问题,粗略地进行问题的定位:

“对端设备是什么,如果是手机的话,是否有 APP?“——对端是手机,并且有配套的APP。该问题确定了设备类型,和软件类型。

“该问题是否必现,且稳定复现,问题出现后,状态是否能保持?“——问题稳定复现且必现,而且状态能保持,这是一个重要的依据,由此依据,我们可以进一步发问:

“杀死配套 APP 的后台,用其它手机、第三方 APP(BLE 调试助手等)是否能搜到设备的广播信号“——杀死配套 APP 的后台,确保设备断连、处于广播状态,然后通过第三方的手机、APP 搜索设备的广播,确定当问题出现后,出现异常的是主机方、还是从机方。客户反馈第三方 APP 搜索不到该设备,说明此时从机方出现了异常且保持在异常状态中。

“问题出现后,设备是否还能正常运行“——确定了从机方出现异常后,我们需要进一步定位该异常。该问题可确认问题是局部问题,还是系统问题。如果此时系统还能正常运行(比如,有 LOG 输出,有 LED 闪烁,有按键反应等),就说明是局部问题,系统还没死机。客户反馈系统还正常,这真是一个好消息!蓝牙问题最怕是系统性的问题,即因为系统奔溃,导致的蓝牙奔溃,如果是系统性的问题,那可能性就多很多了,丢给客户的问题就可能包括:

  • “是否和低功耗管理有关,关掉低功耗试试?”
  • “是否和特定板子有关,换块板试试?”
  • “是否和供电稳定性有关,用直流电源试试?电量低是否更容易复现?”……

既已确定了是局部蓝牙的问题,那么,如果对蓝牙的 LL 状态机和基本的 GAP 流程熟悉的话,那基本就可以通过这个问题来定位该问题了:
“请仔细检查下用户层的操作逻辑,是否能确保蓝牙断连时,必能调用使能广播的 API,且拿到成功的状态返回?”——客户拿到该问题后,不知道从何下手,于是,现场支持。

3. BLE 背景知识

话接上文,解决该问题需要对 LL 状态机和 GAP 流程有一定的了解。本章节便先对相关背景知识先做一个补充陈述。
蓝牙链路层(Link Layer)的运转过程可通过一个状态机进行描述。蓝牙从机的状态机简单描述如下:
图1. LL 状态机
在这里插入图片描述
对于该状态机的理解,需要注意以下几点:

  • • 设备断开连接之后,LL 层进入的是 Standby 状态,而不会自动重新发起广播,此时必须由 Host 主动启动广播才能让设备被主机搜索到。
  • • 设备处于 Standby 状态时,必须先进入广播状态,才能由此进入连接状态。对于从机,如果设备不进入广播状态,即使主机发起回连,也不可能被连接成功。
  • • 广播中的设备,当它被上层停止广播、或者被主机连接时,便会退出广播状态。此处需要注意的是,当链路建立,协议栈会将链路建立事件层层上传,其中,就包括 GAP层 。GAP 层在接收到链路建立事件之后,便会开始执行一系列的流程……

这些流程包括,特性交换流程,MTU 交换流程,连接参数更新流程,安全流程(配对流程、绑定流程、加密流程),GATT 服务发现流程等。刚连上那会的几秒钟,是 BLE 外设最繁忙的时间段,也是最容易出现问题的时间段。有经验的工程师,一般都会将一些时间敏感的任务的处理,和这段时间段进行错开。下面的序列图描述了这一过程:
图2. GAP 序列图
在这里插入图片描述

从图中可知,从机协议栈遵循 LL 状态机的运转流程,在三个状态中切换;用户层在断开回调函数中,必须稳妥地开启广播,才能让协议栈从机的状态机按照我们的预期运转。

4. 解决问题

相信通过 BLE 背景知识的介绍,部分人已经大概了解了问题的原因了。到达客户现场调试时,通过蓝牙抓包器、并让客户当场复现问题,我把蓝牙主、从机的空中交互过程记录下来。仔细观察抓包器的记录过程,发现当问题发生时,断开连接的事件出现得非常早期:在链路建立、特性交换流程刚执行完后,即发生了断连。
图3. 蓝牙抓包记录
在这里插入图片描述

仔细检查客户的代码,果然,客户将连接成功的依据放在了 MTU 交换成功之后,即,用户层的蓝牙连接状态,和实际的链路层的连接状态,在快速操作蓝牙开、关的动作之后,脱钩了!该问题可通过下面的序列图描述:

图4. 问题图示
在这里插入图片描述

之所以把蓝牙连接成功的标志,在 MTU 交换成功的回调中置位,客户的想法很简单:用户层需要依据 MTU 的大小,来决定用户层数据包的尺寸,而用户工程师发现,每次蓝牙连接时,MTU 交换完成回调函数都会被执行,于是,想当然的认为可以依据该回调来设置用户层蓝牙的连接标志。

发现了问题的根因后,解决方法也比较简单,把置位连接成功标志的动作,放到连接建立回调函数中即可。

5. 小结

蓝牙协议栈是个分层的协议,当我们说蓝牙已连接时,想表达的意思应该是链路层链路建立,而现实中,很多工程师都把蓝牙已连接理解成了可以收、发数据了。实际上,从蓝牙链路建立,到协议栈可以为用户层收、发数据,中间还差了十万八千里。总而言之,从本文的解题思路出发,我总结以下几点经验:

  • • 用户程序应该深刻理解“蓝牙已连接”的概念, 做好状态管理。
  • • 链路建立后是蓝牙最繁忙的时刻,用户任务处理应尽可能避开该时间段。
  • • 加快链路建立繁忙时间段的方法包括:
    -o 链路建立后,使用较快的连接间隔,并在之后调慢以平衡功耗
    -o 使用 GATT CACHING 特性

本文档参考ST官方的《【应用笔记】LAT1315+串口DMA接收不定长数据的一种方法》文档。
参考下载地址:https://download.csdn.net/download/u014319604/89055623

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1559396.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【前端面试3+1】07vue2和vue3的区别、vue3响应原理及为什么使用proxy、vue的生命周期中在什么时期给接口发请求、【找出数组最大公约数】

一、vue2和vue3的区别 1.性能优化: Vue 3在性能方面有很大的提升,主要是通过虚拟DOM的优化和响应式系统的改进实现的。 虚拟 DOM 重构:Vue 3 中对虚拟 DOM 进行了重构,使得更新算法更加高效,减少了更新时的开销&#x…

【电路笔记】-快速了解数字逻辑门

快速了解数字逻辑门 文章目录 快速了解数字逻辑门1、概述2、集成电路的分类3、摩尔定律4、数字逻辑状态5、数字逻辑噪声6、简单的基本数字逻辑门7、基本 TTL 逻辑门8、发射极耦合数字逻辑门9、集成电路的“74”子族10、基本 CMOS 数字逻辑门数字逻辑门是一种电子电路,它根据其…

CI/CD实战-jenkins结合ansible 7

配置主机环境 在jenkins上断开并删除docker1节点 重新给master添加构建任务 将server3,server4作为测试主机,停掉其上后面的docker 在server2(jenkins)主机上安装ansible 设置jenkins用户到目标主机的免密 给测试主机创建用户并…

STL —— string(终)

目录 1. swap() 函数的模拟实现 2. find() 函数的模拟实现 3. substr() 函数的模拟实现 4. operator()的重载模拟实现 5. << 和 >> 重载的模拟实现 6. getline() 的重载 7. 拷贝构造的现代写法 8. 赋值重载的现代写法 本片文章还是主要讲解 string 类中剩…

运维经验|Linux虚拟机如何挂载磁盘

&#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端工程师 &#x1f3c6; 近期荣誉&#xff1a;华为云云享专家、阿里云专家博主、腾讯云优秀创作者 &#x1f525; 三连支持&#xff1a;欢迎 ❤️关注、&#x…

路径规划——搜索算法详解(五):Dynamic A Star(D*)算法详解与Matlab代码

昨天休息了一天&#xff0c;今天继续学习搜索算法&#xff01;前几天已经分别介绍了Dijkstra算法、Floyd算法、RRT算法、A*算法&#xff0c;无独有偶&#xff0c;上述算法都只适用于静态环境下两点规划的场景&#xff0c;但是大部分场景是实时变化的&#xff0c;这对规划算法提…

二叉树的深度优先遍历(前中后)

1. 前序遍历 前序遍历是先输出根节点&#xff0c;再输出左子树&#xff0c;最后输出右子树。 2. 中序遍历 中序遍历&#xff0c;左子树&#xff0c;根节点&#xff0c;右子树 3. 后序遍历 左子树&#xff0c;右子树&#xff0c;根节点 4. 代码实现&#xff08;递归形式&…

Vulnhub:BROKEN: GALLERY

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb WEB wen信息收集 目录扫描 进制转换 ssh登录 提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali/vulnhub] └─# arp-scan -l Interface: eth0, type: EN10MB, M…

向量点乘有哪些作用呢

如下&#xff1a; 1.找到两个向量之间的夹角(不用多说) 2.求一个向量投影在另一个向量的投影&#xff1a; 我们把图中b的在a上的投影向量称作b1吧&#xff0c;因为b1就在a上&#xff0c;所以只需要求出b1的大小&#xff0c;然后乘以a的单位向量&#xff0c;我们就得到向量b1了…

Bezier曲线

1. 实验要求 2. Bezier曲线的原理 以及 公式推导 参考贝塞尔曲线&#xff08;Bezier Curve&#xff09;原理及公式推导_bezier曲线-CSDN博客 Bezier曲线的一些特性&#xff1a; 使用n个控制点来控制曲线形状 曲线通过起始点和终止点&#xff0c;接近但不通过中间点 2.1 直观…

结构化绑定optional(C++基础)

结构化绑定 处理多个返回值的操作&#xff1a;C17提出 之前多返回值喜欢用struct来返回。现在会做成元组&#xff0c;下图中设置C17的版本&#xff0c;不要设置错为C语言标准。 #include<iostream> #include<string> #include<tuple> std::pair<std::st…

ubuntu下给不同串口设置别名

目录 一、绑定设备ID 1.查看设备ID 2.编写usev规则 3.重新加载usev规则 4.查看 二、绑定USB端口号 1.先插入一个串口&#xff0c;查看USB设备信息 2.查看USB转串口信息 3.编写usev规则 4.重新加载usev规则 5.查看 在Ubuntu环境下&#xff0c;有时候工控机或者arm开…

新增收货地址

目录 &#x1f9c2;1.创建controller层 &#x1f953;2.创建service层 &#x1f32d;3.注意细节 &#x1f37f;4.避免dao数据暴漏 1.创建controller层 controller不做逻辑操作&#xff0c;只接受前端的数据 1.添加Api设置swagger模块名称2.RestController以json形式返回…

CAJViewer8.1下载地址及安装教程

CAJViewer是中国学术期刊&#xff08;CAJ&#xff09;全文数据库的专用阅读软件。CAJViewer是中国知识资源总库&#xff08;CNKI&#xff09;开发的一款软件&#xff0c;旨在方便用户在线阅读和下载CAJ数据库中的学术论文、期刊和会议论文等文献资源。 CAJViewer具有直观的界面…

2000-2021年各省技术市场发展水平数据(原始数据+计算结果)

2000-2021年各省技术市场发展水平数据&#xff08;原始数据计算结果&#xff09; 1、时间&#xff1a;2000-2021年 2、来源&#xff1a;国家统计局、统计年鉴 3、范围&#xff1a;30省 4、指标&#xff1a;技术市场成交额、国内生产总值、技术市场发展水平 5、计算说明“技…

java字符串(一)-- 字符串API,StringBuffer 和 StringBuilder,Object

String字符串相关的类 String的特性 String类&#xff1a;代表字符串。Java 程序中的所有字符串字面值&#xff08;如"abc" &#xff09;都作为此类的实例实现。String类是引用数据类型。 在 Java 8 中&#xff0c;String 内部使用 char 数组存储数据。 public fi…

C++的入门学习

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一、C关键字(C98) 二、命名空间 2.1 引入 ​编辑2.2 命名空间定义 2.3 命名空间的使用 三. C输入&输出 四.缺省参数 4.1 缺省参数概念 4.2 缺省参数分类 1.全缺省参数 2…

MCGS学习——水位控制

要求 插入一个水罐&#xff0c;液位最大值为37插入一个滑动输入器&#xff0c;用来调节水罐水位&#xff0c;滑动输入器最大调节为液位最大值&#xff0c;并能清楚的显示出液位情况用仪表显示水位变化情况&#xff0c;仪表最大显示设置直观清楚方便读数&#xff0c;主划线为小…

基于spark的大数据分析预测地震受灾情况的系统设计

基于spark的大数据分析预测地震受灾情况的系统设计 在本篇博客中,我们将介绍如何使用Apache Spark框架进行地震受灾情况的预测。我们将结合数据分析、特征工程、模型训练和评估等步骤,最终建立一个预测模型来预测地震造成的破坏程度,同时使用可视化大屏的方式展示数据的分布…

提升 RAG 效果的实践

提升 RAG 效果的实践 0. 引言1. 测试数据2. cohere/embed-multilingual-v3.0 的几组测试结果2-1. 第1组测试2-2. 第2组测试 3. BAAI/bge-m3 的几组测试结果3-1. 第1组测试 0. 引言 AI 大语言模型的主要应用方式之一就是 RAG&#xff0c;接下来计划陆续分享工作中提升 RAG 效果…