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时:必须考虑设备最新上行的数据速率对应的最大负载大小。
5.1 标志着重启了的指令(ResetInd, ResetConf)
这条MAC指令只对ABP设备和兼容LoRaWAN 1.1版本协议的网络服务器有效。LoRaWAN 1.0服务器不实现这条指令。
OTA设备不应该实现这条指令。网络服务器应该忽略来自OTA设备的ResetInd指令。
ABP设备使用ResetInd指令来通知网络服务器,设备进行了重启,且重新初始化成缺省的MAC和射频参数(换言之,除了三个帧计数器以外的参数都重新出厂化设置了)。ResetInd指令在未收到ResetConf前都必须加到所有的上行的FOpt字段。
这条命令并非告知网络服务器下行帧计数器已经重置。相反,ABP设备的帧计数器(包括上行和下行的帧计数器)应该从不重启。
ResetInd指令包含设备支持的LoRaWAN的次版本号。
次版本号字段表明终端设备支持的LoRaWAN的次版本号。
当网络服务器收到ResetInd指令时,应该回复ResetConf指令。
ResetConf指令包含一个字节的负载,即网络服务器支持的LoRaWAN 版本,这和"Dev LoRaWAN version"格式一致。
由ResetConf携带的服务器的版本必须和设备的版本一致。其他值都是无效的。
如果服务器的版本是无效的,那么设备应该丢弃这条ResetConf指令,并在下一条上行帧时重传ResetInd指令。
5.2 链路检查命令(LinkCheckReq, LinkCheckAns)
终端设备使用LinkCheckReq指令来确认和网络服务器之间的连接。这条指令没有负载。
网络服务器通过单个或者多个网络收到LinkCheckReq指令,然后回复一条LinkCheckAns指令。
解调预算(Margin)是一个范围为0-254的8位的无符号整数,表明成功接收到最新的LinkCheckReq指令的链路预算(单位为 dB)。若值为0则表明帧是在解调的下限(0 dB或者没有预算了)收到数据,若值为20表明网关在比解调下限高出20 dB的信号强度上收到了数据。255为保留值。
网关数量(GwCnt)是最近一次成功收到LinkCheckReq指令的网关的数量。
5.3 链路ADR指令(LinkADRReq, LinkADRAns)
网络服务器使用LinkADRReq指令来要求终端设备进行速率自适应。
请求设置的数据速率(DataRate)和发射功率(TXPower)以不同区域不同特性地被定义在[LoRaWAN区域特性参数文档]。指令中的发射功率被视作设备可用的最大的发射功率。如果指令中指定的发射功率高于终端设备的实际的最大发射功率,终端设备也要回复应答,且需要尽可能提高到最大的发射功率。0xF(十进制15)对数据速率和发射功率意味着设备应该忽略该字段且保持当前的参数值。信道掩码(ChMask)代表了可用的上行链路信道。最低为是从0开始的。
ChMask字段中的某一个位设置为1代表着相应的信道可以进行上行传输,且设备允许该信道使用当前的数据速率。如果是0,代表着相应的信道不可用。
冗余(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指令。
LinkADRAns 状态位为以下含义:
如果三个位中任意一个为0,表明这个指令设置不成功,节点将保持之前状态。
5.4 终端设备发射占空比(DutyCycleReq,DutyCycleAns)
DutyCycleReq指令被网络协调者用来限制终端设备的总发射占空比的最大值。总发射占空比指所有子频带的发射占空比。
终端设备允许的最大发射占空比为:
MaxDutyCycle的有效范围值是[0:15].值0代表着“没有占空比限制”,有限制地区的除外。
终端设备用DutyCycleAns指令来回复DutyCycleReq。DutyCycleAns的MAC应答不包含任何的负载。
5.5 接收窗口参数(RXParamSetupReq, RXParamSetupAns)
RXParamSetupReq指令可以对每个上行消息之后的第二接收窗口(RX2)的频率和数据速率进行改变。该指令同时允许修改下行RX1的数据速率,使下行RX1的数据速率相对上行进行偏移。
RX1DRoffset字段用来设置终端设备上行和下行第一个接收窗口(RX1)数据速率之间的偏移。偏移的缺省值为0。偏移量用来考量一些地区的基站最大功率密度限制和平衡上下行的射频链路预算。
数据速率(RX2DataRate)字段定义了第二接收窗口使用的下行数据速率,用法和LinkADRReq指令一致(例如,0表示DR0/125kHz)。频率(Frequency)字段表示第二接收窗口使用信道的频率,因此频率编码规则的定义详见NewChannelReq指令。
终端设备使用RXParamSetupAns指令来应答RXParamSetupReq。终端设备在收到A类下行之前,RXParamSetupAns指令必须添加在所有的上行数据帧的FOpt字段中。这样可以保证即使上行链路存在丢包,网络服务器也总能知道设备使用的下行链路参数。
负载包含单字节的状态信息。
状态(Status)位有以下含义:
LinkADRAns 状态位有以下含义:
如果三个位中任意一个为0,表明这个指令设置不成功,必须保持之前状态。
5.6 终端设备状态(DevStatusReq, DevStatusAns)
网络服务器使用DevStatusReq指令来查询终端设备的状态信息。这个指令没有负载。如果终端设备收到DevStatusReq,它必须回复DevStatusAns指令。
报告电池电量(Battery)的编码如下:
余量(Margin)是最近一次成功接收DevStatusReq指令的解调信噪比,其值为四舍五入取整,单位为Db。它是6位的有符号整数,最大值为31, 最小值为-32
5.7 信道的创建或修改(NewChannelReq, NewChannelAns, DIChannelReq, DIChannelAns)
设备工作在固定的信道方案区域时,这些MAC指令不应该起作用。设备不应该回复这些指令。
请参照[LoRaWAN区域特性参数文档]。
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位:
按照章节5.2所定义的规则,最小数据速率(MinDR)字段规定了该信道最低上行数据速。例如以欧洲地区参数而言,0表示DR0 / 125 KHz,同样的,最大数据速率(MaxDR)字段规定了该信道最大上行数据速。例如,DrRange = 0x77 表示该信道只允许使用 50 kbps的GFSK。DrRange = 0x50 表示支持DR0 / 125 kHz 到 DR5 /125kHz。
新增加或修改的信道一旦使能,可以立即用来通讯。RX1下行频率和上行频率相同。
终端设备通过回复NewChannelAns指令来应答NewChannelReq。这条消息的负载包含以下信息:
状态(Status)位有以下含义:
如果两个位中任意一个为0,表明这个指令设置不成功,新的信道没有被创建成功。
DIChannelReq指令允许网络服务器在RX1时使用不同的下行频率。这个指令适用于所有支持NewChannelReq指令的区域(例如欧盟或者中国,但不适用于美国或澳大利亚)。
这个指令设置下行RX1的中心频率,如下:
信道索引(ChIndex)是被修改的下行频率的信道索引。
频率(Freq)字段是一个24位无符号整数。实际信道频率为(100 x Freq),单位为Hz,其中低于100 MHz的频率数值将会保留供将来使用。终端设备必须检查实际能使用的频率硬件射频能否支持,否则返回错误。
终端设备通过回复DIChannelAns指令来应答DIChannelReq。终端设备在收到A类下行之前,DIChannelAns指令必须添加在所有的上行数据帧的FOpt字段中。这样可以保证即使上行链路存在丢包,网络服务器也总能知道设备使用的下行频率。
这条消息的负载包含以下信息:
状态(Status)位有以下含义:
5.8 TX和RX之间的延时设置(RXTimingSetupReq, RXTimingSetupAns)
RXTimingSetupReq指令允许配置上行传输结束与第一个接收窗口开启之间的时间间隔。第二接收窗口比第一个接收窗口晚一秒开启。
延迟(Delay)字段指定时间间隔。这字段分成两个4字节:
延迟的单位为秒。Del = 0 对应于 1秒
终端设备使用不带负载的RXTimingSetupAns指令来回复RXTimingSetupReq。
终端设备在收到A类下行之前,RXTimingSetupAns指令必须添加在所有的上行数据帧的FOpt字段中。这样可以保证即使上行链路存在丢包,网络服务器也总能知道设备使用的下行参数。
5.9 终端设备重传参数(TxParamSetupReq,TxParamSetupAns)
这个MAC指令只在管控的特定区域执行。请参考[LoRaWAN区域特性参数文档]。
TxParamSetupReq指令可以用来通知终端设备的最大驻留时间。换言之,一包数据在空中的最大持续传输时间,以及终端设备所允许的最大等效全向辐射功率(EIRP)。
EIRP_DwellTime字段的结构如下:
TxParamSetupReq指令的0..3位用来对最大EIRP值的编码,如下表。表中EIRP值包含不同区域管控的最大EIRP限制的最大范围。
最大EIRP指的是设备无线电发射的功率上限。设备不要求使用该功率进行传输。,但不应该超过该EIRP。
第4、第5位分别定义了最大上行和下行的驻留时间。编码如下:
当这个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的次版本号。
最小字段代表设备支持的LoRaWAN的次版本号。
OTA设备应该在成功处理完入网请求之后(新的会话密钥生成之后),一直在所有的确认和非确认上行帧里包含RekeyInd指令,直到收到RekeyConf。如果设备在ADR_ACK_LIMIT上行到来之前没有收到RekeyConf,那么它应该变回请求入网状态。在之后任何时候设备发送的RekeyInd指令网络服务器都应该丢弃掉。在收到入网请求之后的新安全的密钥以及带有RekeyInd指令的第一条上行帧之前,网络服务器应该丢弃所有的上行帧。
当网络服务器收到RekeyInd指令时,回复一条RekeyConf指令。
ResetConf指令包含一个字节的负载,即网络服务器支持的LoRaWAN 版本,这和"Dev LoRaWAN version"格式一致。
服务器版本必须大于0(不允许为0)。小于或等于设备的LoRaWAN版本。因此对于一个LoRaWAN1.1版本的终端设备来说,有效值只能为1。如果服务器的版本无效,终端设备应该丢弃这条RekeyConf指令,并在下一个上行帧时重传RekeyInd指令。
5.11 自适应参数(ADRParamSetupReq, ADRParamSetupAns)
ADRParamSetupReq指令允许改变ADR_ACK_LIMIT和ADR_ACK_DELAY这两个在ADR回退机制中使用的参数。ADRParamSetupReq指令由一个单字节负载。
Limit_exp字段设置ADR_ACK_LIMIT参数的值:
Limit_exp有效范围为0到15, 对应的ADR_ACK_LIMIT是1到32768。
Delay_exp字段设备ADR_ACK_DELAY参数的值:
Limit_exp有效范围为0到15, 对应的ADR_ACK_DELAY是1到32768。
终端设备使用ADRParamSetupAns指令来应答ADRParamSetupReq。ADRParamSetupAns指令不包含负载字段。
5.12 设备时间指令(DeviceTimeReq, DeviceTimeAns)
这条MAC指令只对兼容LoRaWAN 1.1版本协议的网络服务器有效。LoRaWAN 1.0服务器不实现这条指令。
终端设备使用DeviceTimeReq指令来请求服务器的当前网络日期和时间。该请求没有负载。
网络服务器使用DeviceTimeAns来给终端设备提供网络日期和时间。这个时间是上行传输结束时的网络时间。这个命令包含5个字节的负载,如下:
网络服务器提供的时间最差的时间精度必须在正负 100 毫秒。
()GPS 纪元(换言之,指1980年1月6日凌晨0点)作为起点。“秒”字段是以纪元为起点,经过的秒的数量。这个字段每秒单纯的加1。把这个字段转成UTC时间,闰秒必须考虑在内。
5.13 重新入网指令(ForceRejoinReq)
网络服务器通过重新入网指令要求设备立即发送重新入网请求(Rejoin-Request)类型0或类型2消息,并带有可编程的重传字段,发送周期和数据速率。服务器可以使用这个RejoinReq上行帧来重新生成设备的密钥或初始化漫游切换过程。
这个命令有2个字节的负载。
这些参数的编码如下规则:
Period: 重传之间的时隙应该等于32秒 x 2 + 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很频繁。
这个指令有单字节的负载。
这些参数定义如下:
MaxCountN = C = 0到15。至少在每2条上行消息,设备必须发送一条类型为0的重新入网请求。
MaxTimeN = T = 0到15。至少在每2秒,设备必须发送一条类型为0的重新入网请求。
- T = 0 表示大概时17分钟
- T = 15 大概是1年
以上两种情况种的一种满足(帧上行数量或者时间),RejoinReq帧都会被发送。
设备必须实现上行数量的周期功能(MaxCountN)。基于时间的周期功能是可选的。设备不能实现时间限制必须在回复中说明。
回复有单字节的负载。
如果第0位等于1,设备接受最大时间和上行数量的的限制。如果等于0,那么只接受上行数量的限制。