本帖最后由 欢歌凡语 于 2020-6-18 20:08 编辑
作者:LG
经授权转载自:平头哥芯片开放社区
原文链接:https://occ.t-head.cn/community/post/detail?spm=a2cl5.14290816.0.0.d3ef180ftmepVt&id=614186505178447872&inviteUserId=3674554387000918016
最近因工作需要,投入到BLE项目中,故而花了不少时间翻看标准,钻研原理,以求知其所以然。结合平头哥BLE产品,实践验证理论,还是有了不少心得。一直想记录下来,奈何一直忙(给自己找了个理由),哈哈,今天终于下笔,来个小结。当然,如有不准确之处,还望各位同学批评指正。
目录:1 提笔
2 蓝牙的演进史
3 BLE协议详解
1 提笔最近因工作需要,投入到BLE项目中,故而花了不少时间翻看标准,钻研原理,以求知其所以然。结合平头哥BLE产品,实践验证理论,还是有了不少心得。一直想记录下来,奈何一直忙(给自己找了个理由),哈哈,今天终于下笔,来个小结。当然,如有不准确之处,还望各位同学批评指正。 先声明下,为了配合理解,文中很多图片资料来自SIG/IEEE标准组织或者互联网,如有版权问题,还请联系我,我会立刻纠正。不胜感激!
2 蓝牙的演进史
蓝牙(BlueTooth),是一种支持设备短距离通信的无线电技术,诞生于1994年,最初由电信巨头爱立信公司创制,当时是作为RS232数据线的替代方案。作为有线的无线替代方案,其理念是使用无线电传输来交换数据。名字取自于丹麦的一个国王Harold Bluetooth,此国王据说统一了四分五裂的国家,有点类似于我大秦帝国秦始皇。哈。
如今,蓝牙由蓝牙技术联盟(Bluetooth Special Interest Group,简称SIG)管理。IEEE将蓝牙技术列为IEEE 802.15.1。
从上表演进史可以得出,4.0之前的版本演进主要在追求通信速度,3.0高速蓝牙达到了24Mbps;4.0及其之后的版本演进主要在追求低功耗/低成本等物联网IoT特性。一般将蓝牙3.0之前的BR/EDR蓝牙称为经典蓝牙,而将4.0开始后的蓝牙称为低功耗蓝牙。本文重点介绍的是BLE。
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。
==========================稍歇会儿,画个线,下面为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 引用出处
|