【应用笔记】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

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

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

相关文章

乐乐音乐鸿蒙版-支持krc歌词(动感歌词、翻译和音译歌词)

简介 乐乐音乐主要是基于HarmonyOS开发的音乐播放器,它支持lrc歌词和动感歌词(ksc歌词、krc歌词和hrc歌词等)、多种格式歌词转换器及制作动感歌词、翻译歌词和音译歌词。 开发环境 ArkTS、Stage模型、SDK3.1、 API 9 注:没试过在真机条件下调试。 功…

LLM大模型可视化-以nano-gpt为例

内容整理自:LLM 可视化 --- LLM Visualization (bbycroft.net)https://bbycroft.net/llm Introduction 介绍 Welcome to the walkthrough of the GPT large language model! Here well explore the model nano-gpt, with a mere 85,000 parameters. 欢迎来到 GPT 大…

什么是数据结构

一、什么是数据结构 1.数据结构研究计算机数据间的关系 2.包括数据的逻辑结构和储存结构及其操作 数据的逻辑结构:表示数据运算之间的抽象关系 按每个元素可能具有的直接前趋数和后继数将逻辑结构分为“线性结构”和“非线性结构”两大类 数据的储存结构&#…

【JavaSE】初识线程,线程与进程的区别

文章目录 ✍线程是什么?✍线程和进程的区别✍线程的创建1.继承 Thread 类2.实现Runnable接口3.匿名内部类4.匿名内部类创建 Runnable ⼦类对象5.lambda 表达式创建 Runnable ⼦类对象 ✍线程是什么? ⼀个线程就是⼀个 “执行流”. 每个线程之间都可以按…

【JavaWeb】Day24.Web入门——SPringBootWeb入门

什么是SPring? 我们可以打开Spring的官网(Spring | Home),去看一下Spring的简介:Spring makes Java simple。Spring的官方提供很多开源的项目,我们可以点击上面的projects,看到spring家族旗下的项目,按照流…

Qt中QMutex和QMutexLocker

一.QMutex和QMutexLocker知识介绍 QMutex是Qt中的一个互斥锁,用于保护共享数据不被多个线程同时修改。 QMutexLocker是一个辅助类,它简化了对QMutex的锁定和解锁过程。 当创建一个QMutexLocker实例时,它会自动锁定关联的QMutex。当QMutexLoc…

汇编语言第四版-王爽第2章 寄存器

二进制左移四位,相当于四进制左移一位。 debug命令实操,win11不能启动,需要配置文件 Windows64位系统进入debug模式_window10系统64位怎么使用debugger-CSDN博客

MHA高可用配置

一、MHA的概念 二、MHA 组成 3.1 MHA Node(数据节点) 3.2 MHA Manager(管理节点) 三、MHA的工作原理 四、MHA 的特点 4.1 同步复制 4.2 异步复制 4.3 半同步复制 五、MHA部署与配置 5.1 主从环境 5.2 安装MHA所有组件 5.3 在所有服务器上配置无密码认证 5.4 在 ma…

MES_ENT_STD

生产执行系统(企业标准版)MES_ENT_STD ERP_ENT_STD_59438.ieqq.ent-CSDN博客 OAMS_ENT_STD-CSDN博客

WPF上使用MaterialDesign框架---下载与配置

一、介绍: Material Design语言的一些重要功能包括 系统字体Roboto的升级版本 ,同时颜色更鲜艳,动画效果更突出。杜拉特还简要谈到了新框架的一些变化。谷歌的想法是让谷歌平台上的开发者掌握这个新框架,从而让所有应用就有统一的…

瑞吉外卖实战学习--9、mybatisPlus公共字段自动填充

mybatisPlus公共字段自动填充 前言实现步骤实体类添加注解按照框架要求编写元数据对象处理器,在此类中统一为公共字段赋值,此类需要实现MetaObjectHandler接口1、在创建和更新的时候修改创建和更新的时候自动填充时间2、如何获取到当前的id 测试结果 前言…

webGIS 之 智慧校园案例

1.引入资源创建地图 //index.html <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content&qu…

汇编语言第四版-王爽第1章 基础知识

前言 基础知识 &#xff08;1&#xff09;换成bit&#xff0c;1KB1024B&#xff0c;1Byte8bit&#xff1b;1KB1024*8bit&#xff0c;即2的13次方&#xff0c;宽度为13. &#xff08;2&#xff09;1个存储单元只能放1个字节&#xff0c;1KB1024B&#xff1b;编号从0到1023. &a…

蓝桥杯刷题第六天(去年蓝桥杯买二赠一全网都错了?)

今天主要刷了两道很有意思的题目&#xff0c;使我完全想放弃蓝桥杯了&#xff0c;其中一道全网答案都是错的 这道题感觉用贪心做不了吧 很多特例比如&#xff1a; 6 12 23 25 25 50 50 全网模板算得都是160&#xff0c;我试了很多种办法好像似乎也就暴力遍历可以解决。 学…

Kubernetes(K8S)学习(二):K8S常用组件

K8S常用组件 一、 Controllers1、ReplicationController(RC)2、ReplicaSet(RS)3、Deployment 二、Labels and Selectors三、Namespace&#xff08;命名空间&#xff09;1、简介2、测试2.1、创建namespace2.2、创建pod 四、Network1、集群内&#xff1a;同一个Pod中的容器通信2、…

Docker 轻量级可视化工具 Portainer

1. 是什么 它是一款轻量级的应用&#xff0c;它提供了图形化界面&#xff0c;用于方便管理Docker环境&#xff0c;也包括单机环境和集群环境。 2. 安装 官网&#xff1a;Kubernetes and Docker Container Management Software 安装路径&#xff1a;Install the Compose plug…

基于YOLOV5+Pyqt5农作物叶片病害检测系统

1、引言 农作物病害的精准检测与识别是推动农业生产智能化与现代化发展的重要举措。随着计算机视觉技术的发展&#xff0c;深度学习方法已得到快速应用&#xff0c;利用卷积神经网络进行农作物病害检测与识别成为近年来研究的热点。基于传统农作物病害识别方法&#xff0c;分析…

vue3封装Element表格

配置表头配置多选配置序号自定义操作列按钮 封装表格 Table.vue <template><el-table:data"tableData"width"100%":maxHeight"maxHeight"v-bind"$attrs"selection-change"handleSelectChange"row-click"hand…

Docker搭建LNMP环境实战(10):大结局!脚本化一次性安装测试、生产环境

实现使用 Docker 在一台服务器上搭建支持 80、443 端口访问的测试、生产双站点系统。 1、生产环境&测试环境的规划和部署 1.1、说明 图1 系统部署示意图 1&#xff09;项目 此处以一个演示项目的形式来进行环境的规划和部署。此项目名称默认定义为&#xff1a;“demo”&a…

考研数学|零基础张宇全年复习规划+资料分享

可以全程张宇老师的高等数学&#xff0c;张宇老师的拿手绝活是 但是其他科目&#xff0c;还有更好的选择&#xff0c;比如线性代数&#xff0c;汤家凤老师还有李永乐老师讲的都不错&#xff0c;概率论&#xff0c;余丙森老师还有方浩老师讲的很好。下面我就讲清楚&#xff0c;…