当前位置: 首页 > news >正文

BLE 连接和通信 的实现

文章目录

      • 1、从机广播
      • 2、主机扫描
      • 3、建立连接
      • 4、发送与接收数据


为了创建和维护一个BLE连接,引入角色这一概念。
一个BLE设备不是主机Master(集中器)角色,就是从机Slave(外围设备)角色。

这是根据是谁发起这个连接来确定的:
主机Master设备总是连接的发起者,而从机Slave总是被连接者

这个访问与连接过程,都在通用访问规范(GAP)进行实现的。


1、从机广播

从机要被主机连接,它就必须先被主机发现。这个时候,从机设备把自身信息,以广播形式发射出去。
比如,设备A(Advertiser)需要先进行广播,设备A(Advertiser)不断发送 广播信号,T 为广播间隔。每发送一次广播包,称为一次广播事件(Advertising Event),因此 T 也称为广播间隔

广播间隔,它的范围是20ms到10.24s。广播间隔影响建立连接的时间。


当广播发出的时候,每一个广播事件包含三个广播包,即分别在 37/38/39 三个信道上,同时广播相同的信息。

下图 Observer 为主机观察者,Advertiser 就是从机广播。


2、主机扫描

设备A(Advertiser)不断发送广播信号给主机(Observer),如果手机不开启扫描窗口,主机是收不到设备A的广播的。
如下图所示,不仅手机要开启射频接收窗口,而且只有主机的射频接收窗口跟广播发送的发射窗口 匹配成功,手机才能收到设备A的广播信号。

由于这种匹配成功是一个概率事件,因此手机扫到设备A也是一个概率事件。
也就是说,主机有时会很快扫描到设备A,比如只需要一个广播事件;
主机有时又会很慢才能扫到设备A,比如需要10个广播事件甚至更多。

下面图表示了 主机主动扫描广播的过程:
控制器收到扫描数据包后,将向主机发送一个广播报告事件(adv_report),该事件同样包括了 链路层数据包的广播类型。因此,主机能够判断 对端设备 是否可以连接或者扫描,并且区分出广播数据包和扫描响应数据包。



3、建立连接

如图所示,手机在收到A1广播包ADV_IND后,以此为初始点,T_IFS 后给Advertiser 发送一个Connection Request命令,即A2数据包,告诉Advertiser,我将要过来连你,请你做好准备。

Advertiser 根据Connect_req命令信息,做好接收准备。
Connect_req其实是在告诉 Advertiser,手机将在 Transmit Window 期间发送第一个同步包(P1)给你,请在这段时间里把你的射频接收窗口打开。

设备B收到P1后,在 T_IFS 时间后,将给手机回复数据包P2。

一旦手机收到数据包P2,连接即可认为建立成功

后续手机将以P1为锚点(原点),Connection Interval 为周期,周期性地给设备B发送Packet。



4、发送与接收数据

连接成功后,MasterSlave在每一个 Connection Interval 开始的时候,都必须交互一次,即MasterSlave发一个包,Slave再给Master发一个包,整个交互过程称为一个 Connection Event。
蓝牙芯片只有在 Connection Event 期间才把射频模块打开,此时功耗比较高,其余时间蓝牙芯片都是处于Idle状态的。因此蓝牙芯片平均功耗就非常低。

Master不可能时时刻刻都有数据发给Slave,所以Master大部分时候发的都是空包(Empty Packet)给Slave
同样 Slave 也不是时时刻刻都有数据给 Master,因此Slave回复给Master的包,大部分时候也是空包。

另外在一个 Connection Event 期间,Master 也可以发多个包给 Slave,以提高吞吐率。

综上所述,连接成功后的通信时序图,应该如下所示:

图中,主从数据发送的数据包TX和RX表示方向性的数据通道,也就是蓝牙的空中属性,空中操作时间都是采用蓝牙操作句柄来进行的,因此句柄能够唯一表示各个属性。

空中特性的性质包括:
1、主机RX,从机TX方向
(1)通知:从机 上传数据给 主机,不需要主机回复一个响应
(2)指示:从机 上传数据给 主机,需要主机发一个确认给服务器
通知和指示之间不同点 在于指示有应用层上的确认,而通知没有。

2、主机TX,从机RX方向
(1)写
(2)没有回应的写
(3)读

http://www.jsqmd.com/news/653907/

相关文章:

  • LFM2.5-GGUF效果实测:相同硬件下对比Qwen1.5-0.5B推理吞吐量
  • 在Ubuntu 20.04上为HiWooya MT7628开发板搭建OpenWrt编译环境(含64位系统依赖避坑)
  • 技术决策的数据支持与风险评估
  • intv_ai_mk11保姆级教程:非程序员也能学会的AI提示词结构——角色+任务+约束+输出格式
  • 【ISP图像处理】从RAW到RGB:核心算法解析与Python实战
  • 030-若依pro(ruoyi-vue-pro)MyBatis 动态SQL与联表查询实战
  • 线性回归实战:用NumPy手搓梯度下降,对比Sklearn看看我们差在哪里
  • PyTorch 2.8深度学习镜像实战:从环境验证到第一个模型训练
  • DETR目标检测实战:从零搭建与核心模块解析
  • Simulink 符号解析实战:从基础概念到高效建模避坑指南
  • 2026年3月口碑好的输送带厂商推荐,pvc输送带/工业皮带/食品输送带/输送带,输送带厂商推荐 - 品牌推荐师
  • ComfyUI超分辨率实战指南:从基础放大到8K生成的深度解析
  • Qwen3-14B行业分析实战:如何快速生成深度研究报告
  • nlp_structbert_sentence-similarity_chinese-large成本控制实战:按需启停与弹性伸缩策略
  • 乙巳马年春联生成终端高算力适配:模型并行+流水线并行混合策略
  • 如何打造国际范包装设计,这家机构有妙招
  • 2024银行科技岗笔试通关秘籍:从资料准备到实战技巧
  • Wan2.2-T2V-A5B性能优化:基于数据结构设计提升视频序列生成效率
  • 使用Xshell安全连接GPU服务器部署与管理Qwen3.5-4B模型
  • 把Arduino小车升级成“扫地机器人”?低成本加装HC-SR04和舵机实现自动巡逻
  • Latex小白必看:从零开始搭建学术论文模板(含代码示例)
  • 海景美女图FLUX.1企业级运维:Prometheus+Grafana监控GPU温度/显存/请求QPS
  • 保姆级教程:用ESP-01s烧录机智云GAgent固件,一次点亮WiFi模块
  • 保姆级教程:如何为你的HIWOOYA-MT7628开发板编译定制OpenWrt固件(附dl包国内下载)
  • 矩阵图管理化技术中的矩阵图计划矩阵图实施矩阵图验证
  • uni-app——一招修复:uni-app picker在iOS真机底部弹窗左右留白/被截断的问题
  • 山东居士林:天辛大师浅谈如何用AI研究恽铁樵医学经验传承
  • 国产进芯AVP28335开发实战:从硬件选型到软件烧录的完整指南
  • LFM2.5-1.2B-Thinking-GGUF一键部署至CentOS 7生产环境:系统服务与监控配置
  • 运维工程师必备:MiniCPM-V-2_6模型服务的监控、告警与自动化运维