从物理层到应用层全面解析BLE协议栈与通信

从物理层到应用层全面解析BLE协议栈与通信

1 提笔

最近因工作需要,投入到BLE项目中,故而花了不少时间翻看标准,钻研原理,以求知其所以然。结合平头哥BLE产品,实践验证理论,还是有了不少心得。一直想记录下来,奈何一直忙(给自己找了个理由),哈哈,今天终于下笔,来个小结。当然,如有不准确之处,还望各位同学批评指正。

先声明下,为了配合理解,文中很多图片资料来自SIG/IEEE标准组织或者互联网,如有版权问题,还请联系我,我会立刻纠正。不胜感激!

2 蓝牙的演进史

蓝牙(BlueTooth),是一种支持设备短距离通信的无线电技术,诞生于1994年,最初由电信巨头爱立信公司创制,当时是作为RS232数据线的替代方案。作为有线的无线替代方案,其理念是使用无线电传输来交换数据。名字取自于丹麦的一个国王Harold Bluetooth,此国王据说统一了四分五裂的国家,有点类似于我大秦帝国秦始皇。哈。

如今,蓝牙由蓝牙技术联盟(Bluetooth Special Interest Group,简称SIG)管理。IEEE将蓝牙技术列为IEEE 802.15.1。

版本演进史:

版本

主要功能

1.1

传输率约在748~810kb/s,因是早期设计,容易受到同频率之间的类似通信产品干扰,影响通讯质量;单工

1.2

同样是只有748~810kb/s的传输率,但增加了抗干扰跳频功能;单工

2.0

2.0是1.2的改良提升版,传输率约在1.8M/s~2.1M/s,可以有(双工)的工作方式

2.1

为了改善蓝牙技术存在的问题,蓝牙SIG组织(Special InterestGroup)推出了Bluetooth 2.1+EDR版本的蓝牙技术。改善装置配对流程:以往在连接过程中,需要利用个人识别码来确保连接的安全性,而改进过后的连接方式则是会自动使用数字密码来进行配对与连接

3.0+HS

2009年4月21日,蓝牙高速版,传输速率可达24Mbps

4.0

支持低功耗;AES-128加密 将传统蓝牙技术、高速蓝牙技术和低功耗蓝牙(Bluetooth Low Energy,简称BLE)技术集为一体

4.1

IoT相关的特性增强

4.2

2014年12月4日,支持:IPv6;隐私保护;加密算法升级;DLE支持

5.0

2016年6月16日在伦敦正式发布,为现阶段最高级的蓝牙协议标准; • 4 X Range • 2 X Speed • 800% Broadcast Capacity

表格 1 蓝牙版本演进

从上表演进史可以得出,4.0之前的版本演进主要在追求通信速度,3.0高速蓝牙达到了24Mbps;4.0及其之后的版本演进主要在追求低功耗/低成本等物联网IoT特性。一般将蓝牙3.0之前的BR/EDR蓝牙称为经典蓝牙,而将4.0开始后的蓝牙称为低功耗蓝牙。本文重点介绍的是BLE。

图表 1 蓝牙分类

3 BLE协议详解

我的经验是,要学习掌握某一数据通信协议,先找出其OSI模型,然后从底层(物理层)向上层层剥离。闲话少说,上图。

图表 2 BLE OSI架构

那我们就从物理层开始,逐层向上讲解。

BLE物理层主要的技术有4:

l 频谱

BLE使用2.4GHz工业,科学及医疗ISM频段,从2400MHz到2483.5MHz。信道带宽2M, 共计40个信道。F=2402+k*2MHz,k=0,。。。39。37/38/39固定为广播信道。

l GFSK调制解调

BLE采用的GFSK调制方式(高斯频移键控),中心频率容限是+/-150kHz

l AFH跳频解决拥堵问题

l 1M/2M无编码物理层,1M编码物理层(S=2,S=8)

频谱,哈,就不解释了,省的大家说我啰嗦。

GFSK,我通俗的理解就是,以(中心频率-150kHz)为频点的频率代表0,以(中心频率+150kHz)为频点的频率代表1

AFH,adaptive frequency hopping自适应跳频,大家都知道2.4G频段是开放频段,诸如WiFi,微波都在此频段,那就会产生很多干扰,BLE是通过此功能来尽量避开干扰。具体做法就是,在Master请求连接的时候,需要告知后续和Slave通信时的可用Channel以及跳频的步伐;当连接建立后,也可以动态更新可用channel和跳频步伐。可用channel用ChannelMask字段表明,跳频步伐用Hop字段表明。一图胜千言:

图表 3 跳频

再看看有跳频和无跳频的对比:

图表 4 有跳频的效果图

图表 5 无跳频的效果图

无编码物理层,顾名思义,一个物理symbol代表一个0或者1. 1M无编码,也就是物理层1M symbol/s,对应的数据传输速率为1Mbps,2M无编码同理。

编码物理层,举个栗子,11代表1,00代表0,在物理层symbol速率不变的情况下,有编码意味着实际数据速率的降低,这个例子里实际数据速率降低了1/2,但带来的好处是纠错能力的提高,破坏掉一位,仍可用还原,这样也就变相地提高了接收灵敏度,进而提高了覆盖距离。其实这个栗子就是S=2编码。

BLE支持1M symbol/s下的S=2和S=8,对应的数据速率也就是500kbps和125kbps。

BT4.0/4.1

BT4.2

BT5.0

1Mbps PHY 27Bytes PDU 305kbps

1Mbps PHY 27-255Byte with DLE 780kbps

2Mbps PHY 27-255Byte with DLE 1.4Mbps

图表 6 BLE各版本速率

物理层

调制方式

编码方案 (报头部分)

编码方案 (有效载荷)

比特率

1M PHY

1Msym/s

无编码

无编码

1Mb/s

2M PHY

2Msym/s

无编码

无编码

2Mb/s

LE Coded PHY

1Msym/s

编码S=8

编码S=8; 编码S=2

125kb/s; 500kb/s

图表 8 BLE支持的无编码/编码物理层

==========================稍歇会儿,画个线,下面为LL层============================BLE LL层,发展到这层,那就要从帧格式说起。

BLE帧主要分为两种:广播包和数据包。上图。

图表 9 BLE帧格式

两种报文的区别主要靠Access Address来定义。广播包的Access Address固定为0x8E89BED6. 广播包和数据包从access address字段后就分道扬镳了,有不同的定义。

图表 10 广播包帧格式

顾名思义,广播包就是所谓的灯塔包,主要目的是告知别人:我在这里,我有哪些服务和能力。以方便Scan设备扫描到,从而建立连接通信。广播分为4种类型:(上图PDU Type里的4种)

再加Scan_Req和Scan_Rsp,用来发送扫描请求以获得比广播里带的信息更多的Scan_Rsp。

再加Connect_Req,用来发送连接请求。

以上就构成了广播包的所有类型。

========================画个杠杠,下面讲数据包帧格式===========================

二话不说,上图:

图表 11 数据包帧格式

很清晰吧,多强调一点,LL层报文主要分为两类:LL Data PDU和LL Control PDU。LL Control PDU有以下内容:

图表 12 LL层控制报文

继续吧,后面该payload length字段了,也就是上图绿色那个。

图表 13 数据包帧格式续

========================LL层over,下面是L2CAP============================

L2CAP存在的价值就是可以适配不同的上层协议,诸如:ATT/SMP。继续上图:

图表 14 L2CAP帧格式

继续分解上图黄色三条:

图表 15 L2CAP帧格式续

讲到这里,BLE的帧结构基本就完了。那这些帧是以怎么个序列交互的呢?协议其实就是一种语言,让彼此能听懂意思。

对于BLE的通信过程,我总结如下:

1. BLE广播者广播自己,广而告之,告诉大家:我是谁?我有什么服务?

2. BLE 扫描者扫描广播者

a) 主动扫描,发送scan req报文,广播者回应scan response报文

b) 被动扫描,默默扫。

3. BLE 扫描者发起连接请求。角色为Master,广播者是Slave。请求里告知后续通信的参数,诸如:Slave该什么时候醒来打开Rx,跳频怎么跳等

4. 然后就是正常步调一致的通信,同时醒来,Master Tx一包,Slave Tx回应一包,再睡,如此循环。

图表 16 BLE广播/连接/通信

图表 17 Connect Req报文里带的连接参数

图表 18 连接参数详解

图表 19 连接参数详解续

图表 20 BLE宏观通信过程

==============================BLE基本通信过程over==============================

蓝牙通信通道有了,那用来干什么呢?这就要谈起ATT和GATT了。有了它们,才能完整地提供象运动手环检测心率这样的应用服务。哈哈,是不是很激动呀,终于从下蹿到顶了 :)

那我们就先说应用服务,GATT的规定,应用对应profile,profile里包含若干service,service由characteristic组成,characteristic又由attribute组成,attribute是数据细胞单位。

举个栗子,如图就是一个心率profile。

图表 21 心率应用

应用定义是有了,但如何通过报文交互发现服务以及读写操作服务内容呢?这就是GATT/ATT干的事。如下:

=============================BLE从下到上的通信过程over==========================

最后再讲下BLE的安全,这就要提起SMP,还记得吗?上面图14和图15 L2CAP其中支持的协议之一就是SMP。

SMP协议主要做2件事:鉴权和加密

为了这2件事,需要的过程分为3个阶段:

具体报文交互过程:

图表 22 SMP过程交互

每个BLE的设备IO能力不一样,合作起来就要双方协商出一种鉴权方式,具体方法:

图表 23 BLE设备IO能力

设备IO能力有表示方法了,那就双方碰一碰下呗

这样就决定好了鉴权方式,然后按照上面通信流程生成LTK密钥,SKD为随机数,再合起来生成

Session Key,进行数据加解密。如下图:

4 End

​ 基本就写到这里吧,后续再会补充点抓包报文,以供参考学习。欢迎同学们批评指正,随时拍砖...

5 文中引用的示图出处

图表编号

图表描述

引用出处

图表 2

BLE OSI架构

蓝牙技术联盟 Core_v5.1.pdf

图表 3

跳频

无线技术联盟

图表 4

有跳频的效果图

无线技术联盟

图表 5

无跳频的效果图

无线技术联盟

图表 12

LL层控制报文

蓝牙技术联盟 Core_v5.1.pdf

图表 16

BLE广播连接通信

无线技术联盟

图表 20

BLE宏观通信过程

无线技术联盟

图表 22

SMP交互过程

蓝牙技术联盟 Core_v5.1.pdf

图表 23

BLE设备IO能力

蓝牙技术联盟 Core_v5.1.pdf

原文作者:LG点击查看原文

相关推荐

魔兽世界怀旧服牧师攻略 60版本牧师玩法指南
beat365官网在线

魔兽世界怀旧服牧师攻略 60版本牧师玩法指南

📅 07-05 👁️ 3046
10大新材料 1分钟给你捋清楚不会再迷茫
365bet登录地址

10大新材料 1分钟给你捋清楚不会再迷茫

📅 06-28 👁️ 8737
订单编号生成规则
beat365官网在线

订单编号生成规则

📅 08-20 👁️ 4300
磁力单位换算表
beat365官网在线

磁力单位换算表

📅 06-11 👁️ 876
京东nft币值多少钱 京东1贝币多少钱
365bet登录地址

京东nft币值多少钱 京东1贝币多少钱

📅 08-20 👁️ 3335
eu4wiki百科吞并省份(欧陆风云4百科:吞并领土的终极指南)
灰烬战线公测时间公布!玩家期待已久的游戏盛宴即将开启
卖软件系统的平台有哪些呢
365bet登录地址

卖软件系统的平台有哪些呢

📅 11-01 👁️ 2041
公众号文章阅读量怎么刷为什么不该“刷”?以及如何科学、有效地提升阅读量?