# 第5章 MAC 指令

对网络管理者而言,有一套专门的 MAC 指令用来在网络服务器和终端 MAC 层之间交互。MAC 层指令对应用程序或者应用服务器或者运行在终端设备上的应用程序是不可见的。

单个数据帧中可以包含任意 MAC 指令序列,要么在 FOpts 字段中捎带,要么作为独立帧将 FPort 设成 0 后放在 FRMPayload 里。FOpts 捎带的 MAC 指令总是要经过加密后发送并且长度不能超过 15 字节。通过 FRMPayload 发送的 MAC 指令也总是要经过加密,并且不能(MUST NOT)超过 FRMPayload 的最大长度。

MAC 命令是由 1 字节命令码(command identifier,CID)跟着一段可能为空的特定命令字节序列组成的。

MAC 指令由接收端按与传输命令相同的顺序应答或确认。每个 MAC 指令的回应依次添加到缓冲区中。所有在单个帧中接收到的 MAC 指令也必须在单个帧中回应,这意味着包含回应的缓冲区必须在一帧中发送。如果 MAC 指令回应缓冲区长度大于最大 FOpt 字段,设备必须(MUST)将缓冲区作为FRMPayload 发送到端口 0。

如果设备同时具有应用程序负载和 MAC 应答,且两者不能都放入帧中,则应(SHALL)优先发送 MAC 应答。如果缓冲区长度大于可用的最大 FRMPayload 大小,则设备应(SHALL)在组装帧之前将缓冲区裁剪至最大 FRMPayload 的大小。

因此,最后一个 MAC 指令的回应可能会被截断。在所有情况下,都会执行 MAC 指令的完整列表,即使必须裁剪包含 MAC 应答的缓冲区。

网络服务器不得(MUST NOT)生成可能无法在单一上行通讯中得到终端设备应答的 MAC 指令序列。

网络服务器应(SHALL)基于下表计算可用于响应 MAC 指令的最大 FRMPayload 大小:

CID Command 由谁
发送
简短描述
终端 网关
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 OTA 设备用于发出安全上下文更新信号(Rekeying)
0x0B RekeyConf x RekeyInd 的确认
0x0C ADRParamSetupReq x 网络服务器用来设置终端设备的 ADR_ACK_LIMT 和 ADR_ACK_DELAY 参数
0x0C ADRParamSetupAns x 应答 ADRParamSetupReq
0x0D DeviceTimeReq x 终端设备用于请求当前日期和时间
0x0D DeviceTimeReq x 回应 DeviceTimeReq 命令
0x0E ForceRejoinReq x 网络发送,要求终端立即通过可选的周期性重试重新入网
0x0F RejoinParamSetupReq x 网络用于设置设备周期性重新入网连接消息
0x0F RejoinParamSetupAns x 对 RejoinParamSetupReq 命令的应答
0x80~0xFF 私有 x x 给专有网络命令拓展做预留
表4. MAC 指令

注意: 一般情况下,终端设备对接收到的 Mac 命令只响应一次。如果答案丢失,则网络必须重新发送该命令。当接收到不包含答案的新上行链路时,网络决定必须重新发送该命令。只有RxParamSetupReqRxTimingSetupReqDlChannelReq 在它们的相关部分中描述了不同的确认机制,因为它们影响下行参数。

注意: 当终端设备启动 MAC 命令时,网络会尽最大努力在请求之后立即在 RX1/RX2 窗口中发送确认或应答。如果在那个插槽中没有接收到答案,则终端设备可以自由地实现它需要的任何重试机制。

注意: MAC 命令的长度不是显式给定的,必须由 MAC 的实现隐性得知。因此,未知的 MAC 无法跳过,第一个未知的 MAC 命令终止对 MAC 命令序列的处理。因此,建议根据首次引入 MAC 命令的 LoRaWAN 规范的版本来处理 MAC 命令。这样,即使存在只在比实现的规范更新的版本中指定的 MAC 命令,也可以处理到实现的规范版本之前的所有MAC命令。

# 5.1 复位指示

Reset indication commands:ResetInd, ResetConf

这一对 MAC 指令仅对在 LoRaWAN1.1 兼容的网络服务上激活的 ABP 设备有效。LoRaWAN1.0 服务没有实现。

OTA 设备不能(MUST NOT)实现该指令。网络服务应当(SHALL)忽略来自 OTA 设备的 ResetInt 指令。

使用 ResetInd 命令,ABP 终端设备指示网络它已经重新初始化,并且已经切换回默认的 MAC & radio 参数 (即设备制造时的出厂参数,三个帧计数器除外)。ResetInd 指令必须(MUST) 添加至所有上行通信的 FOpt 字段直至收到 ResetConf。

此命令不向网络服务器发出下行帧计数器已重置的信号。在 ABP 设备中,帧计数器(上行和下行)永远不能(SHALL NEVER)重置。

注意:此命令适用于电源可能在某个时刻中断的ABP设备(例如更换电池)。设备可能会丢失存储在 RAM 中的 MAC 层上下文(除了必须存储在 NVM 中的帧计数器)。这种情况下,设备需要一种方法将上下文丢失传达给网络服务器。在 LoRaWAN 协议的未来版本中,该命令还可以用于在设备和网络服务器之间协商一些协议选项。

ResetInd 指令包含终端设备支持的 LoRaWan 次版本号。

Size (bytes) 1
ResetInd Payload Dev LoRaWAN version
图21. ResetInd 载荷格式
Size (bytes) 7:4 3:0
ResetInd Payload RFU Minor=1

Minor 字段指示该设备支持的 LoRaWAN 次版本号。

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

当网络服务器收到 ResetInd 指令时,它回应一个 ResetConf 指令。

ResetConf 指令包含一个编码了次版本号的单字节载荷,格式与“dev LoRaWAN version”相同。

Size (bytes) 1
ResetConf Payload Serv LoRaWAN version
图22. ResetConf 载荷格式

ResetConf 所携带的服务器端版本号必须与设备提供的相同。所有其它数值均为无效。

如果服务端的版本号无效,设备则放弃这条收到的 ResetConf,并在下一个上行帧中重发 ResetInd 指令。

# 5.2 链路检查

Link Check Commands,LinkCheckReq, LinkCheckAns

通过 LinkCheckReq 命令,终端可以知道是否已连接上服务器。该命令没有载荷。

当网络服务器通过一个或者多个网关接收到 LinkCheckReq 命令时,它会以 LinkCheckAns 命令进行回复。

Size (bytes) 1 1
LinkCheckAns Payload Margin GwCnt
图23. LinkCheckAns 载荷格式

解调余量( Margin )是一个范围为 0~254 的 8 位无符号整数,表示成功接收最新的 LinkCheckReq 命令的链路余量(单位为dB)。

若 Margin 值为“0”则意味着数据帧是在解调水平上进行接收(0 dB或者没有预算),当 Margin 值为“20”时则意味着数据帧到达在解调水平之上 20dB 的网关。“255”为保留值。

网关计数(GwCnt)是成功接收最新的 LinkCheckReq 命令的网关个数。

# 5.3 数据速率适应

Link ADR commands,LinkADRReq, LinkADRAns

通过 LinkADRReq 命令,网络服务器请求终端设备执行数据速率适应。

Size (bytes) 1 2 1
LinkADRReq Payload DataRate_TXPower ChMask Redundancy
图24. LinkADRReq 载荷格式
Bits [7:4] [3:0]
DataRate_TXPower DataRate TXPower

所请求的数据速率(DataRate)和发射功率(TXPower)是区域限定的,体现在 [PHY-DOC] 中。命令中的发射功率字段指的是设备可操作的最大发射功率。如果命令中的发射功率高于终端所使用的最大发射功率,终端也要(MUST)应答成功,这种情况下,将终端的发射功率提高至其可能的最大值。DataRate 或 TXPower 取值 0xF(十进制的 15)表示设备要(MUST)忽略该字段,并保持当前参数不变。

频道掩码对上行通信可用的通道编码如下,与 LSB 对应的位为 0:

Bit# Usable channels
0 Channel 1
1 Channel 2
.. ..
15 Channel 16
表5. 信道状态表

ChMask 字段的对应位如果设置为1,则表示对应的信道可以进行上行传输,只要该信道允许终端使用该数据速率。如果对应位设置为0,则表示相应信道不可用。

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

Redundancy 字段中的 NbTrans 位域,指的是每个上行消息的发送次数,这仅对 “confirmed”或“unconfirmed”消息起作用。这个字段的默认值为1,相对应的是每个数据帧只进行单次传输。有效取值范围是[1:15]。如果收到 NbTrans == 0,终端则(SHALL)保持当前 NbTrans 值不变。

信道控制掩码(ChMaskCntl)段控制前面定义的 ChMask 位掩码的解释。它控制了 ChMask 应用的 16 个信道块。也可以对所用信道进行全局的打开或关闭。这个字段的使用有区域限定,定义在 [PHY-DOC] 中。

网络服务器可能会在单个下行帧中包含多个 LinkADRReq 命令。终端为了配置 channel mask ,要(MUST)按照下行消息中的命令出现的顺序逐一地处理所有的 LinkADRReq 消息,作为单个原子块命令。网络服务器不能(MUST NOT)在下行消息中包含一个以上的原子块命令。终端设备则必须(MUST)发送一个 LinkADRAns 命令来接受或拒绝整个 ADR 原子命令块。如果下行消息携带多个 ADR 原子命令块,终端设备应(SHALL)只处理第一个 ADR 原子命令块,并发送一个 NAck(一个所有状态位设置为 0 的 LinkADRAns 命令)响应所有其他 ADR 命令块。

设备必须(MUST)只处理来自连续 ADR 命令块中的最后一个 LinkADRReq 命令的 DataRate、TXPower 和 NbTrans,因为这些设置控制这些值的终端设备全局状态。

响应中的信道掩码 ACK 位必须(MUST)反映出按顺序处理连续 ADR 命令块中所有通道掩码控制之后的接受/拒绝最终信道计划。

信道频点信息是按地区制定的,具体定义在 [PHY-DOC]。终端使用 LinkADRAns 指令来应答 LinkADRReq 指令。

Size (bytes) 1
LinkADRAns Payload Status
图25. LinkADRAns 载荷格式
Bits [7:3] 2 1 0
Status bits RFU Power ACK Data rate ACK Channel mask ACK

LinkADRAnsStatus 字段含义如下:

Bit = 0 Bit = 1
Channel mask ACK 所发的 channel mask 使能了未定义的信道或者禁用了所有信道。命令被丢弃,终端状态不变 所发的 channel mask 已成功解析,已按照 mask 设置了当前的信道状态
Data rate ACK 所请求的数据速率,终端无法识别,或者无法应用在当前信道中(不被任何使能的信道支持)。命令被丢弃,终端状态不变 数据速率成功设置,或 DataRate 字段被设置为 15,意思是被忽略
Power ACK 设备无法执行或低于所请求的发射功率。命令被丢弃,终端状态不变 设备能够执行或低于所请求的发射功率,或请求的 TXPower 字段设置为 15,表示应该忽略
表6. LinkADRAns 状态位含义

如果这三个位中有任何一位等于0,则 LinkADRReq 命令没有成功,节点保持之前的状态。

# 5.4 终端发射占空比

End-Device Transmit Duty Cycle,DutyCycleReq, DutyCycleAns

DutyCycleReq 命令被网络协调者用来限制终端的最大总计发射占空比。最大总计发射占空比覆盖所有子频段上的发射占空比。

Size (bytes) 1
DutyCycleReq Payload DutyCyclePL
图26. DutyCycleReq 载荷格式
Bits 7:4 3:0
DutyCyclePL RFU MaxDCycle

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

MaxDutyCycle 的有效取值范围为[0:15]。MaxDutyCycle的值若为0则表示“无发射占空比限制”,除非各地区有对发射占空比进行限制。

终端使用 DutyCycleAns 指令回复 DutyCycleReqDutyCycleAns 指令不包含任何载荷。

# 5.5 接收窗口参数

Receive Windows Parameters,RXParamSetupReq, RXParamSetupAns

RXParamSetupReq 命令可以对每个上行消息之后的第二接收窗口(RX2)的频率以及数据速率进行改变。该命令还可以对上行数据速率和(RX1)下行数据速率的偏移量进行改变。

Size (bytes) 1 3
RXParamSetupReq Payload DLsettings Frequency
图26. RXParamSetupReq 载荷格式
Bits 7 6:4 3:0
DLsettins RFU RX1DRoffset RX2DataRate

RX1DRoffset 字段设置上行数据速率和第一时隙(RX1)与终端通讯的下行数据速率的偏移量。默认情况下偏移量为0(意思就是上行数据速率与下行数据速率相等)。偏移量用于考虑一些地区的基站最大功率密度限制和平衡上下行射频链路预算。

RX2DataRate 字段定义了第二接收窗口的下行链路数据速率,遵循与 LinkADRReq 指令相同的规则(例如,0表示DR0/125kHz)。Frequency 字段所设置的是第二接收窗口所使用信道的频率,该频率按照与 NewChannelReq 指令相同的规则进行定义。

终端使用 RXParamSetupAns 指令对 RXParamSetupReq 指令进行应答。RXParamSetupAns 指令必须(MUST)添加在所有的上行链路数据帧的 Fopt 字段中直到终端接收到一个Class A类型的下行链路数据帧。这样就可以保证即使在上行链路帧丢失的情况之下,网络服务器总是可以知道终端所使用的下行链路参数。

命令的载荷为1字节的状态信息。

Size (bytes) 1
RXParamSetupAns Payload Status
图28. RXParamSetupAns 载荷格式

Status 各位的含义如下:

Bits 7:3 2 1 0
Status bits RFU RX1DRoffset ACK RX2 Data Rate ACK Channel ACK
Bit = 0 Bit = 1
Channel ACK 终端无法使用请求的频率 RX2时隙信道频率设置成功
RX2 Data rate ACK 终端无法识别请求的数据速率 RX2时隙数据速率设置成功
RX1DRoffset ACK 上行数据速率与RX1下行数据速率的偏移量不在允许的范围之内 RX1DRoffset设置成功
表7. RXParamSetupAns status bits signification

如果3个位的任何一位为0,则 RXParamSetupReq 指令不成功,节点保持之前的状态。

# 5.6 终端状态

End-Device Status,DevStatusReq, DevStatusAns

通过 DevStatusReq 命令,网络服务器向终端设备请求状态信息。该命令无载荷。一旦终端收到 DevStatusReq 命令,则必须(MUST)回复 DevStatusAns 命令。

Size (bytes) 1 1
DevStatusAns Payload Battery Margin
图29. DevStatusAns payload format

报告电池电量(Battery)以如下方式编码:

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

Margin 是最近一次成功接收 DevStatusReq 命令的解调信噪比(该值必须是四舍五入到最近的整数值,单位为dB)。它是6位的有符号整数(最小值为 -32,最大值为31)。

Bits 7:6 5:0
Status bits RFU Margin

# 5.7 信道的创建和修改

Creation / Modification of a Channel, NewChannelReq, NewChannelAns, DlChannelReq, DlChannelAns

在已定义固定信道计划的区域内运行的设备不应(SHALL NOT)实现和响应这些 MAC 命令。参阅 [PHY-DOC]。

NewChannelReq 命令可以用于修改现有的双向信道或者创建一个新的信道。这个命令设置了新信道的中心频率还有上行数据速率的可用范围:

Size (bytes) 1 3 1
NewChannelReq Payload Chlndex Freq DrRange
图30. NewChannelReq payload format

信道索引 Chlndex 是正在创建或者正在修改的信道的索引。根据所使用的区域和频带,某些地区(参阅 [PHY-DOC]),LoRaWAN规范强加了所有设备通用的默认信道,该信道不能被 NewChannelReq 命令修改。如果默认信道的个数为 N,则默认信道的编号从0 到 N-1,并且 ChIndex 的可接受范围为 N 到 15。一个设备必须至少能处理 16 个不同的信道定义。在某些特定的区域,设备可能必须存储超过 16 个信道定义。

Freq 字段是一个 24 位无符号整数。实际信道频率为(100 × Freq),单位为HZ,其中低于 100MHz 的频率数值将会保留供将来使用。Freq 可以设置从100MHz到1.67GHz之间的信道频率,但必须以100Hz为单位。Freq 为零则禁用该信道。终端必须检测该频率是否能被射频硬件所使用,若不行则需返回错误。

数据速率范围 DrRange 字段规定了这个信道所允许的上行数据速率范围。该位域被分为两个 4 位字段:

Bits 7:4 3:0
DrRange MaxDR MinDR

按照章节5.3所定义的规则,最小数据速率(MinDR)字段规定了这个信道所允许的最低上行数据速率。例如使用欧洲区域参数,0 表示 DR0/125kHz。类似的,最大数据速率(MaxDR)规定了最高上行数据速率。例如,若DrRange=0x77则表示一个信道只允许 50kbps 的 GFSK;若 DrRange=0x50 表示一个信道支持 DR0/125kHz 到 DR5/125kHZ 的频率范围。

最近定义以及修改的信道被使能之后可以立刻用于通信。RX1 的下行频率与上行频率相等。

终端以 NewChannelAns 指令对 NewChannelReq 进行应答。NewChannelAns 指令的载荷包含以下信息:

Size (bytes) 1
NewChannelAns Payload Status
图31. NewChannelAns payload format

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 status bits signification

如果以上两位其中之一为 0,则 NewChannelReq 命令不成功,新的信道将不会产生。

DlChannelReq 命令允许服务器在 RX1 时隙使用不同的下行链路频率。这个命令可以适用于所有支持 NewChannelReq 命令物理层(例如欧盟和中国,但是不适用于美国和澳大利亚)。

该命令用于设置 RX1 时隙的下行消息中心频率:

Size (bytes) 1 3
DlChannelReq Payload Chlndex Freq
图32. DLChannelReq payload format

ChIndex 是要修改下行频率的信道的索引。

频率 Freq 字段是24位的无符号整数。实际信道频率为 100×Freq,单位为Hz,其中表示低于 100MHz 的频率数值保留供将来使用。终端必须检测该频率是否能被射频硬件所使用,若不行则需返回错误。

终端以 DlChannelAns 命令对 DlChannelReq 命令进行应答。DlChannelAns 必须(MUST)加入所有上行通信的 FOpt 字段直到终端接收到一个下行数据包。这样才能保证在上行数据包丢失的情况之下,网络服务器总是能够知道终端所使用的下行频率。

该命令的载荷包含如下信息:

Size (bytes) 1
DlChannelAns Payload Status
图33. DLChannelAns payload format

Status 位有以下的含义:

Bits 7:2 1 0
Status RFU 上行频率可用 信道频率可用
Bit = 0 Bit = 1
Channel frequency ok 终端无法使用该频率 终端无法使用该频率
Uplink frequency exists 该信道无法使用此上行频率,只能为已经具有一个有效上行频率的信道设置下行频率 信道的上行频率有效
表10. DlChannelAns status bits signification

# 5.8 TX 和 RX 之间的延时设置

Setting delay between TX and RX,RXTimingSetupReqRXTimingSetupAns

RXTimingSetupReq 命令允许配置 TX 上行链路发送完毕之后与第一个接收窗口打开之间的延时。第二接收窗口在第一接收窗口之后的1秒打开。

Size (bytes) 1
RXTimingSetupReq Payload Settings
图34. RXTimingSetupReq payload format

延迟(Delay)字段指定延时时间。这个字段被分为两个4位字段:

Bits 7:4 3:0
Settings RFU Del

延时时间的单位为秒。Del的值为0时对应的延时时间为1s。

Del Delay[s]
0 1
1 1
2 2
3 3
.. ..
15 15
表11. RXTimingSetup Delay mapping table

终端用于应答 RXTimingSetupReq 命令的 RXTimingSetupAns 命令没有载荷。

RXTimingSetupAns 命令应该添加所有上行通信的 FOpt 字段,直到接收到一个下行数据。这样才能保证在上行数据包丢失的情况之下,网络服务器总是能够知道终端所使用的下行参数。

# 5.9 终端发射参数

End-device transmission parameters,TxParamSetupReq, TxParamSetupAns

该命令只需要在特定的受控地区使用。具体请参考 [PHY-DOC]。

TxParamSetupReq 可以用于通知终端的最大允许驻留时间,即,一个数据包在空中的最大持续传输时间,以及终端所允许的最大全向有效辐射功率(EIRP)

Size (bytes) 1
TxParamSetup payload EIRP_DwellTime
图35. TxParamSetupReq payload format

EIRP_DwellTime 字段的结构如下所述:

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

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 encoding table

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

第4位和第5位分别定义了上行链路和下行链路的驻留时间,驻留时间的映射编码表如下所示:

Coded Value Dwell Time
0 No Limit
1 400 ms

如果实现了该 MAC 指令(因区域而定),终端会以 TxParamSetupAns 命令对 TxParamSetupReq 命令进行回复。TxParamSetupAns 指令不包含载荷。

当在某个区域内是不需要 TxParamSetupReq 命令时,则终端不会对该命令进行任何处理并且不会进行回复。

# 5.10 秘钥更新指示

Rekey indication commands,RekeyIndRekeyConf

此 MAC 指令仅适用于在兼容 LoRaWAN1.1 的网络服务器上激活的 OTA 设备。LoRaWAN1.0 服务器没有实现这个 MAC 指令。

ABP 设备不(MUST NOT)实现该指令。网络服务器应该忽略来自 ABP 设备的 RekeyInd 指令。

对于 OTA 设备,RekeyInd 指令用于确认安全密钥更新,在未来的协议版本(>1.1)中,还将用于协商在终端设备和网络服务器之间运行的LoRaWAN协议次版本号。该命令不发出重置MAC & radio 参数的信号(参见 6.2.3)。

RekeyInd 指令包含终端设备支持的 LoRaWAN 协议次版本号.

Size (bytes) 1
RekeyInd Payload Dev LoRaWAN version
图36. RekeyInd payload format
Size (bytes) 7:4 3:0
Dev LoRaWAN version RFU Minor=1

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

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

OTA 设备应在(SHALL)成功处理 Join-accept 会话之后(派生了新的会话密钥),在所有已确认和未确认上行帧中发送 RekeyInd,直到接收到 RekeyConf 为止。如果设备在第一个 ADR_ACK_LIMIT 上行通信中没有收到 RekeyConf,那么它将恢复到 Join 状态。在以后的任何时候,这些设备发送的 RekeyInd 命令都将(SHALL)被网络服务器丢弃。网络服务器应(SHALL)丢弃任何受新安全上下文保护的上行帧,这些上行帧在Join-accept 传输之后以及携带 RekeyInd 命令的第一个上行帧之前接收。

当网络服务器接收到 RekeyInd 指令,就以一个 RekeyConf 指令应答。

RekeyConf 指令包含一个单字节载荷,该载荷编码网络服务器支持的 LoRaWAN 版本,使用与“dev LoRaWan version”相同的格式。

Size (bytes) 1
RekeyConf Payload Serv LoRaWAN version
图37. RekeyConf payload format

服务器版本必须大于0(不允许为0),小于或等于(<=)设备的 LoRaWAN 版本。因此,对于LoRaWAN1.1 设备,惟一的有效值是 1。如果服务器的版本无效,设备将丢弃 RekeyConf 命令,并在下一个上行帧中重新传输 RekeyInd

# 5.11 ADR 参数

ADR parameters, ADRParamSetupReqADRParamSetupAns

ADRParamSetupReq 指令允许更改定义 ADR 回退算法的 ADR_ACK_LIMIT 和 ADR_ACK_DELAY 参数。ADRParamSetupReq 指令有一个单字节载荷。

Size (bytes) 1
ADRParamSetupReq Payload ADRparam
图38. ADRParamSetupReq payload format
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^Delay_exp

Delay_exp 的有效取值范围是 0 到 15,对应于 ADR_ACK_DELAY 的范围是 1 到 32768。

终端设备使用 ADRParamSetupAns 指令令来确认 ADRParamSetupReq 指令的接收。ADRParamSetupAns 指令没有载荷。

# 5.12 设备时间

DeviceTime commands, DeviceTimeReqDeviceTimeAns

此 MAC 指令仅适用于在兼容 LoRaWAN1.1 的网络服务器上激活的 OTA 设备。LoRaWAN1.0 服务器没有实现这个 MAC 指令。

使用 DeviceTimeReq 命令,终端设备可以从网络请求当前网络日期和时间。该请求没有载荷。

使用 DeviceTimeAns 命令,网络服务器向终端设备提供网络日期和时间。所提供的时间是上行传输结束时捕获的网络时间。该命令的有效负载为 5 字节,定义如下:

Size (bytes) 4 1
DeviceTimeAns Payload 32-bit unsigned integer : Seconds since epoch* 8bits unsigned integer: fractional- second in 1⁄2^8 second steps
图39. DeviceTimeAns payload format

网络提供的时间必须(MUST)具备 +/-100mSec 的最坏情况精度。

(*)GPS纪元(即1月6日星期日午夜)被用作原点。“seconds”字段是自原点起经过的秒数。这个字段每秒增加1。要将此字段转换为UTC时间,必须考虑闰秒。

Example: Friday 12th of February 2016 at 14:24:31 UTC corresponds to 1139322288 seconds since GPS epoch. As of June 2017, the GPS time is 17seconds ahead of UTC time.

# 5.13 强制重连

Force Rejoin Command, ForceRejoinReq

使用强制重连指令,网络要求设备立即发送 Rejoin-Request Type 0 或 Type 2 消息,其中包含可编程的重试次数、周期性和数据速率。这个 RejoinReq 上行通信可以被网络用来立即重设设备密钥或启动切换漫游过程。

此命令包含两字节载荷:

Bits 15:14 13:11 10:8 7 6:4 3:0
ForceRejoinReq bits RFU Period Max_Retries RFU RejoinType RFU
图40. ForceRejoinReq payload format

参数按下述方式编码:

Period: 重新传输之间的延迟应等于 (32秒 × 2^Period + Rand32),其中 Rand32 是[0:32]范围内的伪随机数。

Max_Retries: 设备重试 Rejoin-Request 的总次数:

  • 0 : Rejoin 仅发送一次(无重试)
  • 1 : Rejoin 要(MUST)发送 2 次(1 + 1 重试)
  • ……
  • 7: Rejoin 要(MUST) 发送 8 times (1 + 7 重试)

RejoinType: 此字段指定应由设备传输的 Rejoin-Request 类型。

  • 0 or 1 : A Rejoin-request type 0 shall be transmitted
  • 2 : A Rejoin-request type 2 shall be transmitted
  • 3 to 7 : RFU

DR: Rejoin-request 帧应(SHALL)使用数据速率 DR 传输。实际物理调制数据速率和 DR 值之间的对应关系遵循与 LinkADRReq 命令相同的约定,并在 [PHY-DOC] 中为每个区域定义。

该命令没有响应,因为设备在收到该命令时必须(MUST)发送一个 Rejoin-Request。RejoinReq 消息的首次发送应在接收到命令后立即进行(但网络可能不会接收到)。如果设备在达到传输重试次数限制之前收到一个新的 ForceRejoinReq 命令,设备应(SHALL)使用新的参数恢复 RejoinReq 的传输。

# 5.14 重连参数设置

RejoinParamSetupReqRejoinParamSetupAns

使用 RejoinParamSetupReq 命令,网络可以请求设备周期性地发送 RejoinReq Type 0 消息,其可编程周期可以为一段时间或若干上行通信。

使用时间和计数两种方法是为了处理可能没有时间测量能力的器件。指定的周期设定两个 RejoinReq 传输之间的最大上行时间或上行次数。设备可以(MAY)更频繁地发送 RejoinReq。

该指令有一个单字节载荷:

Bits 7:4 3:0
RejoinParamSetupReq bits MaxTimeN MaxCountN
图41. RejoinParamSetupReq payload format

参数定义如下:

MaxCountN = C = 0 to 15;设备必须(MUST)至少每2^(C+4) 次上行消息发送一次 Rejoin-Request type 0。 MaxTimeN = T = 0 to 15;设备(必须)至少每 2^(T+10) 秒发送一次 Rejoin-request type 0。

  • T = 0 大约相当于 17 分钟
  • T = 15 大约 1 年

每当满足这两个条件(帧数或时间)之一时,就会发送一个 RejoinReq 包。

设备必须(MUST)实现计数方式的周期。基于时间的周期是可选的。不能实现时间周期的设备必须在回应中发出信号。

回应有一个单字节载荷:

Bits 7:1 0
Status bits RFU TimeOK
图42. RejoinParamSetupAns payload format

如果 Bit 0 = 1,设备接受计时和计次。否则它仅接受计次。

注意:对于消息速率非常低且没有时间测量能力的设备,LoRaWAN 中没有指定就最佳计数限制达成一致的机制。