BLE 协议之链路层

目录

  • 一、前言
  • 二、状态和角色
  • 三、Air Interface Packets
    • 1、Preamble 字段
    • 2、Access Address 字段
      • 2.1 静态地址
      • 2.2 私有地址
    • 3、PDU 字段
      • 3.1 Advertising Channel PDU
        • 3.1.1 Header 字段
        • 3.1.2 Payload 字段
      • 3.2 Data Channel PDU
        • 3.2.1 Header 字段
        • 3.2.2 Payload 字段
    • 4、CRC 字段
  • 四、小结


一、前言

在 BLE 协议之物理层
一文中,我简单介绍了 BLE 的物理层。接下来就是链路层(Link Layer)了,它主要的功能,就是在这些 Physical Channel 上收发数据,与此同时,不可避免的需要控制 RF 收发相关的参数。除此之外,还要做到以下几个功能:

  • 通道共享Physical Layer 仅仅提供了有限的 40 个 Physical Channel,而 BLE 中参与通信的实体的数量,肯定不是这个数量级。 Link Layer 需要解决 Physical Channel 的共享问题
  • 抽象出逻辑链路 :通信是两个实体之间的事情,对这两个实体来说,它们希望看到一条为自己独享的传输通道(就是我们所熟悉的 逻辑链路,Logical Link)。这也是 Link Layer 需要解决的
  • 可靠传输Physical Channel 是不可靠的,任何数据传输都可能由于干扰等问题而损毁、丢失,这对有些应用来说,是接受不了的。因此 Link Layer 需要提供校验、重传等机制,确保数据传输的可靠性

接下来,就看一下链路层都做了哪些事。

二、状态和角色

BLE 协议在 Link Layer 层抽象出 5 种状态 :

  • Standby State待机状态,不发送数据,也不接收数据。该状态可以由任何状态进入,也可以切换到除 Connection State 外的任意一种状态。
  • Advertising State广播状态,可以发送,监听,响应广播通道包,由 Standby State 进入。
  • Scanning State扫描状态,能够监听广播设备发送的广播包,由 Standby State 进入。
  • Initiating State初始化状态,监听指定设备的广播通道包,并且响应广播包,并发送连接请求,以便和广播设备建立连接。当连接成功后, Initiater 和对应的 Advertiser 都会切换到 Connection State。该状态由 Standby State 进入。
  • Connection State :和某个实体建立了单独通道的状态,在通道建立之后,由 Initiating StateAdvertising State 进入。通道断开后,会重新回到 Standby State

进入 Connect State 后,又定义了两种角色 :

  • Master Role :由 Initiating State 进入的 Connect State ,连接成功后,变成了 Master Role
  • Slave Role :由 Advertising State 进入的 Connect State ,连接成功后,变成了 Slave Role

一个状态机在同一时刻有且只能处于一个状态。但是,一个 BLE 设备在同一时刻可以拥有多个独立的状态机!多个状态机并存的情况有限制条件。以下为几种有效的组合状态:

  • Connection + Advertising
  • Connection + Initiating
  • Connection(Master) + Connection(Master)

这也就意味着,BLE 协议栈是支持一主多从这种连接模式的。不过要注意,不支持一从多主模式,即一个从机同时与多个主机相连。并且,一个 BLE 设备在同一时刻不能同时为主机和从机角色。

三、Air Interface Packets

状态和角色定义完成后,剩下的事情就简单了,主要包括两类:

  • 提供某一状态下,和其它实体对应状态之间的数据交换机制 ;
  • 根据上层实体的指令,以及当前的实际情况,负责状态之间的切换 。

BLE 协议中,这些事情是由空中接口数据包(Air Interface Packets)完成的。

Air Interface Packets 定义了一种包的格式,主要用于描述 LE Uncoded PHYadvertising channeldata channel 的通信格式 。

其格式如下:

Core5.4 P2684

下面对各个字段继续详细分析。

1、Preamble 字段

Preamble(前导码): 是 0 和 1 的交替序列:

  • 当物理通道为 LE 1M PHY 时,前导码为 1Byte ;
  • 当物理通道码为 LE 2M PHY 时,前导码为 2Byte 。

2、Access Address 字段

Access Address :对于所有在广播通道发送的数据包,其值都为 0x8E89BED6

一旦链路层处于 Initiating State 状态时,会生成一个新的 Access Address 用于连接。该 Access Address 为一个 4Byte 的值。

蓝牙使用 Access Address 来标识不同的设,Access Address 可以是一个公共的地址,也可以是一个随机的地址 ,无论是哪一种类型的地址,均为 48bits 长度。

  • 公共地址 :官方定义的一些规范,通用的地址,这里不做解释。
  • 随机地址 :可能是静态地址 ,或者是私有地址 。

2.1 静态地址

Core5.4 P2679

静态地址一般都是随机生成的,但是需要满足下面的几点规则:

  • 地址的 两个最高有效位应该等于 1
  • 随机地址部分,至少有一位为 0
  • 随机地址部分,至少有一位为 1

大多数的设备(手机)都是在上电之后,初始化一次静态地址,一旦初始化后,静态地址就不变了;重新上电后,会生成新的静态地址。

2.2 私有地址

Core5.4 P2680

私有地址又分为 :不可解析私有地址和可解析的私有地址。

  1. 不可解析的私有地址

不可解析私有地址,遵守以下生成规则:

  • 地址的两个最高有效位应该等于 0
  • 随机地址部分,至少有一位为 0
  • 随机地址部分,至少有一位为 1
  • 不能与公共地址有冲突

  1. 可解析的私有地址

可解析的私有地址,说直白点就是带加密算法所生成的。设备需要有 Local Identity Resolving Key(IRK) 或者 the Peer Identity Resolving Key (IRK) 这两个密钥,生成 24bit 的号码,

可解析的私有地址,遵守以下规则:

  • 地址的 两个最高有效位为 0 和 1
  • 随机地址部分,至少有一位为 0
  • 随机地址部分,至少有一位为 1

总结最高有效位的前两位,代表了设备地址的类型

3、PDU 字段

前面介绍过,Physical Layer 将通道分为广播通道和数据通道,那么 Link Layer 也随之对应划分了两种 PDU 类型。

PDUPackage Data Unit) :分为两种:

  • 广播通道上传输(Advertising Channel PDU);
  • 数据通道上传输(Data Channel PDU),长度为 2-257 字节。

3.1 Advertising Channel PDU

广播通道 PDU ,包括 Advertising PDUScanning PDUInitiating PDU 三种类型。

广播通道的 PDU ,由 16bit 的数据头和 1-255Byte 的可变大小数据组成。

3.1.1 Header 字段

下面是 16bit 的数据头格式:

PDU Type 有多种,详细参考 core 5.0 P2690


  • ChSel :该位为 1,支持 LE Channel Selection Algorithm ,即 LE通道选择算法 ,反之,不支持。
  • TxAdd :该位为 0,表明 Payload 的 AdvA 字段为公共的;该位为 1,表明 Payload 的 AdvA 字段为随机的。
  • Length :该字段表明了 Payload 的长度
3.1.2 Payload 字段

Payload字段组成如下 :

常见的 Advertising PDU 有 :

  • ADV_IND :该 PDU 用于连接和扫描无定向的广播事件。

  • ADV_DIRECT_IND :该 PDU 用于连接和扫描定向的广播事件。

  • ADV_NONCONN_IND :该 PDU 用于不可连接和不可扫描的非定向广播事件

  • ADV_SCAN_IND :该 PDU 仅可用于可扫描的非定向广播事件

常见的 Scaning PDU 有 :

  • SCAN_REQ :该 PDU 为发送扫描请求
  • SCAN_RSP :该 PDU 包括了广播者的地址和返回的扫描响应数据。

常见的 Initiating PDU 有 :

  • CONNECT_IND :该 PDU 用于建立连接


    综上可见,每一种 PDU Type ,都会定义自己的 Payload 组成。

3.2 Data Channel PDU

数据通道 PDU 的格式,包括 16bit 的 Header ,可变大小的 Payload ,以及可选的消息完整性检查 MIC 字段。

包的格式如下:

3.2.1 Header 字段
  • Header 包括:

  • LLID :该字段标识了这个包为 LL Data PDU 或者 LL Control PDU
  • NESN :下次期望的序列号

3.2.2 Payload 字段

根据 LLID 字段,Data Channel PDU 又分为 LL Data PDULL Control PDU 两种类型。

  • LL Data PDU :该 PDU 用于发送链路层的数据。
    • 当 LLID 为 01b 时,并且 Length=0 时,表示一个 Empty PDU 。
    • 当 LLID 为 10b 时,则 Length 不能设置为 0。
  • LL Control PDU :该 PDU 用于控制链路层的连接。

Opcode 操作码也有多种:

每一种操作码对应不同的数据长度。详细可见 core5.0 P2716

4、CRC 字段

  • CRC 字段:在链路层包的最后,校验所有的 PDU 数据,大小长度为 3Byte 。

如果 PDU 数据加密,则 CRC 将会计算加密后的 PDU 数据。

CRC 算法采用多项式求和的形式进行,感兴趣的可以自行查阅资料了解。

四、小结

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

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

相关文章

STM32上实现FFT算法精准测量正弦波信号的幅值、频率和相位差(标准库)

在研究声音、电力或任何形式的波形时,我们常常需要穿过表面看本质。FFT(快速傅里叶变换)就是这样一种强大的工具,它能够揭示隐藏在复杂信号背后的频率成分。本文将带你走进FFT的世界,了解它是如何将时域信号转化为频域…

【微信小程序】搭建项目步骤 + 引入Tdesign UI

目录 创建1个空文件夹,选择下图基础模板 开启/支持sass 创建公共style文件并引入 引入Tdesign UI: 1. 初始化: 2. 安装后,开发工具进行构建: 3. 修改 app.json 4. 使用 5. 自定义主题色 创建1个空文件夹,选择下…

初始c++:入门基础(完结)

打字不易,留个赞再走吧~~~ 目录 一函数重载二引用1 引⽤的概念和定义2引⽤的特性3引⽤的使⽤三inline四nullptr 一函数重载 C⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C函数调⽤…

FPGA随记-二进制转格雷码

反射二进制码(RBC),也称为反射二进制(RB)或格雷码(Gray code),得名于Frank Gray,是二进制数制的一种排列方式,使得连续两个值之间仅有一个比特(二…

【Python进阶】requests库有哪些常用的参数和方法?一篇文章带你详细了解!!!附带源码

常用的requests库参数和方法 常用方法 requests库中定义了多个常用的请求方法,其中requests.get()和requests.post()是最常用的方法。这些方法对应于HTTP协议中的GET和POST方法。 requests.get(url, paramsNone, **kwargs): 用于发送GET请求。requests.post(url…

【高阶数据结构】二叉搜索树的插入、删除和查找(精美图解+完整代码)

🤡博客主页:醉竺 🥰本文专栏:《高阶数据结构》 😻欢迎关注:感谢大家的点赞评论关注,祝您学有所成! ✨✨💜💛想要学习更多《高阶数据结构》点击专栏链接查看&a…

Mysql梳理6——order by排序

目录 6 order by排序 6.1 排序数据 6.2 单列排序 6.3 多行排列 6 order by排序 6.1 排序数据 使用ORDER BY字句排序 ASC(ascend):升序DESC(descend):降序 ORDER BY子句在SELECT语句的结尾 6.2 单列排序 如果没有使用排序操作,默认…

一、桥式整流电路

桥式整流电路 1、二极管的单向导电性: 伏安特性曲线: 理想开关模型和恒压降模型 2、桥式整流电流流向过程 输入输出波形: 3、计算:Vo,lo,二极管反向电压。 学习心得

十三,Spring Boot 中注入 Servlet,Filter,Listener

十三,Spring Boot 中注入 Servlet,Filter,Listener 文章目录 十三,Spring Boot 中注入 Servlet,Filter,Listener1. 基本介绍2. 第一种方式:使用注解方式注入:Servlet,Fil…

【C++】——多态详解

目录 1、什么是多态? 2、多态的定义及实现 2.1多态的构成条件 ​2.2多态语法细节处理 2.3协变 2.4析构函数的重写 2.5C11 override 和 final关键字 2.6重载—重写—隐藏的对比分析 3、纯虚函数和抽象类 4、多态的原理分析 4.1多态是如何实现的 4.2虚函数…

OpenCV 2

目录 图像平滑处理 高斯与中值滤波 图像阈值 ​编辑 Canny边缘检测 非极大值抑制 边缘检测效果 轮廓检测方法 ​编辑 ​编辑​编辑 轮廓检测结果 轮廓特征与近似 图像平滑处理 以上两种出来的图片效果 以上的效果,因为填的是normalize False,越界…

零基础到项目实战:Node.js版Selenium WebDriver教程

在当今数字化时代,Web应用程序的质量和性能至关重要。为了确保这些应用的可靠性,自动化测试成为一种不可或缺的工具。Selenium,作为自动化测试领域的瑰宝,为我们提供了无限可能。本教程将深入介绍Selenium,以及如何结合…

硬盘数据恢复必备:4 款强大硬盘数据恢复软件推荐!

在数字化的时代,我们的生活和工作越来越离不开电脑,而硬盘作为重要的数据存储设备,一旦出现数据丢失的情况,往往会给我们带来极大的困扰。别担心,今天就为大家推荐四款强大的硬盘数据恢复软件,帮助你轻松找…

优化算法(三)—模拟退火算法(附MATLAB程序)

模拟退火算法(Simulated Annealing, SA)是一种基于概率的优化算法,旨在寻找全局最优解。该算法模拟金属退火过程中的物质冷却过程,逐渐降低系统的“温度”以达到全局优化的效果。它特别适用于解决复杂的组合优化问题。 一、模拟退…

[羊城杯 2020]Blackcat1

知识点:数组加密绕过 进入页面熟悉的web三部曲(url地址,web源代码,web目录扫描) url地址没有什么东西去看看源代码. 这有一个mp3文件点一下看看. 在最后面发现了 PHP源码. if(empty($_POST[Black-Cat-Sheriff]) || em…

Android Studio报错: Could not find pub.devrel:easypermissions:0.3.0, 改用linux编译

在Android studio中去编译开源的仓库,大概率就是各种编译不过,一堆错误,一顿改错,基本上会耗费非常多时间,比如: 这个就是改gradle版本,改成7.2 ,修改完成之后,还有其他报…

翻页时钟 2.0-自动置顶显示,点击小时切换显示标题栏不显示标题栏-供大家学习研究参考

更新内容 自动置顶显示点击小时切换显示标题栏,(显示标题栏后可移动时钟位置,鼠标拖动边框调整时钟大小)不显示标题栏时,透明部分光标可穿透修正一个显示bu 下载地址: https://download.csdn.net/download…

iPhone 16系列:熟悉的味道,全新的体验

来看看iPhone 16和Plus这两个新成员,实话说,它们和之前曝光的样子几乎完全一致。下面我们就一起来细数一下这次的几大变化吧。 外观设计:焕然一新 首先,最显眼的变化就是后置镜头模组的布局调整为了垂直排列。这一改变使得整个背…

小程序开发设计-第一个小程序:安装开发者工具③

上篇文章导航: 小程序开发设计-第一个小程序:注册小程序开发账号②-CSDN博客https://blog.csdn.net/qq_60872637/article/details/142219035?spm1001.2014.3001.5501 须知:不同版本选项有所不同,并无大碍。 第一个小程序&#…

《黑神话悟空》开发框架与战斗系统解析

本文主要围绕《黑神话悟空》的开发框架与战斗系统解析展开 主要内容 《黑神话悟空》采用的技术栈 《黑神话悟空》战斗系统的实现方式 四种攻击模式 连招系统的创建 如何实现高扩展性的战斗系统 包括角色属性系统、技能配置文件和逻辑节点的抽象等关键技术点 版权声明 本…