BLE有几种空中包格式?常见的PDU命令有哪些?PDU和MTU的区别是什么?DLE又是什么?BLE怎么实现重传的?BLE ACK机制原理是什么?希望这篇文章能帮你回答以上问题。

虽然BLE空中包(packet)涉及BLE协议栈link layer,L2CAP,SMP和ATT等各层次,但link layer跟空中包格式关系最紧密,掌握了BLE packet的格式,就很容易理解BLE link layer协议的工作原理,因此文章取名“详解BLE空中包格式—兼BLE link layer协议解析”

BLE Packet格式

BLE链路层(link layer)只定义了一种packet(空中包)格式,如下所示:

而且PDU(protocol data unit,协议数据单元)前两个字节固定为LL header(1个字节长)和payload length(1个字节长,又称data length),即上面的Packet可以展开为:

preamble(前导帧)为1个字节,根据Access Address第一个Bit,有两种取值情况:0x55或者0xAA(纯PHY层行为),如下所示:

Access Address用来标示接收者ID或者空中包身份,如前所示,BLE只有一种packet格式,根据Access Address的不同,又区分两种Packet类型:广播包和数据包:

  • 广播包Access Address 固定为0x8E89BED6,广播包只能在广播信道(channel)上传输,即只能在37/38/39信道上传输。广播包发送给附近所有的observer(扫描者)。
  • 数据包Access Address为一个32bit的随机值,由Initiator生成。数据包,其实是数据信道上的空中包的简称,数据包只在数据信道上传输,即除37/38/39之外的其余37信道(BLE总共占用40个信道)。每建立一次连接,重新生成一次Access address。数据包是给连接通信使用的,即用于master和slave之间通信的。

CRC为24bit,初始向量为:

蓝牙广播包

蓝牙广播包,全名蓝牙广播通道(channel)空中包,即在蓝牙广播通道(37/38/39信道(channel))上传输的空中包,为两种空中包的一种,其具体格式如下所示:

Advertising Header即前述的LL header,长度为一个字节,其每bit定义如下所示:

  • PDU Type为3bit,具体定义如下。可以看出扫描PDU和发起连接PDU都属于广播包。

注:CONNECT_REQ也可写作CONNECT_IND

  • TxAdd/RxAdd,各占1bit,表示随后的Device Address字段代表的蓝牙MAC地址类型,值0代表Public地址,值1代表Random地址。

Payload length定义如下所示,所以广播包PDU最长37个字节。

Device Address,广播包中的强制字段,俗称蓝牙MAC地址,如果是广播包,则是advertiser的MAC地址;如果是scan包或者连接请求包,则是scanner的MAC地址。蓝牙device address为6个字节,这样Advertising data最长为:37-6 = 31B,这就是广播包数据最长只能31个字节的由来。如前所述,device address分public和random两种,定义如下所示:

Random device address又有三种类型,定义如下所示:

Advertising data我会另写一篇文章来详述,这里就不再介绍了。

注:上述广播包是蓝牙4.x格式,蓝牙5.0广播包除了包含上述格式外(记住:蓝牙5是跟蓝牙4.x兼容的!),还有一些新的定义,以后我也会写一篇关于蓝牙5广播的文章来专门阐述蓝牙5扩展广播包。

蓝牙数据通道空中包(数据包)

与蓝牙广播包相对应,蓝牙数据包是另一种BLE packet。蓝牙数据包是蓝牙数据信道空中包的简称,表示空中包只在蓝牙数据信道上传输,即除37/38/39之外的其他37信道。从格式上来说,蓝牙数据包分空包(empty packet)和普通数据包(data packet)两种,空包格式如下。

由图可见,空包整个payload为空,故名空包。

普通数据包格式如下所示:

Data header,即前述的LL header,在数据包中的定义如下所示:

  • LLID(2bits), link layer ID,对LL PDU进行分类:LL data PDU和LL control PDU。也就是说,普通的数据信道空中包包含LL数据包和LL控制包两种,具体定义如下所示。请大家注意分清data channel packet(数据信道空中包)和LL data packet(LL数据包)的区别,如前所示data channel packet包含LL data packet和LL control packet,LL data packet只是data channel packet的一种。在不引起上下文歧义的时候,我们把他们统一称作“数据包”。

Link layer支持如下control PDU:

  • NESN/SN,NESN和SN各占1bit。SN全称为sequence number,表示当前发送的packet编号。NESN,next expected sequence number,用来告知对方下一个期待的packet的编号。Link layer使用SN来告知对方这个packet是新数据包还是重传包,用NESN来告诉对方你之前发我的包已经收到了(相当于ACK的作用),我现在期待下一个新的数据包了,因此BLE没有专门的ACK包,它是通过NESN/SN来实现ACK和重传双重功能的。请参考如下表格,仔细揣摩NESN和SN是如何编码的,以同时完成ACK和重传功能。

空中包编号

传输方向

NESN

SN

NESN

SN

#1

M -> S

1

0

#2

S -> M

1

1

#3

M -> S

0

1

1

0

#4

S -> M

0

0

1

1

我们来分析#3数据包,#3是master发给slave的,那么#3的NESN和SN是如何确定的呢?其实#3的NESN和SN是通过比较#1和#2的NESN/SN的值来确定的,Master把#1传完之后,会把#1包的NESN和SN记录下来,即表格右边的NESNꞌ和SNꞌ。然后Master会拿SNꞌ跟#2的NESN相比,两者不等,说明slave已经收到了#1包,并期待master发一个新的包给它,此时Master会把SNꞌ增1,形成#3包的SN,表示这个数据包是一个新包,然后发出去;两者相等,说明slave没有收到#1包,此时master需要重传。Master还会拿NESNꞌ跟#2的SN相比,两者相等,说明#2包为新包,然后Master会把NESNꞌ增1,形成#3包的NESN发出去,告诉slave我已经收到#2包了并期待你的下一个包;两者不等,说明#2包为重传包。注意:大家可以从上述表格发现一个规律,就是同一方向相邻的两个数据包,他们的NESN和SN与另一个包的NESN和SN是相反的,比如#3 NESN = #1 ,#3 SN = #1 ,同样#2和#4 各自的NESN和SN是相互相反的。

我们可以用下面的流程图来描述上述过程。

  • MD(1bit),more data,用来指示对方我还有数据包要传,请继续打开射频窗口准备接收。比如Nordic nRF51822一个connection interval可以发6个包或者更多的包(也就是说,一个connection event包含多个数据包交互),用的就是MD来实现的。以notify命令为例,设备(Server)notify第一个数据包并将MD置1,Client(比如手机)收到这个notify命令后,就知道Server还有数据包要传,此时手机可以继续发一个空包给设备,以让设备把第二个notify命令发过来,详情如下所示。注:Master为手机(Client),Slave为设备(Server)。

Payload Length or Data Length,BT4.0/4.1定义如下所示,这就是蓝牙4.0/4.1一个包只能传20个字节的根源。

BT4.2之后,Payload length 8 bits全部用来表示长度,这样的话,payload size最大可达251字节(255 – MIC size)。BLE连接建立之后,可以动态更改data length长度(默认为27字节),这个特性叫做Data Length Extension(DLE,DLE是通过Link layer命令:LL_LENGTH_REQ和LL_LENGTH_RSP来实现的。

L2CAP length,2字节长度,表示后面information payload的长度,information payload最大长度除了受这个L2CAP length字段约束,同时还受MTU的限制。MTU,Maximum Transmission Unit,是ATT层与L2CAP层可以交互的最大数据长度,或者说是Client与Server可以交互的最大长度。

总结一下,蓝牙spec里面定义了2个长度字段:LL data length和L2CAP length,同时ATT层还定义了一个MTU,以限制ATT PDU最大长度。LL data length可以通过LL_LENGTH_REQ和LL_LENGTH_RSP动态改变,MTU size则可以通过后面要讲到的Exchange MTU Request和Exchange MTU Response来改变,而L2CAP length无法动态改变,也就是说不能超过65535。

L2CAP CID,2字节长度,逻辑通道的ID,BLE使用固定的通道编号,定义如下所示:

BLE L2CAP Signaling Channel支持的PDU命令只有三个:

  • Command reject
  • Connection parameter update request,更新连接参数,比如最小连接间隔,最大连接间隔,slave latency等
  • Connection parameter update response,接受或者拒绝上面的请求

Security Manager Protocol(SMP用来实现配对和密钥分发的,SMP支持如下PDU命令:

Attribute Protocol(ATT,就是我们经常用到的应用层,应用数据就跟在ATT命令后面,ATT支持如下命令列表:

详解BLE 空中包格式—兼BLE Link layer协议解析的更多相关文章

  1. BLE链路层空中包格式

    空中包格式 BLE链路层的空中包格式非常简单,它所有的空中包都遵循下图所示的格式: 有上图可见,BLE空中包由4个部分组成,他们分别是: 前导码(Preamble) 访问地址(Access Addre ...

  2. Web协议详解与抓包实战,高效解决网络难题

    无论你是前后端工程师,还是运维测试,如果想面试更高的职位,或者要站在更高的角度去理解技术业务架构,并能在问题出现时快速.高效地解决问题,Web 协议一定是你绕不过去的一道坎. 旨在帮助你对各种常用 W ...

  3. spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途

    Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...

  4. JSON详解+ C# String.Format格式说明+ C# ListView用法详解 很完整

    JSON详解 C# String.Format格式说明 C# ListView用法详解 很完整

  5. 蓝牙BLE数据包格式汇总

    以蓝牙4.0为例说明: BLE包格式有:广播包.扫描包.初始化连接包.链路层控制包(LL层数据包).逻辑链路控制和自适应协议数据包(即L2CAP数据包)等: 其中广播包又分为:定向广播包和非定向广播包 ...

  6. TCP、UDP详解与抓包工具使用

    参考:https://www.cnblogs.com/HPAHPA/p/7737641.html TCP.UDP详解 1.传输层存在的必要性 由于网络层的分组传输是不可靠的,无法了解数据到达终点的时间 ...

  7. Fidder详解之抓包

    前言 本文是博主发表的第一篇文章,如有傻逼之处,请大家见谅.最近遇到很多人说接口相关的问题,比如:什么是接口,我该怎么做接口测试,还有我总是抓不到APP上的https请求(这个巨坑,不知道坑了多少小白 ...

  8. Linux 安装 MySQL 详解(rpm 包)

    说明:Linux 系统中软件的安装在 root 用户下进行,此安装方式为 rpm 包方式,安装的版本为:MySQL-5.6.25-1.linux_glibc2.5.x86_64.rpm-bundle. ...

  9. QUIC协议详解之Initial包的处理

    从服务器发起请求开始追踪,细说数据包在 QUIC 协议中经历的每一步.大量实例代码展示,简明易懂了解 QUIC. 前言 本文介绍了在 QUIC 服务器在收到 QUIC 客户端发起的第一个 UDP 请求 ...

随机推荐

  1. 使用hue查看hdfs系统报无法访问:/user/hadoop。 Note: you are a Hue admin but not a HDFS superuser, "hdfs" or part of HDFS supergroup, "supergroup".

    出现这个问题,是因为默认的超级用户是hdfs ,我的是hadoop用户登录的, 也就是说首次登录hadoop这个用户是我的超级用户 此时只需要将hue.ini配置改为 然后重启即可.

  2. 前端之旅HTML与CSS篇之block与inline的区别

    display:block;和display:inline;的区别block元素特点: 1)处于常规流中时,如果width没有设置,会自动填充满父容器 2)可以应用margin/padding 3)在 ...

  3. web前端HTML基础

    一.HTML介绍 HTML全称是(Hypertext Markup Language, HTML)又称为超级文本标记语言,它主要his一种用于创建网页的标记语言,在本质上是浏览器可以识别的规则,我们按 ...

  4. Thread源码剖析

    前言 昨天已经写了: 多线程三分钟就可以入个门了! 如果没看的同学建议先去阅读一遍哦~ 在写文章之前通读了一遍<Java 核心技术 卷一>的并发章节和<Java并发编程实战>前 ...

  5. [LeetCode] Min Cost Climbing Stairs 爬楼梯的最小损失

    On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed). Once you pay ...

  6. [LeetCode] Out of Boundary Paths 出界的路径

    There is an m by n grid with a ball. Given the start coordinate (i,j) of the ball, you can move the ...

  7. Cmder Windows 下的终端神器

    废话 Windows 下常用的终端有两个,古老的 cmd 和功能强大但你记不住函数的 PowerShell ,两者我都用过一段时间,给我的提体验是功能够用,界面丑陋,虽然 win10 下可以通过调整背 ...

  8. 用AJAX实现上传图片或者文件的方法

    大家好,我是小C,最近在项目中用到ajax上传图片文件,本篇我们就说说ajax上传文件. 我们平时用到的AJAX,大部分都是传几个参数就可以了.简单说就是传几个字符串. $.ajax({ url: u ...

  9. Linux数据流重定向与管道

    数据流重定向简单来说就是把原本应该输出到某处(比如说屏幕)的数据,重定向其输出目的地,到其他的地方(比如文件). linux中的输入与输出: 标准输入(stdin):默认从键盘输入 标准输出(stdo ...

  10. [LOJ 6185]烷基计数

    Description 众所周知,大连 24 中是一所神奇的学校,在那里,化竞的同学很多都擅长写代码. 有一天,化学不及格的胡小兔向化竞巨佬晴岚请教化学题: “n 个碳原子的烷基共有多少种同分异构体? ...