本文是参考一些博文和书籍做的笔记,如有不适联系删除
参考:https://www.cnblogs.com/iini/p/8977806.html
《BLE4.0 低功耗蓝牙 协议 总结 》
目录
2.7、Security Manager Protocol(SMP)
1、广播包
1.1、PDU Type
具体定义如下。可以看出扫描PDU和发起连接PDU都属于广播包
1.2、MAC地址
- TxAdd/RxAdd,各占1bit,表示随后的Device Address字段代表的蓝牙MAC地址类型,值0代表Public地址,值1代表Random地址。
然而这个标记指定放在哪的地址是随机地址还是公共地址呢?在报文类型命令中对应的净荷带有 6bytes 地址, 这些地址就紧跟在长度的后面,这些标志位就是标示这些地址类型的
净荷长度:这个长度是指在 PDU 中的数据除去报头和长度之外的有效净荷数据的长度, 注意的是这里只用到了 6bit 的长度,也就是说最大只能有 64 个字节长度,够了吗?实际上在表 2-2 中 净 荷 数 据 上 面 就 标 明 了 净 荷 的 长 度 最 大296bits=37Bytes,也就是说在整个数据包中,在链路层真正的有效数据最大是 37 个字节, 所以需要用也只需要 6bits 长度。再看图 2-10 可知实际的有效数据变为了最多 37-6=31 字节
2、数据包
在数据报文中有 Message Integrity Check (MIC)信息完整性检测。为了保证数据的正确性, 它占有 32bit 即 4 个字节, 这涉及到加密操作, 它是用虚线表示的,也就是不一定要有, 因为并不是一定要加密才能工作, 例如 MIC 在某些情况是不需要 MIC 的:
- 没有加密的链路层连接
- 有加密的链路连接,但是发送的是空包,也就是有效 PDU 是为空的包。
注意: 这里的有效净荷数据长度最大只有 216bits 了, 也就是 27个字节,加上 MIC 的 4 个字节,也才 31 字节,那么还有 6 字节去哪了? 实际上协议规范就是这么规定的,在广播通道这 6 个字节是设备地址,在数据通道规定最大的净荷包不能超过 27 个字节。 不管有没有 MIC 净荷只能是最多 27 字节 (针对ble4.0 的解释)
2.1、LLID
link layer ID,对LL PDU进行分类:LL data PDU和LL control PDU。也就是说,普通的数据信道空中包包含LL数据包和LL控制包两种,
2.1.1、LL Data PDU
链路层的数据通道是用来发送 L2CAP 的数据,也就是说只要是数据一定是从 HOST 层发送到下层的。而数据 PDU 的标示就是 LLID 为01b 或者 10b。
(1)LLID=01b 这个数据要么是将 L2CAP 层的数据分解成多包发送的连续包,或者是一个空包。 对于空包, 数据 PDU 报头的长度域是需要设置成 00000b, 而空包可被从机应答任何数据通道包。 图 2-65 为空中采集的空包。
(2)LLID=10b 那么这包数据表示一个 L2CAP 层信息的起始包,当然如果 L2CAP 层的数据可以用链路层的一包数据发送完毕,即不需要分解成多个包发送,也是 10b 标示,相当于起始包一包就能将数据发送完毕。 对于这个 LLID,数据 PDU 报头是的长度域是不能为 00000b 的。
2.1.2、LL Control PDU
对于链路层的控制, LLID=11b。 它的有效数据段还分为了两个区域
2.2、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和重传功能。
2.3、MD 多包发送机制
more data,用来指示对方我还有数据包要传,请继续打开射频窗口准备接收。比如Nordic nRF51822一个connection interval可以发6个包或者更多的包(也就是说,一个connection event包含多个数据包交互),用的就是MD来实现的。以notify命令为例,设备(Server)notify第一个数据包并将MD置1,Client(比如手机)收到这个notify命令后,就知道Server还有数据包要传,此时手机可以继续发一个空包给设备,以让设备把第二个notify命令发过来,详情如下所示。注:Master为手机(Client),Slave为设备(Server)。
2.4、Payload Length 有效净荷长度
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字节。
2.5、L2CAP length MTU
L2CAP length2字节长度,表示后面information payload的长度,information payload最大长度除了受这个L2CAP length字段约束,同时还受MTU的限制,对于 BLE4.0 最大传输单元(MaximumTransmission Unit (MTU))为 23 字节,也就是 Information payload的最大数量为 23 字节。MTU,Maximum Transmission Unit,是ATT层与L2CAP层可以交互的最大数据长度,或者说是Client与Server可以交互的最大长度。那么如果需要发送的数据超过 23 字节怎么办呢?方法是剪短后分段发送,所有在 LL 层的报头中才有 MD标志存在。 Information payload 信息放的就是 L2CAP 上层 ATT 的数据包。
总结一下,蓝牙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。
2.6、L2CAP Channel ID
Channel ID:通道 ID。 0x0004、 0x0005、 0x0006 三个可选
对于 L2CAP 层的 3 个信道, 0x0004 为它的上层属性协议(ATT)使用, 0x0006 为它的另外一个与 ATT 并列的一个上层安全管理协议(SMP)使用,而对于 0x0005 它是低功耗信令信道的固定信道, 这个信道上传输的是命令包,这个信道上传输的是命令包, 那么它的上层是谁呢?数据给谁又由谁提供数据呢?答案是通用访问规范 Generic Access Profile(GAP), 只是有意思的是,GAP 并没有具体的数据包的格式,它只提供数据,真正的组包是在别的层。
2.7、Security Manager Protocol(SMP)
用来实现配对和密钥分发的,SMP支持如下PDU命令:
3.8Attribute Protocol(ATT)
就是我们经常用到的应用层,应用数据就跟在ATT命令后面,ATT支持如下命令列表: