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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【小贪】万字长文介绍因果推断和增益模型

文章目录 因果推断和增益模型1. 绪论2. 因果推断基础3. 主要增益模型3.1 Meta Learning3.1.1 S-Learner(One Model)3.1.2 T-Learner(Two Model)3.1.3 R-Learner3.1.4 X-Learner3.1.5 类别转换法(Class Transformation …

2024年noc指导教师认证测评参考试题题目5-6合集

[noc指导教师认证] 测评参考试题 说明:NOC教师指导认证考试题目是从题库里抽题,因此每位老师每次考试题目都不一样以下题目为测试考试时收集到的一些题目,作为辅助提供给各位老师,老师们可以记住题目及答案的具体内容 (选项顺序会变),以免考试时遇到。2024年的做的题目有的…

.Websalm勒索病毒数据恢复|金蝶、用友、管家婆、OA、速达、ERP等软件数据库恢复

导言: 在数字化时代,网络安全问题日益凸显,其中勒索病毒作为一种新型的电脑病毒,以其独特的传播方式和恶劣的性质,给广大用户带来了巨大的困扰。近期,Websalm勒索病毒成为了公众关注的焦点,其强…

【图轮】【 最小生成树】【 并集查找】1489. 找到最小生成树里的关键边和伪关键边

本文涉及知识点 图轮 最小生成树 并集查找 关键边 1489. 找到最小生成树里的关键边和伪关键边 给你一个 n 个点的带权无向连通图,节点编号为 0 到 n-1 ,同时还有一个数组 edges ,其中 edges[i] [fromi, toi, weighti] 表示在 fromi 和 to…

【C++庖丁解牛】自平衡二叉搜索树--AVL树

🍁你好,我是 RO-BERRY 📗 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油 目录 前言1 AVL树的概念2. AVL…

【A-006】基于SSH的新闻发布系统(含论文)

【A-006】基于SSH的新闻发布系统(含论文) 开发环境: Jdk7(8)Tomcat7(8)MySQLIntelliJ IDEA(Eclipse) 数据库: MySQL 技术: SpringStruts2HiberanteJSPJquery 适用于: 课程设计,毕业设计&…

玩转Django分页器

一、Pagination 分页器编程步骤 View, 导入django.core.paginator.Paginator类,创建Paginator 对象时,输入qs对象,以及每页显示条数。 接收 URL, 从请求参数中读取page数值 ,通过 paginator.page(page_num) 返回请求页的page_obj…

ObjectiveC-05-复杂和特殊数据类型

这一节中会详细介绍下ObjectiveC中的复杂数据类型,这些类型不太是太归类。但非常有用,有的用于定义变量、有的则是专门用于方法的返回值。 常用的大概有如下这些: 以上这些特殊的数据类型都可用于变量、方法返回值、方法参数使用&#xff0c…

目标伪类选择器

E:target选择匹配E的所哟元素&#xff0c;且匹配元素被相关url指向 鼠标点击右边京东秒杀跳转到京东秒杀div&#xff0c;并变成黄色 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport&…

HTML块级元素和内联元素(头部和布局)

目录 1.HTML块级和内联标签&#xff1a; 1.块级元素&#xff1a; 2.内联元素: 3.元素嵌套&#xff1a; 4.元素转换&#xff1a; 示例如下: 2.内联框架&#xff1a; 前言&#xff1a; 示例如下: 3.布局&#xff1a; 4.头部标签&#xff1a; 前言&#xff1a; 说明&…

Java获取当前时间

获取当前的时间 在Java中获取时间和日期使用Date类中的 toString方法 import java.util.Date;public class DateDemo {public static void main(String[] args) {Date date1new Date();System.out.println(date1.toString());} } 进一步格式化时间 SimpleDateFormat 是格式化…

Netty组件优化之FastThreadLocal

ThreadLocal:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/132995427 Netty中的FastThreadLocal是对Java中的FastThreadLocal的优化主要是为了解决ThreadLocal中线性查找 带来的性能下降同时实现快速查找和赋值 FastThreadLocal构建这里的index代表一个编号&#xff0c;从…

ROS机器人入门第五课:话题通信自定义msg

文章目录 ROS机器人入门第五课&#xff1a;话题通信自定义msg一、介绍二、流程&#xff08;一&#xff09;定义msg文件&#xff08;二&#xff09;编辑配置文件&#xff08;三&#xff09;编译 三、话题通信自定义msg调用&#xff08;一&#xff09;调用流程0.vscode配置1.发布…

论文笔记 - :MonoLSS: Learnable Sample Selection For Monocular 3D Detection

论文笔记✍MonoLSS: Learnable Sample Selection For Monocular 3D Detection &#x1f4dc; Abstract &#x1f528; 主流做法限制 &#xff1a; 以前的工作以启发式的方式使用特征来学习 3D 属性&#xff0c;没有考虑到不适当的特征可能会产生不利影响。 &#x1f528; 本…

基于java+SpringBoot+Vue的网上书城管理系统设计与实现

基于javaSpringBootVue的网上书城管理系统设计与实现 开发语言: Java 数据库: MySQL技术: SpringBoot MyBatis工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 整体功能包含&#xff1a; 网上书城管理系统是一个基于互联网的在线购书平台&#…

基于springboot实现旅游网站系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现旅游网站系统演示 摘要 随着科学技术的飞速发展&#xff0c;各行各业都在努力与现代先进技术接轨&#xff0c;通过科技手段提高自身的优势&#xff0c;旅游网站当然也不能排除在外&#xff0c;随着旅游网站的不断成熟&#xff0c;它彻底改变了过去传统的旅游…

CI/CD实战-jenkins结合ansible 7

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

windows操作系统本地部署开源语言模型ChatGLM3-6b,超详细

前言 首先感谢智谱AI和清华大学 KEG 实验室联合开源的ChatGLM3对话预训练模型&#xff0c;让我们国人有属于自己的AI聊天机器人。 ChatGLM3-6B 的基础模型 ChatGLM3-6B-Base 采用了更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不…

mysql 用户管理-权限管理

学习了用户管理&#xff0c;再学习下权限管理。 3&#xff0c;权限管理 权限管理主要是对登录到MySQL的用户进行权限验证。所有用户的权限都存储在MySQL的权限表中&#xff0c;不合理的权限规划会给MySQL服务器带来安全隐患。数据库管理员要对所有用户的权限进行合理规…

C++练级之路——C++入门

1、命名空间 在C/C中会出现大量的变量&#xff0c;函数&#xff0c;起名字是一个很大的问题&#xff0c;为了防止命名重复&#xff0c;就出现了命名空间的概念&#xff0c;使用命名空间的目的是对标识符的名称进行本地化&#xff0c;以避免命名冲突和名字污染 #include <st…