目录

引言

一、广播及连接建立

1.1 广播类型

1.2 扫描/连接请求与响应

1.2.1 广播流程说明

1.2.1.1 广播流程示例图

1.2.1.2 广播信息设置

1.2.1.3 信道广播

1.2.1.4 信道切换

1.2.1.5 广播间隔

1.2.1.6 接收窗口与理论最小传输时间

1.2.2 扫描/连接流程说明

1.2.2.1 扫描/连接流程示例图

1.2.2.2 扫描请求和扫描

1.2.2.3 扫描间隔和扫描窗口

1.2.2.4 扫描请求(可选)

1.2.2.5 扫描响应(可选)

1.2.2.6 连接建立流程

二、数据信道交互中涉及的参数

2.1 Access Address 详解

2.2 CRCinit 详解

2.3 Interval详解

2.4 Timeout 详解

2.5 ChM详解

2.6 Hop详解

2.7 SCA详解


引言

上一篇讲解了广播报文以及数据报文的帧格式,这一章我们来讲广播、连接及扫描的流程

一、广播及连接建立

1.1 广播类型

BLE协议中将发送广播方称为从机,接收广播并可以选择是否发起扫描请求/连接请求的称为主机。

对于主机,BLE协议针对不同用途定义了如下几种不同的广播报文类型:

报文类型是否可扫描是否可连接用途说明
通用广播指示(ADV_IND)

用于从机主动广播其存在,支持主机进行扫描与连接。
定向连接指示(ADV_DIRECT_IND)

用于快速连接已知主机(如配对过的主机)。
不可连接指示(ADV_NONCONN_IND)用于仅广播信息、不接受连接或扫描。
可扫描指示(ADV_SCAN_IND)允许设备被扫描,但不允许连接。相比不可连接指示(ADV_NONCONN_IND),可以携带更多信息,通常用于展示信息后被查询更多内容。

由表格可知,从机不同广播报文类型主要是对扫描请求以及连接请求的支持情况不一样,因此我们重点讲解基于通用广播指示(ADV_IND)的扫描和连接请求流程。


1.2 扫描/连接请求与响应

1.2.1 广播流程说明

1.2.1.1 广播流程示例图


1.2.1.2 广播信息设置

上图为通用广播指示(ADV_IND)的报文格式示意图,由图可知其中大部分内容已被协议固定,我们重点关注以下内容:

① 发送地址类型

此字段用来标识广播报文发送者的地址类型。

  • 0:公共地址,即MAC地址
  • 1:随机地址,由从机动态生成

②Payload

6字节广播地址:根据从机广播的设计方案,填充MAC地址或者随机地址。

31字节(至多)数据:根据从机设计填充数据内容。


1.2.1.3 信道广播

当从机设置好广播信息并发起广播后,每一轮广播会在三个广播信道中依次进行,每一个信道广播完毕后会等待一个固定时间T_IFS(固定150us),这是BLE规范定义的收发切换保护时间,因为BLE本质上是半双工通信,收发不能同时进行。

T_IFS的存在给予了双方硬件和协议处理层一个稳定的时间窗口来切换状态(Rx→Tx或Tx→Rx)。


1.2.1.4 信道切换

BLE协议标准推荐每一轮广播按照37→38→39的顺序进行,同一轮广播中,三个信道的切换间隔不是固定的,主要取决于设备的调度机制和射频切换时间。

一般来说,设备会尽快在 3 个信道上发送广播数据,间隔可能在微秒到毫秒级,但不会有严格的固定值。


1.2.1.5 广播间隔

每两轮周期广播的间隔时间叫做广播间隔,这个时间是可配置的,通常在20ms到10.24s之间(具体范围受 BLE 版本和设备类型限制)。这个时间决定了广播的频率,也影响设备被发现的速度和功耗,另外有的厂商会在每轮广播(三个信道都广播完毕称为一轮)结束后插入一个0~几百us的随机延迟

低功耗设备(如 Beacon)通常设定较长的广播间隔(如 1s),而希望被快速发现的设备(如配对模式下的耳机)可能会使用较短的广播间隔(如 50ms)。

此外,为了减少碰撞概率,部分厂商会等待广播间隔 + 一定时间延迟再开始下一轮。


1.2.1.6 接收窗口与理论最小传输时间

对于从机,在某一个信道完成广播并等待T_IFS间隔后,还需要在此信道维持Rx状态一段时间,以便于接收可能到来的主机的扫描或连接请求,那么应该等待多长时间呢?

先附上连接请求和扫描请求的帧格式图:

由图可知,扫描请求包长至多22字节,连接请求包长至多44个字节。因此可计算接收窗口大小

① 1M PHY模式

        扫描请求:Rx_Period = 22Byte × 8bit / 1Mbps/s ≈ 176 us

        连接请求:Rx_Period = 44Byte × 8bit / 1Mbps/s ≈ 352 us

② 2M PHY模式

        扫描请求:Rx_Period = 22Byte × 8bit / 2Mbps/s ≈ 88 us

        连接请求:Rx_Period = 44Byte × 8bit / 2Mbps/s ≈ 176us

若接收周期内没有收到连接或扫描请求,则会切换至下一信道继续广播。实际工程上设置的接收窗口会比计算值大不少,以预留足够的冗余时间。

注意:

从机每次在某个信道广播后,必须在T_IFS间隔内从Tx模式切换到Rx模式;而主机则是确认要发起连接或扫描才会从Rx模式切换Tx模式。


1.2.2 扫描/连接流程说明

1.2.2.1 扫描/连接流程示例图

从机发送完广播后,在IFS时间内切换到接收模式,在IFS结束开始等待主机报文(即从机等待接收周期)。BLE主机扫描到从机广播后,如果需要发起连接或扫描,则在IFS时间内切换到发送模式。并在IFS时间结束后发送连接或扫描请求。

主机收到第一帧来自从机的数据信道包后,连接即建立。在此之后的数据信道包交互,就是基于interval的通信:

  • 主机 interval 起点 = 收到从机数据包时刻 
  • 从机 interval 起点 = 收到主机数据包时刻 
  • IFS 等待时间在发送/接收模式切换之间,且必须强制等待

1.2.2.2 扫描请求和扫描

在讲解扫描流程之前,我们先要区分清楚扫描请求和扫描:

① 扫描请求

这个扫描请求是可选的,其主要意义是使主机可以在建立连接之前,向从机请求查询更多信息,再决定是否要进行连接。(对于不可连接指示(ADV_NONCONN_IND)以及可扫描指示(ADV_SCAN_IND)而言,扫描单纯是为了获取更多信息。由于BLE的低功耗特性,扫描的设计使得从机可以尽可能缩短广播的报文长度,从而降低功耗。

② 扫描

扫描指的是主机按照扫描间隔和扫描窗口,周期性的在广播信道上检索从机发出的广播报文,并决定是否发起连接的流程。


1.2.2.3 扫描间隔和扫描窗口

① 扫描间隔

主机周期性按照扫描间隔在各个广播信道之间切换。

② 扫描窗口

主机切换到广播信道后,在广播信道等待广播报文的最长时间。如主机收到广播报文后,若决定发起连接,需要在T_IFS后立即返回(在从机接收周期内返回)。

注意:

从扫描和广播的机制可知:主机检测到从机的广播报文是一个概率事件,要想提高主机扫考到从机的成功率,需要合理地设计各个参数,尤其是:广播间隔、接收周期、扫描间隔、扫描窗口。


1.2.2.4 扫描请求(可选)

如果主机接收到广播包后需要获取更多信息,则可以先发起扫描请求,扫描请求包格式如下:

如图,扫描请求中需要填充如下内容:

① 接收和发送地址类型

② 扫描者地址(主机地址)和 广播者地址(从从机的广播报文中拷贝而来)


1.2.2.5 扫描响应(可选)

从机接收到主机的扫描请求后,可以选择是否回复。若选择需要回复,扫描响应格式如下:

如图,扫描响应中需要填充如下内容:

① 发送地址类型

② 广播者地址和扫描者地址(来自于扫描请求)

③ 扫描响应数据(至多31字节)


1.2.2.6 连接建立流程

连接请求的报文格式如下:

其中22字节的LL data格式如下:

字段名字段大小字段说明

Access Address

4字节

链路层连接访问地址:连接建立后,数据信道所有包的标识符(类似TCP连接的端口号)

CRCinit

3字节

数据信道包的CRC校验初始值,主设备随机生成

Winsize

1字节

TransmitWindowSize = WinSize * 1.25 ms(主设备发送首个数据包的时间窗口)

WinOffset

2字节

TransmitWindowOffset = WinOffset*1.25ms (从广播结束到首个连接事件的延迟)

Interval

2字节

ConnInterval = Interval *1.25ms(主设备发送连接事件的间隔)

Latency

2字节

从机最多可以连续跳过(不响应)多少次主机的连接事件

Timeout

2字节

规定多长时间没通信连接会断开,Timeout >(1+Latency)*(ConnInterval)

ChM

5字节

哪些信道可以使用(信道映射,标记37个数据信道的可用性,每bit代表1个信道)

Hop

5bit

跳频增量(范围5-16),用于计算下一个信道:next_ch = (curr_ch + Hop) % 37。

SCA

3bit(和Hop公用一个字节)

主设备时钟精度信息(主设备睡眠时钟精度(0=250ppm,7=500ppm),影响从设备的时序容差)

当主机在自身的扫描窗口内,检测到从机的广播报文并解析后,如果主机需要发起连接请求,则主机需要在T_IFS时间内完成从Rx模式到Tx模式的切换,并在从机的接收窗口内发送出连接或扫描请求。

从机接收到连接请求后,以下来自主机请求的参数会参与接下来的流程建立流程:


① Winsize

Winsize用于计算主机从成功发起连接请求后,到发出第一个数据信道包的时间窗口长度,如下:

TransmitWindowSize = WinSize * 1.25 ms

从机若在这个窗口期间没有收到主机发来的数据包,则连接失败。

注意:

1)窗口的计时起点:Tstart = 从机收到主机连接请求的时刻 + 1.25ms + TransmitWindowOffset

即从机需要在[Tstart ,Tstart + TransmitWindowSize ] 时间窗口内收到第一帧来自主机的数据包。

这里的1.25ms是BLE协议硬性规定,即使WinOffset 为0,也需要等待1.25ms。

2)TransmitWindowSize 和 TransmitWindowOffset 只针对第一个连接事件!


② WinOffset

WinOffset用于计算TransmitWindowOffset = WinOffset*1.25ms ,Transmit Window Offset代表着收到连接请求后,开始进行数据包窗口计时的偏移量。如下图:


③ Latency

一旦从机接收到主机的数据包,理论上就应该对数据包予以回复。但是Latency扩展了这一逻辑,该参数定义了从机最多可以连续忽略多少个主机连接事件。在Latency达到最大值之后从机必须对主机的数据包进行回复。如果Latency为0则表示从机必须监听并回复每个连接事件。

而一旦从机第一次对主机的数据包进行回复,主机就会认为连接成功建立。


二、数据信道交互中涉及的参数

2.1 Access Address详解

连接建立后,数据信道所有包的标识符都会包含此字段。


2.2 CRCinit详解

数据信道包的CRC校验初始值,主设备随机生成。此值参与后面所有数据信道包的CRC计算。


2.3 Interval详解

当主机认为建立完毕后,会周期给从机发送连接事件(连接事件发生在数据信道),后续所有的数据通信都是基于连接事件。

主机发送连接事件的周期固定,由ConnInterval参数决定:

ConnInterval = Interval *1.25ms(主设备发送连接事件的间隔)

从机也是根据ConnInterval定时监听来自主机的连接事件。双方在连接建立(即从机接收到主机的第一个连接事件并进行响应)后,约定以ConnInterval为周期进行通信,并在通信的剩余间歇进入低功耗状态。

从这个角度而言,连接建立后,BLE其实是固定周期进行数据交互的。


2.4 Timeout详解

用于规定从机多长时间没收到主机的连接事件后,连接会自动断开,Timeout >(1+Latency)*(ConnInterval)


2.5 ChM详解

哪些信道可以使用(信道映射,标记37个数据信道的可用性,每bit代表1个信道)


2.6 Hop详解

跳频增量(范围5-16),用于计算下一个使用的数据信道:下一个信道 = (当前信道+ Hop) % 37。


2.7 SCA详解

SCA用于BLE休眠场景下的时钟同步,如果你的项目是给BLE供常电,不用过于深入。


想了解更多嵌入式技术知识,请点击阅读我的其他文章

烟花的文章链接集合-CSDN博客

如果你觉得内容对您有帮助,别忘了点赞、收藏和分享支持下哦!

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

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

相关文章

JMeter 测试 WebSocket 接口的详细教程

1. 安装 WebSocket 插件 方法一:通过 Plugins Manager 下载并安装 JMeter Plugins Manager在 JMeter 中:Options → Plugins Manager搜索 WebSocket 并安装 方法二:手动安装 下载 jmeter-websocket-samplers 插件将 jar 文件放到 JMeter/…

飞算JavaAI智慧教育场景实践:从个性化学习到教学管理的全链路技术革新

目录一、智慧教育核心场景的技术突破1.1 个性化学习路径推荐系统1.1.1 学习者能力建模与评估1.2 智能教学管理系统1.2.1 自动化作业批改与学情分析1.3 教育资源智能管理系统1.3.1 教育资源智能标签与推荐二、智慧教育系统效能升级实践2.1 教育数据中台构建2.1.1 教育数据整合与…

Java面试场景题大全精简版

1.分布式系统下如何实现服务限流核心算法:固定窗口:将时间划分为固定窗口(如 1 秒),统计窗口内请求数,超过阈值则限流。实现简单但存在临界值突发流量问题。滑动窗口:将固定窗口拆分为多个小窗口…

红帽 AI 推理服务 (vLLM) - 入门篇

《教程汇总》 RedHat AI Inference Server 和 vLLM vLLM (Virtual Large Language Model) 是一款专为大语言模型推理加速而设计的框架。它是由加州大学伯克利分校 (UC Berkeley) 的研究团队于 2023 年开源的项目,目前 UC Berkeley 和 RedHat 分别是 vLLM 开源社区…

Sql server 命令行和控制台使用二三事

近来遇到了几件关于sql server的事情。 第一:低版本sqlserver备份竟然无法还原到高版本 奇怪!从来未碰到过。过程如下: 1.在低版本上中备份好了数据库 2.通过共享将文件拷贝到新服务器上 3.打开控制台,还原数据库,结果…

vue excel转json功能 xlsx

需求: 完成excel表格内容转json,excel表格内可能存在多个表格,要求全部解析出来。完成表格内合服功能,即:提取表格内老服务器与新服务器数据,多台老服务器对应合并到一台新服务器上 3.最终输出结果为:[{‘1…

Qwen-OCR:开源OCR技术的演进与全面分析

目录 一、Qwen-OCR的历史与发展 1.1 起源与早期发展(2018-2020) 1.2 技术突破期(2020-2022) 1.3 开源与生态建设(2022至今) 二、技术竞品分析 2.1 国际主流OCR解决方案对比 2.2 国内竞品分析 三、部署需求与技术规格 3.1 硬件需求 3.2 软件依赖 3.3 云部署方案 四、…

可视化+自动化:招聘管理看板软件的核心技术架构解析

引言:现代招聘的挑战与转型随着全球化和科技的迅速发展,企业的人力资源管理面临着前所未有的挑战。尤其是在招聘环节,随着人才市场的竞争日益激烈,企业必须在确保招聘质量的同时,提升招聘效率。这不仅要求招聘人员具备…

【数据结构】——栈(Stack)的原理与实现

目录一. 栈的认识1. 栈的基本概念2.栈的基本操作二. 栈的核心优势1. 高效的时间复杂度2. 简洁的逻辑设计3. 内存管理优化三. 栈的代码实现1.栈的结构定义2. 栈的初始化3. 入栈 (动态扩容)4. 出栈5. 取栈顶数据6. 判断栈是否为空7. 获取栈的数据个数8.销毁…

使用TexLive与VScode排版论文

前言 中文稿目前已经完成了,现在要转用latex排版,但我对这方面没有接触过,这里做一个记录。 网页版Overleaf:Overleaf, 在线LaTeX编辑器。 TeXWorks:论文神器teXWorks安装与使用记录。 这里我还是决定采用Vscode作…

每日一题:2的幂数组中查询范围内的乘积;快速幂算法

题目选自2438. 二的幂数组中查询范围内的乘积 还是一样的,先讲解思路,然后再说代码。 题目有一定难度,所以我要争取使所有人都能看懂,用的方法会用最常规的思想。关于语言,都是互通的,只要你懂了一门语言…

Ceph数据副本机制详解

Ceph 数据副本机制详解 Ceph 的数据副本机制是其保证数据可靠性和高可用性的核心设计,主要通过多副本(Replication) 和 纠删码(Erasure Coding,EC) 两种方式实现。以下是对 Ceph 数据副本机制的全面解析&am…

【八股】Mysql中小厂八股

MySQL 基础 数据库三大范式(中) 第一范式: 要求数据库表的每一列都是不可分割的原子数据项 如详细地址可以分割为省市区等. 第二范式: 非主键属性必须完全依赖于主键, 不能部分依赖 第二范式要确保数据库表中的每一列都和主键相关, 而不能只与主键的某一…

怎么使用python查看网页源代码

使用python查看网页源代码的方法:1、使用“import”命令导入requests包import requests2、使用该包的get()方法,将要查看的网页链接传递进去,结果赋给变量xx requests.get(urlhttp://www.hao123.com)3、用“print (x.text)”语句把网页的内容…

C# 多线程:并发编程的原理与实践

深入探讨 C# 多线程:并发编程的原理与实践引言在现代应用开发中,性能和响应速度往往决定了用户体验的优劣。尤其在计算密集型或者IO密集型任务中,传统的单线程模型可能无法有效利用多核CPU的优势。因此,多线程技术成为了解决这些问…

react 常用组件库

1. Ant Design(蚂蚁设计)特点:国内最流行的企业级 UI 组件库之一,基于「中后台设计体系」,组件丰富(表单、表格、弹窗、导航等)、设计规范统一,支持主题定制和国际化。适用场景&…

Python 爬虫获取淘宝商品信息、价格及主图的实战指南

在电商数据分析、竞品调研或商品信息采集等场景中,获取淘宝商品的详细信息(如价格、主图等)是常见的需求。虽然淘宝开放平台提供了官方的 API 接口,但使用这些接口需要一定的开发和配置工作。本文将通过 Python 爬虫的方式&#x…

Ruby面向对象编程中类与方法的基础学习例子解析

代码示例: Ruby面向对象编程中类与方法的基础学习详细例子 1. 引言 在面向对象编程(OOP)中,类是定义对象结构和行为的蓝图。Ruby是一种纯面向对象的编程语言,它将一切视为对象,包括基本数据类型。本文将…

[ Mybatis 多表关联查询 ] resultMap

目录 一. resultMap 1. 使用场景: 2. 查询映射: (1)单表查询映射: (2)多表查询映射: a. 在学生表里查专业 b. 在专业表里查学生 二. 其他注意事项 1. 插件下载 2. #{ } 和 ${ }的区别 一. resultMap 1. 使用场景: (1)当数据库列名和java类中的属性名不同时,可⽤ r…

Rust 性能提升“最后一公里”:详解 Profiling 瓶颈定位与优化|得物技术

一、Profiling:揭示性能瓶颈的“照妖镜”在过去的一年里,我们团队完成了一项壮举:将近万核的 Java 服务成功迁移到 Rust,并收获了令人瞩目的性能提升。我们的实践经验已在《RUST练习生如何在生产环境构建万亿流量》一文中与大家分…