BLE协议学习总结-阿里云开发者社区

开发者社区> 平头哥芯片开放社区> 正文

BLE协议学习总结

简介: (作者:LG)

1 提笔

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

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

2 蓝牙的演进史

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

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

版本演进史:

image.png
表格 1 蓝牙版本演进

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

3 BLE协议详解

我的经验是,要学习掌握某一数据通信协议,先找出其OSI模型,然后从底层(物理层)向上层层剥离。闲话少说,上图。
image.png
图表 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字段表明。一图胜千言:
image.png
图表 3 跳频
再看看有跳频和无跳频的对比:
image.png
图表 4 有跳频的效果图
image.png
图表 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。
image.png
图表 6 BLE各版本速率
image.png
图表 8 BLE支持的无编码/编码物理层

==========================稍歇会儿,画个线,下面为LL层============================

BLE LL层,发展到这层,那就要从帧格式说起。

BLE帧主要分为两种:广播包和数据包。上图。
image.png
图表 9 BLE帧格式

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

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

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

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

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

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

二话不说,上图:
image.png
图表 11 数据包帧格式

很清晰吧,多强调一点,LL层报文主要分为两类:LL Data PDU和LL Control PDU。LL Control PDU有以下内容:
image.png
图表 12 LL层控制报文

继续吧,后面该payload length字段了,也就是上图绿色那个。
image.png
图表 13 数据包帧格式续

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

L2CAP存在的价值就是可以适配不同的上层协议,诸如:ATT/SMP。继续上图:
image.png
图表 14 L2CAP帧格式

继续分解上图黄色三条:
image.png

图表 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回应一包,再睡,如此循环。
image.png
图表 16 BLE广播/连接/通信
image.png
图表 17 Connect Req报文里带的连接参数
image.png
图表 18 连接参数详解
image.png
图表 19 连接参数详解续
image.png
图表 20 BLE宏观通信过程

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

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

那我们就先说应用服务,GATT的规定,应用对应profile,profile里包含若干service,service由characteristic组成,characteristic又由attribute组成,attribute是数据细胞单位。
image.png
举个栗子,如图就是一个心率profile。
image.png
图表 21 心率应用

应用定义是有了,但如何通过报文交互发现服务以及读写操作服务内容呢?这就是GATT/ATT干的事。如下:
image.png
=============================BLE从下到上的通信过程over==========================

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

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

为了这2件事,需要的过程分为3个阶段:
image.png
具体报文交互过程:
image.png
图表 22 SMP过程交互

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

设备IO能力有表示方法了,那就双方碰一碰下呗
image.png
这样就决定好了鉴权方式,然后按照上面通信流程生成LTK密钥,SKD为随机数,再合起来生成

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

4 End

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

5 文中引用的示图出处

image.png

添加班级群

阅读完今日份的文章分享后,别忘了打开钉钉APP,扫描下方训练营班群二维码👇,参与今日课程直播或观看直播回放,群内不定时配备讲师答疑~
学习完课程视频后,我们今天的学习才算正式结束哦~
image.png

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
平头哥芯片开放社区
使用钉钉扫一扫加入圈子
+ 订阅

芯片开放社区(Open Chip Community 简称OCC),是平头哥芯片基础设施的云端载体,提供开发中心、创芯空间、技术部落等互动版块,汇聚海量应用资源,助力芯片合作伙伴构建软硬融合的芯片生态。面向芯片企业,OCC以应用驱动芯片精准定义、以全栈技术支撑芯片敏捷开发;面向开发者,OCC以芯片生态降低IoT开发门槛、以1520体系加速IoT产品落地。

官方博客
官网链接