BLE 链路层(LL)的数据结构
一 链路层的数据结构
在链路层上传输的数据格式如下图所示:
广播报文和数据报文都包含 Preamble(前导码), AccessAddress(接入地址),PDU(数据),CRC。其中Constant Tone Extension是可选的。
- 前导码
- 接入地址
- PDU
- Header
- Length
- payload
- MIC(可选)
- CRC
- Constant Tone Extension(可选)
1 前导码
报文最开始的8bit是01010101(0x55)或者10101010(0xAA)。这是很简单的交替序列。接收机可以用它来配置自动增益控制,以及确定 “0”、"1"比特所使用的的频率。
这段序列之所以非常重要,是因为芯片必须能够应对输入信号强度的可能范围。接收机需要应付 -10dBm到-90dBm的信号强度,也就是80dB的动态范围。从接收机的角度讲,也就是1pW到0.1pW的能量。自动增益控制器必须检测出输入信号的能量等级,并调整增益,使得信号刚好处于接收机能够轻容工作的范围之中。
2M PHY的前导码为2个字节
2 接入地址(Access Address)
接入地址的第一个比特决定了前导是01010101还是10101010。如果接入地址的第一个比特为0,则使用01010101序列;如果是1则使用10101010序列。这保证了任一报文的前9个比特都是交替的,即要么为101010101要么为010101010。
LL层使用接入地址来区分当前发送的数据是广播包还是数据包,广播包接入地址固定为0x8E89BED6,数据包使用是在连接时生成的接入地址。
- 连接时主设备分配一个32位的随机数并发送给从设备,这就是接入地址。
- 接入地址被用来表示一个连接,在连接期间保持不变。
- 对于同一个从设备,断开从新连接接入地址也会重新生成。
3 数据(PDU)
根据使用的通道不同可以分为广播报文和数据报文。广播报文在广播通道上传输(37, 38, 39), 数据报文在数据通道上传输(0到36)。
二 广播通道上的PDU
广播通道上的PDU格式:
- 两个字节的header
- 1到255字节数据
广播通道上的Header格式
- PDU Type(4bit) 广播报文类型
- RFU(1bit) 未使用
- ChSel(1bit) 未使用
- TxAdd(1bit) 发送地址类型
- 0: public地址
- 1: 随机地址
- 静态随机地址,地址最高两位为11
- 私有随机地址
- 不可解析私有随机地址,地址的最高两位为00
- 可解析私有随机地址,地址的最高两位为1(最高位)0(次高位)
- RxAdd(1bit) 接收地址类型,规则和TxAdd一样
- length(8bit),长度,取值范围1到255
1 广播报文的类型
- ADV_IND,通用广播,外设发出的一般称为通用广播,广播中包含mac地址设备名字等信息。
- ADV_DERECT_IND,定向广播,某个外设在工作的时候就希望某个主设备来连接它,就可以向这个中央设备发起一个定向广播。
- ADV_NONCONN_IND,不可连接的广播,比如货架上的广告机,会不断的向外发送广播信息。
- ADV_SCAN_IND,可发现广播,包含了比通用广播更加丰富的信息。
- SCAN_REQ,扫描请求,当中央设备发现通用广播中包含的信息并不全,这个时候主设备可以发一个扫描请求。
- SCAN_RSP,外设响应主设备的扫描请求,返回给中央设备更多的信息。
- CONNECT_REQ,连接请求,当主设备得到足够的信息之后就可以发送一个连接请求。来建立连接。
- ADV_EXT_IND, 通用扩展广播
- AUX 开头的广播类型和ADV_EXT_IND是蓝牙5.0新引入的,暂且不表。
2 广播通道上的报文
2.1 ADV_IND 通用广播
- AdvA, 6个字节广播者的mac地址
- 最多31个字节的广播数据, AdvData来自上层
通用广播是用途最广的广播方式。进行通用广播的设备能够被扫描设备扫描到,或者在接收到连接请求时作为从设备进入连接态。
2.2 ADV_DERECT_IND 定向广播
- AdvA, 6字节的广播者地址
- TargetA,接收广播者的地址
有时候,设备间需要快速建立连接。如果从设备想这么做,就需要进行广播。定向广播事件就是为了尽可能快的建立连接。这种报文只能包含两个地址,广播者和发起者的地址。发起设备收到发给自己的定向广播报文后,可以立即发送连接请求作为回应。
定向广播有特殊的时序要求。完整的广播事件必须每3.75ms重发一次。这一要求使得扫描设备只需要扫描3.75ms便可收到定向广播设备的消息。定向广播不可以持续1.28s以上的时间。
当使用定向广播时,设备不能被主动发现。
该报文不包含任何上层数据
2.3 ADV_NONCONN_IND 不可连接的广播
- AdvA, 6个字节广播者的mac地址
- 最多31个字节的广播数据, AdvData来自上层
不想被连接的设备使用不可连接广播。这种广播的典型应用包括设备只想广播数据,而不想被扫描或者连接。不可连接广播不会进入连接态,只能在就绪态和广播态之间进行切换。
2.4 ADV_SCAN_IND 可发现广播
- AdvA, 6个字节广播者的mac地址
- 最多31个字节的广播数据, AdvData来自上层
可发现广播允许其他设备扫描该设备,但是不能进入连接态。这意味着该设备可以被发现,既可以广播数据,又可以响应扫描,但不能建立连接。这是一种适用于广播数据的广播形式,动态数据可以包含在广播数据中,而静态数据可以包含于扫描响应数据中。
2.5 SCAN_REQ 扫描请求
- ScanA, 请求者的地址
- AdvA, 广播者地址
2.6 SCAN_RSP 扫描响应
- AdvA, 广播者的地址
- ScanRspData, 来自上层的扫描数据
2.7 CONNECT_REQ 连接请求
连接过程
连接请求的数据包
- InitA: 发起连接者的mac地址,BLE的MAC地址,随机地址的最高两位应该为11b
- AdvA: 广播者的地址mac地址
- AA: 接入地址。LL层使用接入地址来区分当前发送的数据是广播包还是数据包,广播包接入地址固定为0x8E89BED6,数据包使用就是该值。
- CRCInit(CRC initialization value): CRC初始值,主设备提供的一个随机数,防止多个连接AA相同。
- WinSize(transmitWindowSize): 发送窗口大小, 单位是1.25ms
- WinOffset(transmitWindowOffset): 发送窗口偏移, 单位是1.25ms
- Interval(connInterval): 连接间隔 单位是1.25ms
- Latency(connSlaveLatency): 从设备延时,表示从设备可以跳过多少个连接事件。
- Timeout(connSupervisionTimeout): 监控超时。单位是ms
- ChM(Channel Map): 信道图,表示当前环境中哪一个信道可用,每一个bit表示一个信道1表示可用,0表示不可用。比如ff ff ff ff 1f(0x1fffffffff), 二进制为0001111111111111111111111111111111111111b
- Hop(hopIncrement): 跳频算法的hop值,比如110b, 6
- masterSCA: 00100b, 休眠时钟精度, 151 ppm to 250 ppm
三 数据通道上的报文
数据通道上的报文格式:
数据通道上的Header格式:
- LLID(2bit),逻辑链路标识符,用来判断数据报文属于下列哪种类型
- 0b00, 保留
- 0b01, 来自L2CAP的延续帧,或者是一个空包。
- 0b10, 来自L2CAP的开始帧,或者是一个完整的报文。
- 0b11, 控制报文。
- 链路层控制报文(11),用来管理连接,
- 高层报文开始(10),也可用于一个完整的报文
- 高层报文延续(01),也可以是一个空包
- NESN(1bit),预期序列号
- SN(1bit),序列号
- MD(1bit),更多数据
- CP(1bit),是否包含CTEinfo
- RFU(3bit),保留
- length(8bit),长度
- CTEinfo(8bit), 指明Constant Tone Extension的类型和长度
- payload,数据,长度为0到251字节,
- MIC,消息完整性校验,4个字节,可选
为了使数据传输变得可靠,所有的数据均带有序列号(SN)。连接建立之后,第一个数据包的SN为0;每次发送新的数据包时,其SN与上一个数据包的SN不同。这使得接收方能够判断接收数据包的性质: 如果SN与之前的一样,接收方认为该报文为重传报文,如果SN和上一个数据包的SN不同,则认为是新报文。
数据包的确认还需要用到另外一个比特,预期序列号(NESN)。NESN的发送方用其通知对方字节预期接收的数据包的SN。
如果设备成功接收SN为0的报文,在其确认报文中,应该将NESN设为1,向对方表明自己希望下一个数据包的SN为1,如果不讲NESN设置为1,那么发送方就认为从设备没有成功接收到自己的报文,将进行重传。因此NESN作为一个标志来判断数据包是否被正确接收还是需要重传。
数据信道报文的Header里还有一个更多数据位(MD), 用来通知对端设备自己还有其它的数据准备发送。如果收到设置了MD位的数据包,应该在当前连接事件中继续与对端设备通信。这样一来,只要还有数据要发送,连接事件就会自动扩展;一旦不再有数据发送,连接事件会迅速关闭。如果把MD设置为0,设备可以快速、优雅的结束连接事件,从而节省能量。
另外,NESN还可以用来进行流量控制。设备一旦没有足够的缓存空间来处理消息,可以不更新NESN。这迫使对端设备重新发送当前消息,从而把对缓存的要求从接收端转嫁到发送端。
下面是一个具体的例子:
- 主设备发送第一包数据(SN=0,NESN=0,MD=1)
- 从设备接收到之后回复(SN=0,NESN=1,MD=1),但是这一包数据主设备没有收到。
- 主设备没有收到从设备的回复,因此重传这一包数据(SN=0,NESN=0,MD=01
- 从设备回复(SN=0,NESN=1,MD=1)
- 主设备收到从设备的回复,开始发送下一包数据(SN=1,NESN=1,MD=0)
- 从设备回复(SN=1,NESN=0,MD=0)
- 主设备收到从设备的回复,结束当前的连接事件。注意上述过程都在同一个连接事件内完成的。
- 在下一个连接事件中,主设备有数据需要发送(SN=0,NESN=0,MD=0)
- 从设备回复(SN=0,NESN=1,MD=0)
- 主设备收到从设备回复,结束当前连接事件。
3.1 数据报文
LLID为0b01或者0b10。
Header 中的 LLID 字段设置为 0b01,长度字段设置为 0b00000000 被称为空 PDU。 主机的链路层可以向从机发送一个空的 PDU,以允许从机响应任何数据的 PDU,包括一个空的 PDU。
如果LLID字段为0b10,长度字段不应该被设置为0b00000000。
如果链路层接收到 Data_Total_Length 等于 0b00000000 且 Packet_Boundary_Flag 设置为 0b00(即开始片段)的 HCI ACL 数据包,则链路层不能简单地通过空中传输该片段,而是必须将其与一个或 更多的以下延续片段形成一个 PDU,LLID 设置为 0b10 和非零长度。
数据报文的Payload来自上层。
3.2 控制报文
控制报文是用来控制连接链路的。
数据格式如下:
- Opcode,操作码,1个字节
- CTRData,控制数据,0到250个字节
控制报文中的 CtrData 字段由操作码字段指定。 对于给定的操作码,CtrData 字段的长度是固定的。
操作码类型如下(详细信息参看: 核心卷,vol6, PartB, 2.4.2):
如果接收到不支持控制报文或保留供将来使用的报文,则链路层应以 LL_UNKNOWN_RSP PDU 进行响应。 LL_UNKNOWN_RSP PDU 的 UnknownType 字段应设置为接收到的 PDU 中操作码的值。
LL_UNKNOWN_RSP 的CtrData数据格式:
如果接收到的控制报文长度错误或 CtrData 字段无效,链路层可以继续执行该命令,并对数据进行特定于实现的解释(例如,如果PDU太长,它可以忽略额外数据;如果字段超出范围,则可以使用最接近的允许值)。 如果它不继续该规程,它应以LL_UNKNOWN_RSP PDU响应,或者,如果相关规程允许,则响应 LL_REJECT_IND 或 LL_REJECT_EXT_IND PDU。 LL_UNKNOWN_RSP PDU 的 UnknownType 字段或 LL_REJECT_EXT_IND PDU 的 RejectOpcode 字段应设置为接收到的 PDU 中的 Opcode 值。
LL_REJECT_IND的CtrData数据格式:
LL_REJECT_EXT_IND 的CtrData数据格式:
BLE 链路层(LL)的数据结构相关推荐
- BLE 技术(三)--- 链路层七种状态与空口报文设计(Core_v5.2)
文章目录 一.LE Link Layer States 二.Link Layer Packet format 2.1 Advertising physical channel PDU 2.1.1 Pr ...
- BLE进阶——链路层(1)
BLE 的链路层,主要有一个或多个状态机构成,状态机有5中状态,分别是 standby(待机), advertise(广播), scan(扫描), init(初始化),connect(连接). 1. ...
- ble l2cap 工作过程_BLE 链路层报文详解
报文结构 报文是构成链路层的基石.报文就是携带着标签的数据,有一个设备发送,其他设备接收. 报文结构 比特序列 数据按照字节传输时,总是从最低位开始传输的,例如0x01是1000000 多个字节组成的 ...
- 【原创】BLE的链路层2
目录 1,空口包的组成(Air Interface Packets) 2,前导序列(Preamble) 3,接入地址(Access Address) 4,协议数据单元(PDU)和CRC 5,Const ...
- 交换机 链路层无法udp通讯_一文读懂计算机底层网络原理,包括TCP、UDP、header,什么是包、帧、段等关键问题...
说到计算机网络原理,大家可能马上联想到,七层协议,传输层,链路层,三次握手四次挥手:前端的同学,还会想到我们用Crome F12的network里面的headers,状态码等.后端同学可能会联想到,抓 ...
- 【2021-08-05 修订】【梳理】计算机网络:自顶向下方法 第六章 链路层和LAN(docx)
计算机网络 知 识 梳 理 (第一版) 建议先修课程:数据结构. 配套教材: Computer Networking - A Top Down Approach, 7th edition James ...
- BLE4.2链路层(LL)安全机制-LL Privacy
本文主要是总结了BLE配对绑定后,二次连接时链路层的连接过程和在该过程中,蓝牙4.2所做的一些安全机制,主要包括蓝牙白名单和安全机制LL Privacy,LL Privacy主要是防止设备地址泄露,导 ...
- TCP/IP 协议族 简介(应用层,传输层,网络层,链路层)
互联网协议(Internet Protocol Suite [swi:t])是一个 网络通信模型,以及一整个网络传输协议家族,为互联网的基础通信架构.它常被通称为TCP/IP 协议族(TCP/IP P ...
- TI_BLE软件开发者指导4——链路层(笔记)
Texas Instruments CC2540/41 Bluetooth® Low Energy Software Developer's Guide v1.3.2 Document Number: ...
最新文章
- 2021年大数据常用语言Scala(二十七):函数式编程 聚合操作
- Cambridge Website in a page
- mysql 异常关机后 无法查数据_MySQL数据库非法关机造成数据表损坏怎么排查 | 学步园...
- oracle jdbctype null,Oracle数据库之springboot 项目mybatis plus 设置 jdbcTypeForNull
- $.ajax 加了headers报错_Springboot解决Ajax跨域的三种方式
- 终于等到放学了的飞鸽传书
- 【英语学习】【Level 08】U02 Movie Time L6 Blockbuster
- 域名行业将带来高达98亿美元的巨大商机
- BZOJ1497: [NOI2006]最大获利
- Linux最常用的20个命令
- PPT嵌入视频,添加控件按钮控制视频播放
- 计算几何相关的面试题
- 决策树:ID3C4.5cart算法(从原理到实现-小白教程超详细)
- QT使用RabbitMQ
- 洛谷-3387 【模板】缩点
- 【hive】beeline常用操作指令
- 常见C++开源网站项目
- 【硬件之AD篇】两层PCB的各个板层分析
- 微软外包人才之道:一流外包团队如何打造
- 如何在Nintendo 64控制器上更换磨损的模拟棒
热门文章
- TIA博途WinCC PRO V16 画面分辨率的设置方法
- Android声卡的工作原理,夏昆冈作品 - 自由的音频,把手机变成无线声卡 SoundWire 应用教程与体会[Soomal]...
- 一个C程序辨别系统是64位还是32位
- 计算机网络实验报告tcp,TCP 计算机网络实验报告
- Despair and Despair
- 解决mac系统向日葵远控无法被远程控制问题(白屏)
- 龙珠斗士z服务器位置,龙珠斗士Z配置要求介绍
- 计算机管理系统在护理管理中的应用,计算机信息技术在护理管理中的设计应用探讨.doc...
- 无法进入桌面you appear to be running an x server please exit x before installing
- webix.tree 修改图标