(五)深⼊理解蓝⽛Mesh的消息格式之“格式与长度”
⽬录
蓝⽛Mesh层级结构:
蓝⽛mesh从上到下的层级结构如图1,其中存在⾃定义的包格式的只有access layer,Upper transport layer,Lower transport layer,network layer和Bear layer。
图1
郑州留学中介排名我们之前提到过,蓝⽛Mesh从蓝⽛BLE的⾓度来讲其实很简单,只是新增了蓝⽛BLE⼴播数据的3个AD Type,然后在⼴播数据中加⼊了加密/解密的处理,我们本次分析蓝⽛Mesh的包结构和长度,我们换⼀个思路,从与BLE结合最紧密的bear开始,从下向上分析蓝⽛Mesh 的各层定义的包结构和包长度,这个思路分析会让我们更容易明⽩⼀句话,“由于底层有限制,所以上层才会这样设计”。
Bear layer:
我们这⾥只介绍Advertising bearer(基于gatt的bear层使⽤的不是很⼴泛),格式如图2:
图2
熟悉BLE⼴播格式的同学看到这⾥⼀定很亲切,这⾥是Mesh和BLE衔接的地⽅,正如之前讲到的,Mesh只是在BLE⼴播数据的基础上加⼊了三种AD Type,可以理解为⼀种特殊的BLE⼴播包。
Mesh profile消息涉及的AD Type有三种,分别如表1:
AD Type Description
stickup
0x29:《PB-ADV》
0x2A:《Mesh Message》
0x2B:《Mesh Beacon》
表1
蓝⽛Mesh⽀持BLE 4.2 spec,最⼤31字节⼴播数据(包括Length(1字节)+ AD Type(1字节)+ AD Data(Length - 1)),由上可推断蓝⽛Mesh的Network PDU最⼤是29个字节。
arc welder
Network layer:
图3电子版圣经
当CTL为0时,表⽰此条消息是Access Message,NetMIC为4字节,TransportPDU最⼤值为16字节,总消息最⼤长度为29个字节:1字节(IVI+NID) + 1字节(CTL+TTL) + 3字节SEQ + 2字节SRC + 2个字节DST + 16字节TransportPDU + 4字节NetMIC。与Bear layer推断的Network PDU最⼤值相同。
其中当CTL为1时,表⽰此条消息是Control Message,NetMIC为8个字节。
Transport Layer:
传输层分为两个部分,低传输层和⾼传输层。
hut低传输层:负责分包与重组,定义了⽤于处理分包/重组的Control message(Segment Acknowledgment message)。
⾼传输层:负责使⽤appkey对access layer传递下来的application数据进⾏加密和解密,定义了⼤部分的Mesh Control Message,也就是说Mesh Control Message是不需要上报到access layer的。
Lower transport layer:
低传输层负责分包和重组,那么access层最多传输多少个字节的数据呢?多长的数据包开始分组呢?最多分多少包呢?这些疑问在Mesh Profile中都是有解释的:access层最多⽀持传输380个字节,加上Upper transport层的4字节TransMIC,在Lower transport层看来就是384个字节Upper transport PDU,最多分包32包,我们⽤384/32=12来推断,12个字节是分包的临界点。
当access layer PDU <= 11个字节:不需要分包,单包传输。
当access layer PDU >= 12个字节:需要分包,每包最⼤12个字节,最多32包。
august什么意思
这⾥⾯还有⼀个特别熟说明,TransMIC是对整个Upper transport PDU校验的,因此如果分包传输的话,也只有最后⼀个分包中包含这个TransMIC。对端的接收设备,需要收到所有的分包之后,再取出TransMIC来校验整体的数据。TransMIC并不都是4字节,还有可能是8字节,分包与重组⽐较复杂,本篇⽂章不做过多介绍,仅介绍包格式与包长度。
根据CTL和SEG Field(表⽰是否是分包的消息)分为了4种Lower transport layer包类型:
图4
1.ungmented Access Message:
图5
未分包的access消息,是最常见的lower transport layer包,可以看到最⼤长度为16字节(1字节SEG+AKF+AID,15字节Upper Transport Access PDU),其中Upper Transport Access PDU最⼤值是15个字节(4字节的TransMIC,实际的access layer pdu只有11个字节,因此不需要分包)。
2.Segmented Access Message:
how much i love you
图6
分包的access messsage,可以看到最⼤长度也是16字节,其中可以看到Segment m字段为最⼤12个字节,符合了分包提到的12个字节的要求,只不过只有最后⼀个分包⾥⾯含有4字节TransMIC。
3.Ungmented Control Message:可比价格
图7月饼起义
4.Segmented Control Message:
图8
综上,Lower transport layer层消息最长为16字节(分包前后最⼤都是16字节,符合Network pdu的限制)。
为了解释分包与未分包的区别,我们分别以11字节,12字节,13字节的access layer pdu为例,解释Lower transport层是如何传输的:
11字节access layer pdu:
使⽤ungmented Access Message格式发送,Upper Transport Access PDU字段为1个字节(4字节t
ransMIC + 11字节access layer pdfu),总计⼤⼩16个字节,⼀包即可传输完成。
12字节access layer pdu:
使⽤Segmented Access Message格式发送,分两包发送出去:第⼀包数据的Segment m字段的值为这12个字节的全部数据,但不包含4字节transMIC(也可以配置分包数据的transMIC为8字节,但我们使⽤4字节transMIC为例),总计16字节;第⼆包数据的Segment m字段的值仅为4字节transMIC,总计8字节。
13字节access layer pdu:
使⽤Segmented Access Message格式发送,分两包发送出去:第⼀包数据的Segment m字段的值为13个字节中的前12个字节,不包含4字节transMIC(也可以配置分包数据的transMIC为8字节,但我们使⽤4字节transMIC为例),总计16字节;第⼆包数据的Segment m字段的值为第13字节的数据+4字节transMIC,总计9字节。
Upper transport layer:
图9
⾼传输层的消息格式如图9,其中Encrypted Access Payload是access layer数据加密后传递下来的,Upper transport layer的最⼤包长度为384个字节。
Access layer:
访问层的包格式如图10:
图10
在介绍Lower Transport层时,我们讲到过它最⼤⽀持32个分组,最⼤⽀持处理384个字节的上层消息,当access layer向下传递消息时,那么这条消息可以确定不是control message了,⽽acccess mess消息在Upper Transport Layer层的transMIC为4字节,在Upper transport layer层是⽤掉了4字节的transMIC后,留给access layer的最⼤长度就变为了380个字节。
因此在上图的access layer层包格式定义中,也可以体现这个380字节的限制:
如果opcode为1个字节,parameters最⼤379字节。
如果opcode为2个字节,parameters最⼤378字节。
昆明外语培训如果opcode为3个字节,parameters最⼤377字节。
其中Opcode + Parameters⼤于11个字节时,会导致Lower transport layer对数据进⾏分包。