文章内容仅作为学习笔记参考使用
通俗来说,Beacon标准来自于大型供货商或企业集团(如谷歌、苹果)制定的蓝牙应用规范,是一种蓝牙广播标准。
以谷歌指定的Eddystone为例,其含有四种帧格式
图1 Eddystone的四种帧格式
分别为UID、URL、TLM/ETLM、EID
在进行分别阐述前,先了解一下UUID(通用唯一标识符)格式
图2 UUID格式
UUID通常是128个比特,但是在实际开发中,16-32bit也能满足使用条件,一个蓝色方块为16bit宽度,八个方块共同组成UUID。UUID在蓝牙官方注册,若指定某特定机构,请在使用前按需要查表。
图3 UUID编号范围及适用对象
言归正传,让我们重回到标题——广播包
图4 蓝牙4.2协议栈结构
这是蓝牙4.2的协议栈,广播包一般来自于控制器的LL,也就是链路层。那么我们就必须清楚链路层的数据格式是怎么样的。
图5 链路层的结构
如图,数据格式分为广播报头和数据报头。由于我们讨论的是广播信标,故分析广播报头即可。
图6 ESP32广播包格式
广播包(ESP32版本)分析:
前四个字节:固定,表示数据包访问的地址,一般是大端表示,即最左边是高比特位。
头:第一个字节:报头,第二个字节:长度,这里的长度表示后面6-37字节数据的长度
数据(PDU,在上一篇文章L2CAP介绍中出现):最少是六个字节,因为自身地址就是6位,真正有效的数据在有效载荷内,而这个有效载荷中包含的广播数据由多个AD结构体组成,AD结构体也在图中表示了出来,由一个字节表示长度和一个字节表示类型和x个字节的数据构成,这里的x=长度-类型。
CRC:循环冗余检验,这里不赘述,相关过程可参考b站播放量最高的有关于CRC校验的视频。
图7 Eddystone Beacon
Eddystone数据包:即图6中的Adv Data结构,或者是PDU有效载荷的内容,共31个字节,由多个AD结构组成
以第一个AD结构为例:一共是三个字节,其中Len代表类型+数据的长度总和为两个字节,而长度占一个字节,故类型占据一个字节,其中类型赋值为0x01,查表后才能知道代表的具体含义。
接下来就是文章开头提到的Eddystone结构的数据包了
图8 Eddystone frame data
简单认识结构即可,具体实现需要结合ESP32官方代码去学习