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信道上传输(注:从蓝牙5.0开始广播包可以在其它信道上传输)。广播包发送给附近所有的observer(扫描者)。
  • 数据包Access Address为一个32bit的随机值,由Initiator生成。数据包,其实是数据信道上的空中包的简称,数据包只在数据信道上传输,即除37/38/39之外的其余37信道(BLE总共占用40个信道)。每建立一次连接,重新生成一次Access address。数据包是给连接通信使用的,即用于master和slave之间通信的。

CRC为24bit,初始向量为:

蓝牙广播包

蓝牙广播包,全名蓝牙广播通道(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我会另写一篇文章来详述,这里就不再介绍了。

如下为一个完整的真实的广播包示例,注意:BLE空中包采用小端模式。

  • AAD6BE898E600E3B75AB2A02E102010504FF5900538EC7B2

    • AA – 前导帧(preamble)
    • D6BE898E – 访问地址(access address)
    • 60 – LL帧头字段(LL header)
    • 0E – 有效数据包长度(payload length)
    • 3B75AB2A02E1 – 广播者设备地址(advertiser address)
    • 02010504FF590053 – 广播数据
    • 8EC7B2 – CRC24值

注:上述广播包是蓝牙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 #NESN ,#3 SN = #1 #SN ,同样#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来实现的。Data length直接跟蓝牙芯片的射频能力有关,像Nordic的nRF51822只支持BT4.1的Data length,就是因为PHY层已经做死了,无法扩展,但Nordic最新的nRF52832和nRF52840,就都支持DLE,即data length最大可到251字节。

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使用固定的通道编号,也就是说虽然蓝牙spec里面也允许BLE使用connection oriented channel,但大部分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空中包解析就告一段落了,再往上就是应用层数据解析了,这个就不是空中包的范畴,而是GATT和profile要定义的事情,我会另写文章来专门谈谈GATT层协议。

如下为一个完整的真实的数据包示例,注意:BLE空中包采用小端模式。

  • AAAB5D65501E08040004001B130053D550F6

    • AA – 前导帧(preamble)
    • 0x50655DAB – 访问地址(access address)
    • 1E – LL帧头字段(LL header)
    • 08 – 有效数据包长度(payload length)
    • 04000400 – ATT数据长度,以及L2CAP通道编号
    • 1B – notify command
    • 0x0013 – 应用数据handle
    • 0x53 – 真正要发送的应用数据
    • 0xF650D5 – CRC24值

转载于:https://www.cnblogs.com/iini/p/8977806.html

详解BLE 空中包格式—兼BLE Link layer协议解析相关推荐

  1. 蓝牙广播数据包_蓝牙BLE数据包格式汇总

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

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

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

  3. Web协议详解与抓包实战之HTTP1.1 学习笔记【一】

    Web协议详解与抓包实战之HTTP1.1[一] 前言 <Web协议详解与抓包实战>课程学习,陶辉老师主讲 学习内容: HTTP–TLS/SSL–TCP/IP自上而下根据应用学习web协议H ...

  4. 封装成jar包_通用源码阅读指导mybatis源码详解:io包

    io包 io包即输入/输出包,负责完成 MyBatis中与输入/输出相关的操作. 说到输入/输出,首先想到的就是对磁盘文件的读写.在 MyBatis的工作中,与磁盘文件的交互主要是对 xml配置文件的 ...

  5. python获取mp3音频数据_详解python进行mp3格式判断 python怎么读取mp3文件

    python中哪个库有em算法 EM算法初稿2016-4-28 初始化三个一维的高斯分布 from numpy import * import numpy as np import matplotli ...

  6. python3 打印目录下所有模块_python3基础12详解模块和包(库)|构建|使用

    本篇详解python中模块和包(库)的构建及使用. 欢迎微信随缘关注@pythonic生物人 本文您将学到什么? 1.模块 定义模块 导入模块 调用模块中函数方法1 模块名.函数名方法2 from 模 ...

  7. tcpdump使用详解及数据包分析

    tcpdump使用与数据分析 语法 tcpdump(选项) 选项 -A 以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据(nt: ...

  8. c语言printf函数中的格式控制字符串,C++_C语言格式化输入输出函数详解,一:格式输出函数printf() 1 - phpStudy...

    C语言格式化输入输出函数详解 一:格式输出函数printf() 1.调用形式一般为:printf("格式化控制字符串",输出表列): 2.格式化控制字符串用于指定输出格式,它有三种 ...

  9. tcpdump抓两个网卡的包_软路由 tcpdump抓包详解: 网口详解、抓包详解、多网卡同时抓包...

    软路由详解: 我的软路由有四张千兆网卡.其中Eth3是WAN口,Eth012是三个LAN口,Eth0接网线连接一台PC,Eth1连接一台无线路由器,Eth2未使用. 进入软路由系统中用ifconfig ...

最新文章

  1. Kafka 顺序消费方案
  2. 小学计算机知识讲课,小学信息技术说课稿《走进计算机》
  3. 本蒟蒻对于二分图一些定理的理解
  4. 程序员面试题精选100题(51)-顺时针打印矩阵[算法]
  5. 第三章 使用Servlet处理HTTP响应
  6. 2018年第九届蓝桥杯 - 省赛 - Java大学A组 - A.复数幂
  7. Android开发系列(二十八):使用SubMenu创建选项菜单
  8. model存储 swift_Swift语言IOS8开发战记10.Data Model
  9. HRBUST 1473 教主的遗产【状态压缩】
  10. Redmi王腾:Redmi 10X还会带来全新滤镜
  11. mysql 数据库属性_mysql 查看数据库属性
  12. 一行代码能做什么? 看到最后一个我终于忍不住...
  13. xml文件、jsp文件、sql文件、shell脚本文件注释
  14. Android 学习路线
  15. 如何用excel批量生成word文档,并且命名?
  16. pdf如何解除限制转换为word
  17. 如何绕过百度网盘客户端下载大文件
  18. python你实现视频自动打码,了解妨碍你观看精彩的马赛克是怎么精准形成的
  19. python爬虫:批量下载qq空间里的照片(二)
  20. Ubuntu实用安装

热门文章

  1. 过滤Linux下不同大小的文件,linux查找当前目录下 M/G 大小的文件,删除Linux下指定大小的文件
  2. js异步提交form表单的解决方案
  3. 2022-2028年中国特高压电网行业深度调研及投资前景预测报告
  4. python异常机制
  5. 机房收费系统总结【4】-报错码
  6. 2021年大数据Kafka(六):❤️安装Kafka-Eagle❤️
  7. Lumen框架多数据库连接配置方法
  8. Android AnimationUtils (动画)的使用
  9. Android 自定义View —— Path
  10. android 底部弹框 BottomSheetDialog 的使用