最近在做LoRa, LoRaWAN协议略微复杂,边读边翻译,现在把
部分关键的翻译分享给各位做物联网的同行。
当然里面掺杂了一些我的个人笔记,希望对大家有所帮助。
如果哪里有问题,欢迎应各位留言或者邮件指正。翻译很辛苦,转载请注明出处和源链接
本文翻译版本已更新至LoRaWAN 1.0.2。
网络管理时会在网络服务器和终端MAC层之间传输一系列MAC命令。MAC层命令对应用、应用服务器以及终端设备上的应用永不可见。
一帧数据中可以包含任何MAC命令序列,MAC命令既可以放在FOpts中和正常数据一起发送;也可以放在FRMPayload中单独发送,此时FPort = 0,但不能同时在两个字段携带MAC命令。放在FOpts中的MAC命令不加密,并且不能超过15个字节。放在FRMPayload中的MAC命令必须加密,同时不能超过FRMPayload的最大长度。
注意:
不想被别人截获破解的命令要放到FRMPayload中单独发送
一条MAC命令由一个字节的命令ID(CID)和特定的命令序列组成,命令序列可以是空。
CID | 命 令 | 终端发送 | 网关发送 | 简介 |
---|---|---|---|---|
0x02 | LinkCheckReq | × | 用于终端验证网络连接 | |
0x02 | LinkCheckAns | × | 回应验证请求, 同时包含终端接收质量相关的估算的信号功率 | |
0x03 | LinkADRReq | × | 请求终端改变数据率、传输功率、接收率或者信道 | |
0x03 | LinkADRAns | × | LinkRateReq的应答 | |
0x04 | DutyCycleReq | × | 设置设备的最大总发射占空比 | |
0x04 | DutyCycleAns | × | DutyCycleReq的应答 | |
0x05 | RXParamSetupReq | × | 设置接收时隙相关参数 | |
0x05 | RXParamSetupAns | × | RXSetupReq的应答 | |
0x06 | DevStatusReq | × | 请求终端状态 | |
0x06 | DevStatusAns | × | 返回终端装填,即电量和解调情况 | |
0x07 | NewChannelReq | × | 创建或修改无线电信道 | |
0x07 | NewChannelAns | × | NewChannelReq的应答 | |
0x08 | RXTimingSetupReq | × | 设置接收时隙的时间 | |
0x08 | RXTimingSetupAns | × | RXTimingSetupReq的应答 | |
0x09 | TxParamSetupReq | x | 网络服务器用它来设置终端设备停留时间的最大值和最大EIRP(等效全向辐射功率),与地域相关 | |
0x09 | TxParamSetupAns | x | TxParamSetupReq命令的回复 | |
0x0A | DlChannelReq | x | 通过将下行频率与上行频率进行偏移,来修改下行R1的无线信道(即:创建不对称信道) | |
0x0A | DlChannelAns | x | DlChannelReq命令的回复 | |
0x80 ~ 0xFF | Proprietary | × | × | 保留命令 |
注:
MAC命令长度不固定,这就要求MAC命令执行端必须隐式获知。因为无法忽略不明的MAC命令,而且一旦遇到不明的MAC命令,就会导致处理MAC命令队列的进程终止。因此,建议遵循首先对MAC命令进行说明的LoRaWAN规范。这样的话,所有当前版本LoRaWAN规范中实现的MAC命令都可以被更高版本的规范兼容处理。
注:
终端设备所有被网络服务器调整过的内容(例如:RX2,新创建或调整过的信道)仅在下次入网前有效。因此,终端设备每次重新入网之后都会使用默认参数配置,而网络服务器则根据需要对这些值重新调整。
终端使用LinkCheckReq命令检查与网络的连通性,该命令不含荷载(payload)。
网络服务器收到(一个或多个)网关转发过来的LinkCheckReq后回复一条LinkCheckAns命令。
大小(字节) | 1 | 1 |
---|---|---|
LinkCheckAns Payload | Margin | GwCnt |
Margin(解调余量)是最近一条被成功收到的 LinkCheckReq
命令的链路预算(单位dB
),是一个8位(bits)无符号整型,范围 [0,254]。值为 0
表示在解调的下限(0dB或者没有余量)上收到了数据,值20
表示网关在比解调下限高出 20 dB
的信号强度上收到了数据。255
是保留值。
GwCnt是最近一次成功收到 LinkCheckReq
的网关的数量。
link margin参考:Link margin
LinkADRReq
和LinkADRAns
网络服务器通过发送 LinkADRReq
命令对终端设备速率进行调整。
大小(字节) | 1 | 2 | 1 |
---|---|---|---|
LinkADRReq Payload | DataRate_TXPower | ChMask | Redundancy |
大小(位 bits) | [7:4] | [3:0] |
---|---|---|
DataRate_TXPower | DataRate | TXPower |
数据速率(DataRate)以及TX输出功率(TXPower)和地理区域相关,参考《LoRaWAN地域相关参数手册》(《LoRaWAN Regional Parameters document》)。命令中的TX输出功率指的是设备可以使用的最大发射功率。指定一个能够使用的比当前在使用的更高的功率的命令执行成功后,此时,终端设备将使用尽可能大(不超过命令设置以及物理允许的范围)的功率回复确认消息。信道掩码(ChMask)通过对最低有效位相应的位置填0
来对上行信道的可用性进行编码,信道列表如下:
对应原文:
An end-device will acknowledge as successful a command which specifies a higher transmit power than it is capable of using and should, in that case, operate at its maximum possible power.
表5:信道状态表
第几位 | 可用信道 |
---|---|
0 | Channel 1 |
1 | Channel 2 |
.. | .. |
15 | Channel 16 |
ChMask中某位是1
,表示启用该位对应的上行信道(用来进行上行传输的信道),只有终端设备当前使用的数据速率可以在该信道上使用时,该信道才可以使用;如果是0
,则表示对应的上行信道不可用。终端设备当前使用的信道要设为1
第几位 | 7 | [6:4] | [3:0] |
---|---|---|---|
Redundancy bits | RFU | ChMaskCntl | NbTrans |
冗余(Redundancy)位中,NbTrans表示每条上行消息重复发送的次数,仅用于 unconfirmed
类型的上行消息。默认值为1
,表示每帧只上传一次。有效范围 [1:15]。终端设备收到NbTrans == 0时仍然使用默认值。网络管理员通过控制节点的上行冗余来保证给定的服务质量。终端设备在重传期间照常跳频,每次重传后也会等待接收数据,直到接收窗口过期。在RX1短暂窗口期间的任一时刻接收到下行消息都会停止该消息的重传。对于A类来说,RX2情况与RX1相同。
信道掩码控制(ChMaskCntl)字段负责控制ChMask的掩码位。当网络上信道的实现超过16个,该字段必须是一个非0值。用它来控制ChMask使用哪16个信道,还可以用它来全局性的打开或关闭指定调制方式的所有信道。该字段的具体使用和地域相关,具体见《LoRaWAN地域相关参数手册》。
网络服务器可能会在一条下行消息中包含多个LinkAdrReq命令。终端设备为了配置信道掩码,会按照命令在下行消息中的出现的顺序处理所有LinkAdrReq消息。对于命令中的这些ChMaskCntl,终端设备要么全部接受要么全部拒绝,同时为它们的 LinkAdrAns 设置相同的 Channel Mask ACK 。对于 DataRate、TXPower 和 NbTrans ,因为它们是全局性设置(后面的值会覆盖前面的值),所以终端设备只按照命令中的最后一条LinkADRReq执行。同样,对于这些,终端设备也会为它们在 LinkAdrAns 中各自设置相同的 ACK,来指明它们最终被接受了还是被拒绝了。
信道频率与地域有关,具体见第六章。
终端收到 LinkADRReq
后回复 LinkADRAns
命令。
大小(字节) | 1 |
---|---|
LinkADRAns Payload | Status |
大小(位) | [7:3] | 2 | 1 | 0 |
---|---|---|---|---|
Status bits | RFU | Power ACK | Data rate ACK | Channel mask ACK |
LinkADRAns Status释义如下:
表6:LinkADRAns
状态位定义
字段 | 0 | 1 |
---|---|---|
Channel mask ACK | 要使用的信道未定义;或信道掩码想关闭所有信道。忽略该命令,终端状态不改变 | 设置成功 |
Data rate ACK | 要使用的速率未定义;或者在指定的通道掩码下,不支持该数据速率(所有在用的信道都不支持该速率)。命令被忽略,终端状态不改变 | 设置成功 |
Power ACK | 终端未定义该功率等级。命令被忽略,终端状态不改变 | 设置成功 |
以上三个字段任意一个是0,命令就会执行失败,节点保持之前的状态不变。
DutyCycleReq
和 DutyCycleAns
)DutyCycleReq
,网络协调员使用该命令来限制终端设备的总发射占空比的最大值。总发射占空比指所有子频带的发射占空比。
大小(字节) | 1 |
---|---|
DutyCycleReq Payload | DutyCyclePL |
Bits | 7:4 | 3:0 |
---|---|---|
DutyCyclePL | RFU | MaxDCycle |
终端允许的发射占空比的最大值:
MaxDutyCycle有效范围[0:15]。在没有区域调节设置占空比限制的情况下,使用 0
表示“占空比没有限制”,有区域限制的除外。
注意,下面这条在LoRaWAN1.0.2中被删除:
值为
255
时要求终端设备立刻转为静默状态,等价于远程关闭终端。
终端收到DutyCycleReq后回复DutyCycleAns, DutyCycleAns不包含任何payload。
RXParamSetupReq
,RXParamSetupAns
)通过下发RXParamSetupReq命令,可以修改第二个接收窗口(RX2)使用的频率和数据速率。该命令还可以修改下行RX1
数据速率,使下行RX1
的速率相对上行进行偏移。
大小(字节) | 1 | 3 |
---|---|---|
RX2SetupReq Payload | DLsettings |
Frequency |
第几位 | 7 | 6:4 | 3:0 |
---|---|---|---|
DLsettings | RFU |
RX1DRoffset |
RX2DataRate |
RX1DRoffset 用来设置终端设备上行和下行第一个接收窗口(RX1)数据速率之间的偏移,默认值是0
。基站在某些地域有最大功率密度限制,所以使用偏移,并且还可以用来均衡上行和下行的无线链路预算。
RX2DataRate 定义第二个接收窗口使用的数据速率,用法和 LinkADRReq 一样(例如,0
表示 DR0/125kHz
)。Frequency 是第二个接收窗口使用的信道频率,其频率编码规则的定义见 NewChannelReq 命令。
终端设备回复 RXParamSetupAns。终端设备在没有收到基于A类的下行数据前,会在所有上行数据的 FOpt 中携带 RXParamSetupAns,直到收到一次基于A类的下行数据。这样可以保证及时上行链路存在丢包的情况,网络也总能知道终端设备使用的下行链路参数。
其payload
只有一个字节:
大小(字节) | 1 |
---|---|
RX2SetupAns Payload | Status |
Status位结构如下:
第几位 | 7:3 | 2 | 1 | 0 |
---|---|---|---|---|
Status bits | RFU | RX1DRoffset ACK | RX2 Data rate ACK | Channel ACK |
表 7: RX2SetupAns 的 status 含义
字段 | 0 | 1 |
---|---|---|
Channel ACK | (对于终端)频率不可用 | RX2 信道设置成功 |
RX2 Data rate ACK | (对于终端)未知的数据速率 | RX2 数据速率设置成功 |
RX1DRoffset ACK | RX1 上行/下行数据速率的偏移不在可用范围 |
设置成功 |
3个中的任何一个是0
,命令都会执行失败并保持之前的状态。
DevStatusReq
, DevStatusAns
)服务器通过发送 DevStatusReq 获取一个终端设备的状态,该命令没有payload。终端收到 DevStatusReq 之后回复DevStatusAns。
大小(字节) | 1 | 1 |
---|---|---|
DevStatusAns payload | Battery | Margin |
电池电量(Battery)上报的数据编码如下:
表8:电池电量编码
电量 | 说明 |
---|---|
0 | 终端在使用外接电源 |
1..254 | 电池电量,1是最小值,254是最大值 |
255 | 终端设备无法获取电池电量 |
余量(Margin)是最近一次接收成功 DevStatusReq 命令的解调信噪比,其值(四舍五入)取整,单位dB。余量值是一个有符号整型,长度6个比特位,最小值 -32,最大值31。
占位(bits) | 7:6 | 5:0 |
---|---|---|
Status | RFU | Margin |
NewChannelReq
, NewChannelAns
)NewChannelReq命令要么用来修改已有信道的参数,要么创建一个新的信道。该命令设置新信道的中心频率,以及在该信道上行传输的数据速率范围。
大小(字节) | 1 | 3 | 1 |
---|---|---|---|
NewChannelReq payload | ChIndex | Freq | DrRange |
信道索引(ChIndex)是新信道或者待修改信道的索引值。LoRaWAN规范中已经为不同的地域和频段内置了默认信道,这些信道存在所有的设备上,而且不能通过NewChannelReq(见第6章)进行修改。如果默认的信道数量是N,那默认的信道就是 0 ~ N-1
,而 ChIndex 可用范围就是 N ~ 15
。终端设备至少要能处理 16 个不同的信道。在某些地域终端允许存储超过16个信道。
频率(Freq)是一个 24bits 无符号整型,实际信道频率是 100 × Freq Hz(笔记:按这个说法,433.1MHz 服务器发送的数据是 4331000),其中100MHz以下的值留待未来使用。通过这种方法可以以 100 Hz为步长,使用 100MHz~1.67GHz 之间任意的信道频率。 Freq == 0表示不使用该信道。终端设备必须对频率进行检查,保证它的射频硬件支持将要使用的频率,否则返回错误。
数据速率范围(DrRange)指明此信道的数据速率范围。该字由两个4位长的索引组成:
大小(bits) | 7:4 | 3:0 |
---|---|---|
DrRange | MaxDR | MinDR |
根据章节5.2的定义,最小数据速率(MinDR)字段指定此信道最低数据速率,例如:0 表示指定 DR0/125 kHz。与之类似,最大数据速率指定最高数据速率。例如:DrRange = 0x77
表示信道只能使用 50kbps GFSK,DrRange = 0x50
表示数据速率范围是DR0 / 125 kHz 到 DR5 / 125 kHz。
创建或修改的信道一旦设置成功,可以马上用来通信。RX1
的下行频率与其上行频率相同。
终端回复NewChannelAns
命令,其payload如下:
大小(字节) | 1 |
---|---|
NewChannelAns Payload | Status |
状态(Status)含义如下:
大小(bits) | 7:2 | 1 | 0 |
---|---|---|---|
Status | RFU |
Data rate range ok |
Channel frequency ok |
字段 | 0 | 1 |
---|---|---|
Data rate range ok | 数据速率范围超出终端当前所允许的范围 | 终端兼容该数据速率范围 |
Channel frequency ok | 终端无法使用该频率 | 可以使用 |
两者之中有一个是0,就表示命令执行失败,不会创建信道。
DlChannelReq允许服务器将一个不同的下行频率和RX1
关联起来。所有支持 NewChannelReq 的地域也适用于 DlChannelReq (比如欧洲、中国,但美国和澳大利亚不可以,具体见《LoRaWAN地域相关参数》)
该命令会设置下行RX1的中心频率:
大小(字节) | 1 | 3 |
---|---|---|
DlChannelReq Payload | ChIndex | Freq |
频率(Freq)是一个 24bits 无符号整型,实际信道频率是 100 × Freq Hz,其中100MHz以下的值留待未来使用。通过这种方法可以以 100 Hz为步长,使用 100MHz~1.67GHz 之间任意的信道频率。 Freq == 0表示不使用该信道。终端设备必须对频率进行检查,保证它的射频硬件支持将要使用的频率,否则返回错误。
终端设备回复DlChannelAns。终端设备在没有收到下行数据前,会在所有上行数据的 FOpt 中携带 DlChannelAns,直到收到一次下行数据。这样可以保证及时上行链路存在丢包的情况,网络也总能知道终端设备使用的下行频率。
Payload包含以下信息:
大小(字节) | 1 |
---|---|
DlChannelAns Payload | Status |
Status含义如下:
Bits | 7:2 | 1 | 0 |
---|---|---|---|
Status | RFU | Uplink frequency exists | Channel frequency ok |
0 | 1 |
---|---|
Channel frequency ok | 设备无法使用该频率 |
Uplink frequency exists | 该信道的上行频率未定义,下行频率只能给有效上行频率的信道设置 |
RXTimingSetupReq
,RXTimingSetupAns
)RXTimingSetupReq用来配置上行传输结束(一帧数据发送完成的时刻)到打开第一个接收窗口之间的时间间隔。第二个接收窗口比第一个晚1秒打开。
大小(字节) | 1 |
---|---|
RXTimingSetupReq Payload | Settings |
延迟(Delay)字段指定时间间隔,由两个4位的索引组成:
大小(bits) | 7:4 | 3:0 |
---|---|---|
Settings | RFU | Del |
延迟单位是秒(s), Del=0 表示1秒:
Del | 延迟(秒) |
---|---|
0 | 1 |
1 | 1 |
2 | 2 |
3 | 3 |
… | … |
15 | 15 |
终端设备回复RXTimingSetupAns,并且不携带payload。
终端设备在没有收到下行数据前,会在所有上行数据的 FOpt 中携带 RXTimingSetupAns,直到收到一次下行数据。这样可以保证及时上行链路存在丢包的情况,网络也总能知道终端设备使用的下行参数。
RXTimingSetupReq
,RXTimingSetupAns
)RXTimingSetupReq用来配置上行传输结束(一帧数据发送完成的时刻)到打开第一个接收窗口之间的时间间隔。第二个接收窗口比第一个晚1秒打开。
大小(字节) | 1 |
---|---|
RXTimingSetupReq Payload | Settings |
延迟(Delay)字段指定时间间隔,由两个4位的索引组成:
大小(bits) | 7:4 | 3:0 |
---|---|---|
Settings | RFU | Del |
延迟单位是秒(s), Del=0 表示1秒:
Del | 延迟(秒) |
---|---|
0 | 1 |
1 | 1 |
2 | 2 |
3 | 3 |
… | … |
15 | 15 |
终端设备回复RXTimingSetupAns,并且不携带payload。
终端设备在没有收到下行数据前,会在所有上行数据的 FOpt 中携带 RXTimingSetupAns,直到收到一次下行数据。这样可以保证及时上行链路存在丢包的情况,网络也总能知道终端设备使用的下行参数。
该MAC命令只在需要监管的区域执行,参考《LoRaWAN地域相关参数手册》。
TxParamSetupReq命令可以用来通知终端设备其允许的最大驻留时间,比如:一个数据包在空中持续传输的最大时间,以及所允许的设备最大的EIRP(有效全向辐射功率)。
大小(字节) | 1 |
---|---|
TxParamSetup payload | EIRP_DwellTime |
EIRP_DwellTime字段的结构如下:
Bits | 7:6 | 5 | 4 | 3:0 |
---|---|---|---|---|
MaxDwellTime | RFU | DownlinkDwellTime | UplinkDwellTime | MaxEIRP |
TxParamSetupReq的 [0:3] bits用来编码 Max EIRP值,见下表:
编码值 | 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 |
设备无线传输的最大功率即为EIRP的最大值。设备不必使用该功率进行传输,可也不能超过该EIRP。第4、第5位定义上、下行链路最大的驻留时间 ,编码如下:
编码值 | 驻留时间 |
---|---|
0 | 无限制 |
1 | 400 ms |
该命令执行后,终端设备回复TxParamSetupAns。 TxParamSetupAns不携带任何负载数据。如果在一个对此没有要求的地域使用该命令,设备不执行,并且不回复。
看到有些伙伴提问问题,由于本人的CSDN一般不在线。
为了方便交流,附个邮箱,有问题或者想法的朋友可以
本文由 qingchuwudi 译制,除非另有声明,在不与原著版权冲突的前提下,本作品采用知识共享署名 3.0 中国大陆许可协议进行许可。