LoRaWAN 1.1 网络协议规范 - 4 MAC 帧格式 Part II

LoRaWAN 1.1 网络协议规范

LoRaWAN 1.1 版本封稿很久了也没有完整啃过一遍,最近边啃边翻译,趁着这个机会把它码下来。

如果觉得哪里有问题,欢迎留言斧正。

翻译不易,转载请申明出处和链接。


4 MAC 帧格式 Part II

4.3.1.6 帧选项(FOptsLen in FCtrl, FOpts)

在FCtrl字节中的帧选项长度域(FOptsLen)表示了包含在帧中的帧选项(FOpts)实际长度。

FOpts传输最大长度为15个字节的MAC指令,这是包含在数据帧中的。参照第5章节查看有效的MAC指令列表。

如果FOptsLen为0,那么FOpts是为空。换言之,如果FOptsLen不为0,那么FOpts不为空。如果MAC指令包含在FOpts字段里,那么端口0不可以使用(FOpt应该不存在或者不为0)。

MAC指令不能同时出现在负载段(payload)或帧选项字段。如果出现了,那么设备应该忽略掉该帧。

如果帧头带有FOpts,那么FOpts应该在先进行加密,再计算消息的一致性校验(MIC)。

加密机制是基于使用128字节密钥长度的AES通用算法,这种算法在IEEE802.15.4/2006 Annex B[IEEE802154]文档里有描述。

密钥K在FOpts字段中的NwkSEncKey中使用,上行和下行链路都是如此。

对于每条消息,算法定义了一个单独的块A:

Size(bytes) 1 4 1 4 4 1 1
A 0x01 4x0x00 Dir DevAddr FCntUp or NFCntDwn 0x00 0x00
表15 加密块格式

方向字段(Dir):上行帧为0,下行帧为1。

块A加密后获取到块S:

S=aes128_encrypt(K,A)

对FOpts的加解密都是通过截位法(舍位法)

(pld | pad16) 异或 块S 获得第一个len(pld)段

4.3.1.7 Class B

上行的Class B位设置为1表明通知服务器,设备转为Class B模式,且现在可以接收指定时间的下行pings。请参考Class B 文档中的Class B部分的章节。

4.3.2 端口字段(FPort)

如果帧负载字段不为空,那么端口字段必须存在,如果存在,那么FPort的值为0意味着FRMPayload只包含MAC指令且接收到的带有该FPort字段的任何帧都应该能被LoRaWAN设备所处理。参照第5章节查看有效的MAC指令列表。FPort的值从1到223(0x01到0xDF)j均由应用来决定,且接收到的带有该FPort字段的任何帧应该能被LoRaWAN设备的应用层所处理。FPort值224专用于LoRaWAN的MAC层测试协议。LoRaWAN设备应该丢弃所有来自从应用层的端口不是1到224的传输请求。

注意:端口224作为MAC测试的专用端口,通过无线的方式在最终版本的设备进行遵守MAC指令的测试,从而在实际场景中不用依赖于特定测试版本的设备。测试和正常操作不能同时进行,但设备的MAC层的实现应该和正常应用的实现是一致的。测试协议采用AppSKEY正常加密。这样可以保证在设备拥有者没有参与的情况下,网络服务器无法开启设备的测试模式。如果在已经连接到正常网络的设备上进行测试,网络服务器端的测试应用获取APPSKey的方法就不属于LoRaWAN协议的范围内了。如果在专门的测试平台(非正常的网络服务器)上通过OTAA进行测试,为了保证入网成功,告知测试平台AppKey 的方法也不属于协议范围。

FPort值225到255(0xE1到0xFF)保留,以便后续标准应用的扩展。

Size(bytes) 7..22 0..1 0..N
MACPayload FHDR FPort FRMPayload
表16 MACPayload 字段长度

N是应用负载(FRMPayload)的字节数,有效的N的长度以不同区域不同特性地被定义在[LoRaWAN区域特性参数文档]。

N应该小于等于:

N<=M-1-length(FHDR)

其中M为MAC 负载的最大长度。

4.3.3 MAC帧负载加密(FRMPayload)

如果数据帧包含负载,那么FRMPayload应该在先进行加密,再计算消息完整性校验(MIC)。

加密机制是基于使用128字节密钥长度的AES通用算法,这种算法在IEEE802.15.4/2006 Annex B[IEEE802154]文档里有描述。

密钥k取决于数据消息的端口:

FPort Direction K
0 Uplink/downlink NwkSEncKey
1..255 Uplink/downlink AppSKey
表3 端口列表

加密字段:
pld = FRMPayload

对于每条数据信息,算法定义了一系列的块Ai,其中i=1到k

k=ceil(len(pld)/16)
Size(bytes) 1 4 1 4 4 1 1
Ai 0x01 4x0x00 Dir DevAddr FCntUp or
NFCntDwn or
AFCntDwn
0x00 i
表17 加密块格式

方向字段(Dir):上行帧为0,下行帧为1。

块Ai加密后获取到块序列Si:

S = aes128_encrypt(K,Ai) 其中i=1到k
S = S1 | S2 | ..| Sk

对负载的加解密都是通过截位法(舍位法)

(pld | pad16) 异或 块S 获得第一个len(pld)段

4.4 信息完整性校验码

对消息的所有字段进行计算得到信息完整性校验码(MIC)

msg = MHDR | FHDR | FPort | FRMPayload

其中len(msg)表示消息的长度。

4.4.1 下行帧

下行帧的MIC计算遵循[RFC4493]:

cmac = aes128_cmac(SNwkSIntKey, B0 | msg)

MIC = cmac[0..3]

其中块B0定义如下:

Size(bytes) 1 2 2 1 4 4 1 1
B0 0x49 ConfFCnt 2x0x00 Dir=0x01 DevAddr AFCntDwn or
NFCntDwn
0x00 len(msg)
表18 下行MIC计算块格式

如果设备接入LoRaWAN1.1版本的网络服务器同时下行帧的ACK位使能,这意味着这一帧是上行确认帧的应答帧,ConfFCnt是上行确认帧的应答帧的帧计数器对2^16取模。其他情况则ConfFCnt = 0x0000。

4.4.2 上行帧

上行帧的MIC计算如下过程:

其中块B0定义如下:

Size(bytes) 1 4 1 4 4 1 1
B0 0x49 0x0000 Dir=0x00 DevAddr FCntUp 0x00 len(msg)
表19 上行B0MIC计算块格式

其中块B1定义如下:

Size(bytes) 1 2 1 1 1 4 4 1 1
B1 0x49 ConfFCnt TxDr TxCh Dir=0x00 DevAddr FCntUp 0x00 len(msg)
表20 上行B1MIC计算块格式

其中:

  • TxDr是上行传输的数据速率
  • TxCh是传输的频道编号
  • 如果上行帧的ACK位使能,这意味着这一帧是下行确认帧的应答帧,ConfFCnt是下行确认帧的应答帧的帧计数器对2^16取模。其他情况则ConfFCnt = 0x0000。

cmacS = aes128_cmac(SNwkSIntKey, B1 | msg)

cmacF = aes128_cmac(FNwkSIntKey, B0 | msg)

如果设备接入LoRaWAN1.0版本的网络服务器,那么:

MIC = cmacF[0..3]

如果设备接入LoRaWAN1.1版本的网络服务器,那么:

MIC = cmacS[0..3] | cmacF[0..1]

posted @ 2019-03-08 23:31  在路上的Ye子  阅读(1302)  评论(0编辑  收藏  举报