LoRaWAN通信数据帧解析

一、总的数据结构

(图1

 

二、Radio PHY layer(射频物理层)

1PreamblePHDRPHDR_CRCCRC都是硬件生成,无需软件参与,需要软件参与PHYPayload部分。

2CRC校验只出现在上行链路消息中。其中PHDRPHDR_CRCCRC都是射频芯片用于校验数据的完整性和一致性用的,并非用户生成的数据。

 

三、MAC层数据

由图1可以看到,MAC层数据是作为PHYPayload存在的。MIC4个字节的校验码

 

(一)MHDR

MHDR1个字节(字节是二进制数据的单位,一个字节包含八位的二进制数),

MType表示消息类型,Major表示的是激活过程中使用的数据消息格式。

 

(二)MACPayload

 

1FHDR

MAC负载头是由DevAddr4个字节)、FCtrl1个字节)、FCnt2个字节)、FOpts0~15个字节,大部分情况是0字节)组成的。

1.1 帧控制字节FCtrl

     下行时:

     上行时:

       ①ADR:自适应数据速率(Adaptive Data Rate)控制字段。ADR被置位,网络就会通过相应的MAC命令来控制终端设备的数据速率;ADR位可以根据需要通过终端及网络来设置或取消,能帮助终端延长电池寿命和扩大网络容量。

       ②ADRACKreqADR请求响应位。当终端开启ADR模式后,被网络优化过的数据速率高于自己默认的数据速率,终端需要定期检查网络仍能收到上行数据。当终端一直没收到下行回复时,就要置高ADRACKreq,让网关下发命令使终端切换到更低速率。

       ③ACK:消息确认位。当收到confirmed类型消息时,要进行应答。

       ④FPending:帧挂起位。只在下行交互中使用,表示网关还有数据挂起等待下发。此时要求终端尽快发送上行数据来打开接收窗口。

       ⑤FOptsLen表示整个帧可选项(FOpts)的字段长度。

1.2 帧计数器FCnt

    每个终端有两个计算器跟踪数据帧的个数,一个是上行链路计数器(FCntUp,由终端产生并维护;另一个是下行链路计数器(FCntDown),由服务器产生并维护。

 

    终端在相同应用和网络秘钥下,不能重复用相同的FCntUp数值,除非是重传。

 

1.3 MAC配置命令(帧可选项,FOpts

 

①一帧数据中可以包含任何MAC命令,MAC命令既可以放在FOpts中,也可以放在FRMPayload中。但不能出现两个字段都携带MAC命令,如果出现了,设备会丢掉该组数据。

 

②如果FOptsLen=0时,FOpts字段不存在为空;

 

   FOptsLen=0Fopts字段存在,Fopts过程不加密;如果存在FOpts字段,端口0不能使用(FPort必须是不存在或不等于0)。

 

 1.4 端口字段FPort

帧负载字段(FRMPayload)不为空时,端口号也不能为空。此时若FPort=0,表示FRMPayload只包含了MAC命令。

 1.5 帧负载FRMPayload

如果帧数据中包含payload,要先对FRMPayload进行加密,再计算消息的一致性校验码(MIC

 (三)MIC

MIC为消息校验码,要计算消息中所有字段

 

四、入网请求包数据

1所示的是一帧完整的通讯数据,但我们使用单片机来接收时都被硬件处理了,实际得到的数据是PHYPayload这块儿。

 

从串口工具那边看到设备上电后发出的第一帧数据包,可以知道是为入网请求包:

 

 

根据LoRaWAN协议,Join Request的数据包格式为:

 

(图2

对该串数据的各值进行解析(低位在前高位在后)

 

1、首先第一个字节是MHDR0x00,二进制表示0000 0000,则MType=000RFU=000Major=00。(MType=000,表示数据包类型为Join request

2、接下来的八个字节为AppEUI01002a00c024e124按照低位在前高位在后,可以解析出设备的AppEUI值为:24e124c0002a0001

3、下面的八个字节为DevEUI742510931164e124,可以解析出设备的DevEUI值为:24e1641193102574

4、最后的两个字节9a47DevNouce,这是一个随机数,作用是用来生成NwkSkeyAppSkey两个会话秘钥。

五、入网确认包数据 

终端设备上电后向网关发送入网请求包之后,入网成功的话会受到NS下发的Join Accept

 

NS发出的该串数据进行解析(低位在前高位在后)

(图3

 

 

1、MHDR0x20,二进制表示为0010 0000,则MType=001RFU=000Major=00。(MType=001,表示数据包类型为Join Accept

2、AppNonce也是一个随机数,用于终端得到两个会话密钥NwkSKeyAppSKey

3、NetID030201,即网络标识符NetID010203,产生AppSKeyNwkSKey 会用到

4、DevAddr704a3306,即设备的DevAddr06334a70DevAddr是终端的短地址,在数据通讯时,使用的是终端短地址

 

5、DLSettings0000000000

 ①RX1DRoffset位域:用来设置上行数据速率和RX1下行数据速率的偏移量。默认情况下偏移量为0(意思就是上行数据速率与下行数据速率相等)

RX2DataRate位域:设置的是终端第二个接收窗口(RX2)下行的数据速率,0代表DR1/125kHZ

 

 6RxDelay:从发送完成到打开RX1接收窗口的时间,01表示lora发送完数据,1s之后打开第一个接收窗口RX1

7CFList:服务器将信道列表带给终端。一旦CFList出现,就会用它里面的信道替换节点上除了3个默认信道以外的信道,新的信道立刻可用并被终端用来通信

 

♦♦♦下行的join-accept消息数据在终端看到是有经过加密的(需要用存于终端与服务器两边的AppKey对其进行解密),所以从串口log打印只能看出这是一个入网确认包,以及MIC值是多少。

 

六、终端上报数据解析

 

从串口获取一串定期上报的数据来进行解析

(图4

 

1MHDR0x40,二进制表示为0100 0000,则MType=010RFU=000Major=00。(MType=010,表示数据包类型为Unconfirmed Data Up,非确认上行包)

2DevAddrd4b3ed07,即设备的DevAddr07edb3d4

 

3FCtrl80,二进制表示为1000 0000。可看出设备只开启了ADR模式,发送的数据为不确认包;FOptsLen =0,所以Fopts字段不存在

 

4、Fcnt1000,即0x000x10,化成十进制为16,即Fcnt值为16,该数据包的上行帧计数为16

5、因为FOptslen=0,所以Fopts字段不存在,为空

6、FPort55,化成十进制为85,即lora使用的端口是85

7、FRMPayload:帧负载值为fb9ca3127a7b

8、MIC校验值为762a800e

 

 

七、网关下发数据解析

 

(图5

1MHDR0x60,二进制表示为0110 0000,则MType=011RFU=000Major=00。(MType=010,表示数据包类型为Unconfirmed Data Down,非确认下行包)

2DevAddr7b67ab07,即设备的DevAddr07ad677b

 

3、FCtrla5,二进制表示为1010 1001。可看出设备开启了ADRACK

FOptsLen =5,所以Fopts字段存在,且长度为5

 

3、FCnt03000x000x03,化成十进制值也是3,即Fcnt值为3,该数据包的下行帧计数为3

4、FOpts033800ff01。 因为FOptsLen =5,所以FOpts的字节长度为5FOpts中存放的是MAC命令(PFort字段为空,且FRMPayload字段也为空)

①该条MAC命令的CID30x03,所以网关发送的命令是LinkADRReq,用于调整可以调整终端的数据速率

 

LinkADRReq的数据格式:

 

 ③DataRate_TXPower数据格式:

 

DataRate=3,对应为SF7/125kHZ

  TXPower=8,对应的最大发射功率为14dBm

 

 ④ChMask00ff,即通道掩码是ff00

 

6MICf3191031

 

 

 

猜你喜欢

转载自www.cnblogs.com/liann/p/13026975.html