LoRaWAN 1.1 网络协议规范 – 5 MAC指令


LoRaWAN 1.1 网络协议规范

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

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

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


5 MAC指令

网络管理时会在网络服务器和终端设备的MAC层之前传输一系列的MAC指令。MAC层指令对应用、应用服务器或终端设备的应用永不可见。

单个数据帧可以包含任何MAC指令序列,MAC指令既可以包含在FOpts字段中和正常数据一起发送,也可以放在FRMPayload字段单独发送,这是FPorts为0。放在FOpts中的MAC指令必须加密且不得超过15个字节。放在FRMPayload中的MAC必须加密,且不能超过FRMPayload的最大长度。

一条MAC指令由一个字节的命令ID(CID)和可能为空的特定命令序列组成。

接收端回复(answered)或应答(acknowledged)MAC指令,都是按照收到的顺序进行传输。每一条MAC指令的回复都是按顺序添加到缓冲区数据。所有以单独帧接收的MAC指令都必须以单独帧进行回复,这意味着包含有回复的缓冲区数据必须以单独帧发送。如果MAC回复数据的长度大于最大的FOpt字段长度,设备必须把这条缓冲区数据的端口设为0,同时放进FRMPayload里进行发送。如果设备同时有应用负载和MAC回复需要发送,且两者不能同时放进一帧里,那么MAC回复应该优先发送。如果缓冲区数据长度大于最大的FRMPayload可用大小,设备应该在拼接帧数据时减短缓冲区数据至最大FRMPayload长度。因此,最新的一条MAC指令有可能是被截断不完整的。在任何情况下,列表里所有的MAC指令都是可执行的,即便MAC回复的缓冲区数据被减短过。网络服务器不应该产生一系列的MAC指令,因为终端设备不能在单条上行中回复这么多条的MAC指令。网络服务器应该参照以下来计算MAC指令回复的最大FRMPayload可用长度:

  • 如果最新的上行的ADR位为0时:必须考虑最低速数据速率对应的最大负载大小。
  • 如果最新的上行的ADR位为1时:必须考虑设备最新上行的数据速率对应的最大负载大小。

注意:当网络服务器收到被减短的MAC回复时,可以对没有收到回复的MAC指令进行重传。

CID Command Transmitted by short Description
终端 网关
0x01 ResetInd x 由ABP设备发送,告知网络服务器设备有重启以及协商协议版本
0x01 ResetConf x ResetInd指令的应答
0x02 LinkCheckReq x 终端利用这个命令来判断网络连接情况
0x02 LinkCheckAns x LinkCheckReq的回复。包含接收信号强度,预估终端设备的接收能力(链路余量)
0x03 LinkADRReq x 向终端请求改变数据速率,发射功率,重传率以及信道
0x03 LinkADRAns x LinkADRReq的应答
0x04 DutyCycleReq x 向终端设置发送的最大占空比
0x04 DutyCycleAns x DutyCycleReq的应答
0x05 RXParamSetupReq x 向终端设置接收时隙参数
0x05 RXParamSetupAns x RXParamSetupReq的应答
0x06 DevStatusReq x 向终端查询其状态
0x06 DevStatusAns x 返回终端设备的状态,即电池余量和链路解调预算
0x07 NewChannelReq x 创建或修改 1个射频信道
0x07 NewChannelAns x NewChannelReq的应答
0x08 RXTimingSetupReq x 设置接收时隙的时间
0x08 RXTimingSetupAns x RXTimingSetupReq的应答
0x09 TxParamSetupReq x 网络服务器用于设置基于当地规定的终端的最大允许驻留时间和最大EIRP
0x09 TxParamSetupAns x TxParamSetupReq的应答
0x0A DlChannelReq x 通过从上行链路频率移位下行链路频率(即创建非对称信道)来修改下行链路RX1无线电信道的定义
0x0A DlChannelAns x DlChannelReq的应答
0x0B RekeyInd x 有空中升级设备使用,告知一个安全的上下文升级(重新获取密钥)
0x0B RekeyConf x RekeyInd的应答
0x0C ADRParamSetupReq x 网络服务器用于设置终端设备的ADR_ACK_LIMIT和ADR_ACK_DELAY参数
0x0C ADRParamSetupAns x ADRParamSetupReq的应答
0x0D DeviceTimeReq x 终端设备用于获取当前日期和时间
0x0D DeviceTimeAns x 由网络服务器应答,DeviceTimeReq的应答
0x0E ForceRejoinReq x 网络服务器请求设备立即重新入网,可周期性重试
0x0F RejoinParamSetupReq x 网络服务器设备的周期性入网消息
0x0F RejoinParamSetupAns x RejoinParamSetupReq的应答
0x80~0xFF 私有 x x 给私有网络命令拓展做预留。

表4:MAC指令集

注意:一般终端设备对收到的MAC指令只作一次回复。如果回复丢失,那么网络服务器需要重新发送一次该指令。当网络服务器在新的上行没有收到想要的MAC的回复时,自行决定是否重传MAC指令。只有RxParamSetupReq,RxTimingSetupReq,DLChannelReq三个指令有不同的应答机制,因为它们会影响到下行的参数,相关细节在相应的章节里有描述。

注意:当设备终端请求MAC指令时,网络服务器会在请求之后的RX1/RX2窗口尽可能地回复相应地应答/回复指令。如果在相应地窗口没有接收到回复,那么终端设备自行决定是否重传。

注意:MAC指令地长度尽管没有明确给出,但MAC命令执行端必须隐性获知。因此位置地MAC指令不能被忽略,一旦遇到不明地MAC指令,就会终止MAC指令队列的处理。因此建议把LoRaWAN网络协议规范最先描述的MAC指令放在前面。这样的话,所有当前本本的LoRaWAN规范中实现的MAC指令都可以被更高版本的规范兼容处理。

5.1 标志着重启了的指令(ResetInd, ResetConf)

这条MAC指令只对ABP设备和兼容LoRaWAN 1.1版本协议的网络服务器有效。LoRaWAN 1.0服务器不实现这条指令。

OTA设备不应该实现这条指令。网络服务器应该忽略来自OTA设备的ResetInd指令。

ABP设备使用ResetInd指令来通知网络服务器,设备进行了重启,且重新初始化成缺省的MAC和射频参数(换言之,除了三个帧计数器以外的参数都重新出厂化设置了)。ResetInd指令在未收到ResetConf前都必须加到所有的上行的FOpt字段。

这条命令并非告知网络服务器下行帧计数器已经重置。相反,ABP设备的帧计数器(包括上行和下行的帧计数器)应该从不重启。

注意:对ABP设备来说这条命令意味着电源中断过(例如更换电池)。设备可能丢失了存贮在RAM里的MAC层的上下文(帧计数器必须存贮在NVM(非易失性内存)里)。在这种情况,设备需要这种方法来传达给网络服务器说上下文丢失。在后续的LoRaWAN协议版本,这条指令可能也在设备和网络服务器间用来协商一些协议的选项。

ResetInd指令包含设备支持的LoRaWAN的次版本号。

Size(bytes) 1
ResetInd Payload Dev LoRaWAN version

图21:ResetInd 负载格式


Size(bytes) 7:4 3:0
Dev LoRaWAN version RFU Minor=1

次版本号字段表明终端设备支持的LoRaWAN的次版本号。

Minor version Minor
RFU 0
1(LoRaWAN x.1) 1
RFU 2:15

当网络服务器收到ResetInd指令时,应该回复ResetConf指令。

ResetConf指令包含一个字节的负载,即网络服务器支持的LoRaWAN 版本,这和”Dev LoRaWAN version”格式一致。

Size(bytes) 1
ResetConf Payload Serv LoRaWAN version

图22:ResetConf 负载格式

ResetConf携带的服务器的版本必须和设备的版本一致。其他值都是无效的。

如果服务器的版本是无效的,那么设备应该丢弃这条ResetConf指令,并在下一条上行帧时重传ResetInd指令。

5.2 链路检查命令(LinkCheckReq, LinkCheckAns)

终端设备使用LinkCheckReq指令来确认和网络服务器之间的连接。这条指令没有负载。

网络服务器通过单个或者多个网络收到LinkCheckReq指令,然后回复一条LinkCheckAns指令。

Size(bytes) 1 1
LinkCheckAns Payload Margin GwCnt

图23:LinkCheckAns 负载格式

解调预算(Margin)是一个范围为0-254的8位的无符号整数,表明成功接收到最新的LinkCheckReq指令的链路预算(单位为 dB)。若值为0则表明帧是在解调的下限(0 dB或者没有预算了)收到数据,若值为20表明网关在比解调下限高出20 dB的信号强度上收到了数据。255为保留值。

网关数量(GwCnt)是最近一次成功收到LinkCheckReq指令的网关的数量。

5.3 链路ADR指令(LinkADRReq, LinkADRAns)

网络服务器使用LinkADRReq指令来要求终端设备进行速率自适应。

Size(bytes) 1 2 1
LinkADRReq Payload DataRate_TXPower ChMask Redundancy

图23:LinkADRReq 负载格式


Bits 7:4 3:0
DataRate_TXPower DataRate TXPower

请求设置的数据速率(DataRate)和发射功率(TXPower)以不同区域不同特性地被定义在[LoRaWAN区域特性参数文档]。指令中的发射功率被视作设备可用的最大的发射功率。如果指令中指定的发射功率高于终端设备的实际的最大发射功率,终端设备也要回复应答,且需要尽可能提高到最大的发射功率。0xF(十进制15)对数据速率和发射功率意味着设备应该忽略该字段且保持当前的参数值。信道掩码(ChMask)代表了可用的上行链路信道。最低为是从0开始的。

Bits# Usable channels
0 Channel1
1 Channel2
.. ..
15 Channel16

表5:信道状态表

ChMask字段中的某一个位设置为1代表着相应的信道可以进行上行传输,且设备允许该信道使用当前的数据速率。如果是0,代表着相应的信道不可用。

Bits 7 [6:4] [3:0]
Redundancy bits RFU ChMaskCntl NbTrans

冗余(Redundancy)位中,NbTrans字段表示每条上行消息的发送次数。这对”确认”和”非确认”帧都有效。缺省值位1,表示每帧只传输一次。有效范围为[1:15]。如果收到NbTrans==0,终端应该保持当前NbTrans值不变。

信道掩码控制(ChMaskCntl)字段负责控制之前定义的ChMask的掩码位。它负责控制包含16个信道的块,决定哪个ChMask可以使用。还可以用来全局性的打开或关闭所有的信道来使用特定的调制。这个字段的使用方法以不同区域不同特性地被定义在[LoRaWAN区域特性参数文档]。

网络服务器在单条下行消息里可以包含多条LinkADRReq指令。终端设备为了配置信道掩码,必须按照下行消息中的命令块(即多条LinkADRReq指令),依照顺序处理所有的LinkADRReq消息。网络服务器在一条下行消息中不应该包含超过一个命令块。终端设备应该发送单个LinkADRAns应答来全部接受或者全部拒绝拒绝这个命令块。如果下行包含多于一个ADR命令块,终端设备应该处理第一个块,对于其余地ADR命令块则回复一条NAck(即一条所有状态位都设置为0的LinkADRAns应答)。对于数据速率,发射功率和重传次数,因为它们是全局性的设置,所以设备只需按照连续ADR命令块中最后一条LinkADRReq指令中的来执行即可。按顺序处理完连续ADR命令块,信道掩码应答位应该是指最后信道方案的接受还是拒绝。

信道频率以不同区域不同特性地被定义在[LoRaWAN区域特性参数文档]。终端设备用LinkADRAns指令来回复LinkADRReq指令。

Size(bytes) 1
LinkADRAns Payload Status

图25:LinkADRAns负载格式


Bits [7:3] 2 1 0
Status Bit RFU Power ACK Data rate ACK Channel mask ACK

LinkADRAns 状态位为以下含义:

Bit = 0 Bit = 1
Channel mask ACK 发送的 channel mask 使能了未定义的信道或者禁用所有信道。命令被丢弃,终端设备状态不变。 发送的 channel mask 成功解析,已按照 mask 设置了当前的信道状态。
Data rate ACK 所请求的数据速率,终端无法识别,或者无法应用在当前信道中(不被任何使能的信道所支持)。命令被丢弃,终端设备状态不变。 数据速率成功设置,或者要求设置的数据速率为15,这表明忽略掉。
Power ACK 所请求的发射功率不能或者不得低于在终端上执行。命令被丢弃,终端状态不变。 功率等级成功设置,或者要求设置的发射功率为15,这表明应该忽略掉。

表6:LinkADRAns 状态位的含义

如果三个位中任意一个为0,表明这个指令设置不成功,节点将保持之前状态。

5.4 终端设备发射占空比(DutyCycleReq,DutyCycleAns)

DutyCycleReq指令被网络协调者用来限制终端设备的总发射占空比的最大值。总发射占空比指所有子频带的发射占空比。

Size(bytes) 1
DutyCycleReq Payload DutyCyclePL

图26:DutyCycleReq负载格式


Bits 7:4 3:0
DutyCyclePL RFU MaxDCycle

终端设备允许的最大发射占空比为:


总发射占空比=1/2
MaxDCycle

MaxDutyCycle的有效范围值是[0:15].值0代表着“没有占空比限制”,有限制地区的除外。

终端设备用DutyCycleAns指令来回复DutyCycleReqDutyCycleAns的MAC应答不包含任何的负载。

5.5 接收窗口参数(RXParamSetupReq, RXParamSetupAns)

RXParamSetupReq指令可以对每个上行消息之后的第二接收窗口(RX2)的频率和数据速率进行改变。该指令同时允许修改下行RX1的数据速率,使下行RX1的数据速率相对上行进行偏移。

Size(bytes) 1 3
RXParamSetupReq Payload DLsettings Frequency

图27:RXParamSetupReq负载格式


Bits 7 6:4 3:0
DLsettings RFU RX1DRoffset RX2DataRate

RX1DRoffset字段用来设置终端设备上行和下行第一个接收窗口(RX1)数据速率之间的偏移。偏移的缺省值为0。偏移量用来考量一些地区的基站最大功率密度限制和平衡上下行的射频链路预算。

数据速率(RX2DataRate)字段定义了第二接收窗口使用的下行数据速率,用法和LinkADRReq指令一致(例如,0表示DR0/125kHz)。频率(Frequency)字段表示第二接收窗口使用信道的频率,因此频率编码规则的定义详见NewChannelReq指令。

终端设备使用RXParamSetupAns指令来应答RXParamSetupReq。终端设备在收到A类下行之前,RXParamSetupAns指令必须添加在所有的上行数据帧的FOpt字段中。这样可以保证即使上行链路存在丢包,网络服务器也总能知道设备使用的下行链路参数。

负载包含单字节的状态信息。

Size(bytes) 1
RXParamSetupAns Payload Status

图28:RXParamSetupAns负载格式

状态(Status)位有以下含义:

Bits [7:3] 2 1 0
Status bits RFU RX1DRoffset ACK RX2DataRate ACK Channel ACK

LinkADRAns 状态位有以下含义:

Bit = 0 Bit = 1
Channel ACK 终端请求的频率不可用 RX2信道设置成功
RX2DataRate ACK 终端请求的数据速率未知 RX2数据速率设置成功
RX1DRoffset ACK RX1上行/下行数据速率的偏移不在允许的范围之内 RX1DRoffset设置成功

表7:RXParamSetupAns 状态位的含义

如果三个位中任意一个为0,表明这个指令设置不成功,必须保持之前状态。

5.6 终端设备状态(DevStatusReq, DevStatusAns)

网络服务器使用DevStatusReq指令来查询终端设备的状态信息。这个指令没有负载。如果终端设备收到DevStatusReq,它必须回复DevStatusAns指令。

Size(bytes) 1 1
DevStatusAns Payload Battery Margin

图29:DevStatusAns负载格式

报告电池电量(Battery)的编码如下:

Battery Description
0 终端连接到外部电源
1..254 数值表示电池电量,1表示最低,254表示最高
255 终端无法测量电池电量

表8:电池电量编码

余量(Margin)是最近一次成功接收DevStatusReq指令的解调信噪比,其值为四舍五入取整,单位为Db。它是6位的有符号整数,最大值为31, 最小值为-32

Bits 7:6 5:0
Status bits RFU Margin

5.7 信道的创建或修改(NewChannelReq, NewChannelAns, DIChannelReq, DIChannelAns)

设备工作在固定的信道方案区域时,这些MAC指令不应该起作用。设备不应该回复这些指令。

请参照[LoRaWAN区域特性参数文档]。

NewChannelReq指令可以用来修改现有的双向信道或者创建一个新的信道。这条指令设置新的信道的中心频率以及该信道的上行数据速率的范围。

Size(bytes) 1 3 1
NewChannelReq Payload ChIndex Freq DrRange

图30:NewChannelReq负载格式

信道索引(ChIndex)是将要创建或修改的信道索引。根据所使用的区域和频带,在[LoRaWAN区域特性参数文档]里LoRaWAN网络协议规范规定了缺省信道,这些信道所有的设备都通用且不能通过NewChannelReq指令修改。如果缺省信道的数量为N,那缺省信道就是从0到N-1,且ChIndex的可接收范围为N到15。设备必须具备处理至少16个个不同的信道的能力。在某些地区,设备可以存贮超过16个信道。

频率字段是一个24位无符号整数。实际信道频率为(100 x Freq),单位为Hz,其中低于100 MHz的频率数值将会保留供将来使用。这允许以100 Hz为步长,设置100 MHz到1.67 GHz之间的信道频率。Freq的值为0代表关闭这个信道。终端设备必须检查实际能使用的频率硬件射频能否支持,否则返回错误。

数据速率范围(DrRange)字段表示这个信道允许的上行数据速率的范围。该字段被分成两个4位:

Bits 7:4 3:0
DrRange MaxDR MinDR

按照章节5.2所定义的规则,最小数据速率(MinDR)字段规定了该信道最低上行数据速。例如以欧洲地区参数而言,0表示DR0 / 125 KHz,同样的,最大数据速率(MaxDR)字段规定了该信道最大上行数据速。例如,DrRange = 0x77 表示该信道只允许使用 50 kbps的GFSK。DrRange = 0x50 表示支持DR0 / 125 kHz 到 DR5 /125kHz。

新增加或修改的信道一旦使能,可以立即用来通讯。RX1下行频率和上行频率相同。

终端设备通过回复NewChannelAns指令来应答NewChannelReq。这条消息的负载包含以下信息:

Size(bytes) 1
NewChannelAns Payload Status

图31:NewChannelAns负载格式

状态(Status)位有以下含义:

Bits [7:2] 1 0
Status RFU Data rate range ok Channel frequency ok


Bit = 0 Bit = 1
Data rate range ok 指定的数据速率范围超出了终端当前范围 该数据速率与终端能够兼容
Channel frequency ok 终端无法使用该频率 终端能够使用该频率

表9:NewChannelAns 状态位的含义

如果两个位中任意一个为0,表明这个指令设置不成功,新的信道没有被创建成功。

DIChannelReq指令允许网络服务器在RX1时使用不同的下行频率。这个指令适用于所有支持NewChannelReq指令的区域(例如欧盟或者中国,但不适用于美国或澳大利亚)。

这个指令设置下行RX1的中心频率,如下:

Size(bytes) 1 3
DIChannelReq Payload ChIndex Freq

图32:DLChannelReq负载格式

信道索引(ChIndex)是被修改的下行频率的信道索引。

频率(Freq)字段是一个24位无符号整数。实际信道频率为(100 x Freq),单位为Hz,其中低于100 MHz的频率数值将会保留供将来使用。终端设备必须检查实际能使用的频率硬件射频能否支持,否则返回错误。

终端设备通过回复DIChannelAns指令来应答DIChannelReq。终端设备在收到A类下行之前,DIChannelAns指令必须添加在所有的上行数据帧的FOpt字段中。这样可以保证即使上行链路存在丢包,网络服务器也总能知道设备使用的下行频率。

这条消息的负载包含以下信息:

Size(bytes) 1
DIChannelAns Payload Status

图33:DLChannelAns负载格式

状态(Status)位有以下含义:

Bits [7:2] 1 0
Status RFU Uplink frequency exists Channel frequency ok


Bit = 0 Bit = 1
Channel frequency ok 设备无法使用该频率 设备可以使用该频率
Uplink frequency exists 这个信道的上行频率没有定义,下行频率只能设置已经存在的上行频率的信道 这个信道的上行频率是有效的

表10:DIChannelAns 状态位的含义

5.8 TX和RX之间的延时设置(RXTimingSetupReq, RXTimingSetupAns)

RXTimingSetupReq指令允许配置上行传输结束与第一个接收窗口开启之间的时间间隔。第二接收窗口比第一个接收窗口晚一秒开启。

Size(bytes) 1
RXTimingSetupReq Payload Settings

图34:RXTimingSetupReq 负载格式

延迟(Delay)字段指定时间间隔。这字段分成两个4字节:

Bits 7:4 3:0
Settings RFU Del

延迟的单位为秒。Del = 0 对应于 1秒

Del Delay[s]
0 1
1 1
2 2
3 3
.. ..
15 15

表11:RXTimingSetup 延迟映射表

终端设备使用不带负载的RXTimingSetupAns指令来回复RXTimingSetupReq

终端设备在收到A类下行之前,RXTimingSetupAns指令必须添加在所有的上行数据帧的FOpt字段中。这样可以保证即使上行链路存在丢包,网络服务器也总能知道设备使用的下行参数。

5.9 终端设备重传参数(TxParamSetupReq,TxParamSetupAns)

这个MAC指令只在管控的特定区域执行。请参考[LoRaWAN区域特性参数文档]。

TxParamSetupReq指令可以用来通知终端设备的最大驻留时间。换言之,一包数据在空中的最大持续传输时间,以及终端设备所允许的最大等效全向辐射功率(EIRP)。

Size(bytes) 1
TxParamSetupReq Payload EIRP_DwellTime

图35:TXParamSetupReq 负载格式

EIRP_DwellTime字段的结构如下:

Bits 7:6 5 4 3:0
MaxDwellTime RFU DownlinkDwellTime UplinkDwellTime MaxEIPR

TxParamSetupReq指令的0..3位用来对最大EIRP值的编码,如下表。表中EIRP值包含不同区域管控的最大EIRP限制的最大范围。

Coded Value 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Max EIRP(dBm) 8 10 12 13 14 16 18 20 21 24 26 27 29 30 33 36

表12:TxParamSetup EIRP 编码表

最大EIRP指的是设备无线电发射的功率上限。设备不要求使用该功率进行传输。,但不应该超过该EIRP。

第4、第5位分别定义了最大上行和下行的驻留时间。编码如下:

Coded Value Dwell Time
0 No Limit
1 400 ms

当这个MAC指令生效时(因区域而定),设备回复TxParamSetupAns指令来应答TxParamSetupReq。这个TxParamSetupAns指令不能包含任何的负载。

当在一个对此没有要求的区域使用该指令,设备不处理且不会回复。

5.10 重新获取密钥指令(RekeyInd, RekeyConf)

这条MAC指令只对OTA设备和兼容LoRaWAN 1.1版本协议的网络服务器有效。LoRaWAN 1.0服务器不实现这条指令。

ABP设备不应该实现这条指令。网络服务器应该忽略来自ABP设备的RekeyInd指令。

对于OTA设备来说,RekeyInd指令用来确定安全密钥的升级和在后续的LoRaWAN版本(大于1.1)用来确定运行在终端设备和网络服务器之间的LoRaWAN的次版本号。这个命令并不意味着MAC和射频参数的重置(参照6.2.3章节)。

RekeyInd指令包含终端设备所支持的LoRaWAN的次版本号。

Size(bytes) 1
RekeyInd Payload Dev LoRaWAN version

图36:RekeyInd 负载格式


Bits 7:4 3:0
Dev LoRaWAN version RFU Minor = 1

最小字段代表设备支持的LoRaWAN的次版本号。

Minor version Minor
RFU 0
1(LoRaWAN x.1) 1
RFU 2..15

OTA设备应该在成功处理完入网请求之后(新的会话密钥生成之后),一直在所有的确认和非确认上行帧里包含RekeyInd指令,直到收到RekeyConf。如果设备在ADR_ACK_LIMIT上行到来之前没有收到RekeyConf,那么它应该变回请求入网状态。在之后任何时候设备发送的RekeyInd指令网络服务器都应该丢弃掉。在收到入网请求之后的新安全的密钥以及带有RekeyInd指令的第一条上行帧之前,网络服务器应该丢弃所有的上行帧。

当网络服务器收到RekeyInd指令时,回复一条RekeyConf指令。

ResetConf指令包含一个字节的负载,即网络服务器支持的LoRaWAN 版本,这和”Dev LoRaWAN version”格式一致。

Size(bytes) 1
RekeyConf Payload Serv LoRaWAN version

图37:RekeyConf 负载格式

服务器版本必须大于0(不允许为0)。小于或等于设备的LoRaWAN版本。因此对于一个LoRaWAN1.1版本的终端设备来说,有效值只能为1。如果服务器的版本无效,终端设备应该丢弃这条RekeyConf指令,并在下一个上行帧时重传RekeyInd指令。

5.11 自适应参数(ADRParamSetupReq, ADRParamSetupAns)

ADRParamSetupReq指令允许改变ADR_ACK_LIMIT和ADR_ACK_DELAY这两个在ADR回退机制中使用的参数。ADRParamSetupReq指令由一个单字节负载。

Size(bytes) 1
ADRParamSetupReq Payload ADRparam

图38:ADRParamSetupReq 负载格式


Bits 7:4 3:0
ADRparam Limit_exp Delay_exp

Limit_exp字段设置ADR_ACK_LIMIT参数的值:


ADR_ACK_LIMIT = 2^Limit_exp

Limit_exp有效范围为0到15, 对应的ADR_ACK_LIMIT是1到32768。

Delay_exp字段设备ADR_ACK_DELAY参数的值:


ADR_ACK_DELAY = 2^Limit_exp

Limit_exp有效范围为0到15, 对应的ADR_ACK_DELAY是1到32768。

终端设备使用ADRParamSetupAns指令来应答ADRParamSetupReqADRParamSetupAns指令不包含负载字段。

5.12 设备时间指令(DeviceTimeReq, DeviceTimeAns)

这条MAC指令只对兼容LoRaWAN 1.1版本协议的网络服务器有效。LoRaWAN 1.0服务器不实现这条指令。

终端设备使用DeviceTimeReq指令来请求服务器的当前网络日期和时间。该请求没有负载。

网络服务器使用DeviceTimeAns来给终端设备提供网络日期和时间。这个时间是上行传输结束时的网络时间。这个命令包含5个字节的负载,如下:

Size(bytes) 4 1
DeviceTimeAns Payload 32位无符号整数:1980年1月6日凌晨0点(*)至至今走过的秒 8位无符号整数:分秒,以1/2^8步长

图39:DeviceTimeAns 负载格式

网络服务器提供的时间最差的时间精度必须在正负 100 毫秒。

(*)GPS 纪元(换言之,指1980年1月6日凌晨0点)作为起点。“秒”字段是以纪元为起点,经过的秒的数量。这个字段每秒单纯的加1。把这个字段转成UTC时间,闰秒必须考虑在内。

例如:2016年2月12日的14点24分31秒对于的GPS纪元时间是1139322288秒。2017年6月,GPS时间比UTC时间多出17秒。

5.13 重新入网指令(ForceRejoinReq)

网络服务器通过重新入网指令要求设备立即发送重新入网请求(Rejoin-Request)类型0或类型2消息,并带有可编程的重传字段,发送周期和数据速率。服务器可以使用这个RejoinReq上行帧来重新生成设备的密钥或初始化漫游切换过程。

这个命令有2个字节的负载。

Bits 15:14 13:11 10:8 7 6:4 3:0
ForceRejoinReq bits RFU Period Max_Retries RFU RejoinType DR

图40:ForceRejoinReq 负载格式

这些参数的编码如下规则:

Period: 重传之间的时隙应该等于32秒 x 2period + Rand32, Rand32是在[0:32]之间的一个随机数。

Max_Retries:设备重新发送重新入网请求(Rejoin-request) 的总的次数。

  • 0: 重新入网请求只发送一次(不重发)
  • 1: 重新入网请求应该发送2次(1 + 1次重试)
  • 7:重新入网请求应该发送8次(1 + 7次重试)

RejoinType: 这个字段表示设备应该发送的重新入网请求的类型。

  • 0或1: 一个类型为0的重新入网请求将被发送
  • 2: 一个类型为2的重新入网请求将被发送
  • 3到7: RFU

DR:重新入网请求帧应该使用该数据速率DR传输。在实际物理调制的数据速率和DR值的对于关系,和LinkADRReq指令中的一致,且以不同区域不同特性地被定义在[LoRaWAN区域特性参数文档]。

这条指令没有回复,当终端收到这条命令时必须发送重新新入网请求。在收到这条指令时,应该立马进行第一次RejoinReq消息的传输(但有可能网络服务器没有收到RejoinReq)。如果设备在未达到最大重传次数时收到一条新的ForceRejoinReq指令,设备应该继续传输新参数的RejoinReq。

5.14 RejoinParamSetReq(RejoinParamSetupAns)

网络服务器使用RejoinParamSetupReq指令来请求设备定期发送一条RejoinReq类型为0的消息,这条消息包含可编程的周期,即上行的时间和数量。

时间和数量从可能没有时间测量功能的设备中复制。这个周期规定了两条RejoinReq传输之间的最大时间或上行的数量。设备可能发送RejoinReq很频繁。

这个指令有单字节的负载。

Bits 7:4 3:0
RejoinParamSetupReq bits MaxTimeN MaxCountN

图41:RejoinParamSetupReq 负载格式

这些参数定义如下:

MaxCountN = C = 0到15。至少在每2C+4条上行消息,设备必须发送一条类型为0的重新入网请求。

MaxTimeN = T = 0到15。至少在每2T+10秒,设备必须发送一条类型为0的重新入网请求。

  • T = 0 表示大概时17分钟
  • T = 15 大概是1年

以上两种情况种的一种满足(帧上行数量或者时间),RejoinReq帧都会被发送。

设备必须实现上行数量的周期功能(MaxCountN)。基于时间的周期功能是可选的。设备不能实现时间限制必须在回复中说明。

回复有单字节的负载。

Bits Bits 7:1 Bit 0
Status bits RFU TimeOK

图42:RejoinParamSetupAns 负载格式

如果第0位等于1,设备接受最大时间和上行数量的的限制。如果等于0,那么只接受上行数量的限制。

注意:对于有非常低消息频率和没有时间测量能力的设备,可选的上行的数量这个机制不在LoRaWAN范围内。