最近在做LoRa, LoRaWAN协议略微复杂,边读边翻译,现在把部分关键的翻译分享给各位做物联网的同行。
当然里面掺杂了一些我的个人笔记,希望对大家有所帮助。
如果哪里有问题,欢迎应各位留言或者邮件指正。翻译很辛苦,转载请注明出处和源链接
PS:前面MAC命令只把大概列出来,没有翻译,现在给出第五章完整翻译
网络管理时会在网络服务器和终端MAC层之间传输一系列MAC命令。
一帧数据中可以包含任何MAC命令,MAC命令既可以放在FOpts中,也可以放在FRMPayload中,但不能同时在两个字段携带MAC命令。MAC命令放在FRMPayload时,FPort = 0。
放在FOpts的命令不加密(原因:加密Payload,对整个数据签名),也不能超过15个字节(2^4 - 1)。
放在FRMPayload的MAC命令长度不能超过FRMPayload的最大值。
注意:
不想被别人截获的命令要放到FRMPayload,并单独发送该数据帧
一条mac命令由一个命令ID(CID,一个字节),和特定的命令序列组成,命令序列可以是空。
命令ID | 命令 | 终端发送 | 网关发送 | 简介 |
---|---|---|---|---|
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的应答 | |
0x80 ~ 0xFF | Proprietary | × | × | 保留命令 |
注:MAC 命令长度没有明确给出来,这就需要MAC执行端通过某种方式隐性 获得。因为无法忽略不明的MAC命令,而且一旦遇到不明的MAC命令,就会导致处理MAC命令队列的进程终止。因此,建议参考使用LoRaWAN规范中的MAC命令。这样的话,所有当前版本LoRaWAN规范中实现的MAC命令都可以被更高版本的规范兼容处理。
终端使用LinkCheckReq
命令对链路进行有效性检查,该命令不含payload
。网络服务器收到网关(一个或多个)转发过来的LinkCheckReq
数据后回复一条 LinkCheckAns
命令。
大小(字节) | 1 | 1 |
---|---|---|
LinkCheckAns Payload | Margin |
GwCnt |
Margin(解调幅度)是最近一条被成功收到的 LinkCheckReq
命令的链路预算(单位dB
),是一个8位(bits)无符号整型,范围 [0,254]。值为 0
表示在解调(信号强度)的下限上收到了数据,值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),两者和地理区域相关,编码参考第7章。
信道掩码(ChMask)通过对相应的最低有效位填0
来对上行信道进行编码,信道列表如下:
表5:信道状态表
第几位 | 可用信道 |
---|---|
0 | Channel 1 |
1 | Channel 2 |
.. | .. |
15 | Channel 16 |
ChMask中某位是1
,表示该位对应的上行信道可用;如果是0
,则表示对应的上行信道不可用。终端设备当前使用的信道要设为1
(不知道是我不会断句,还是官方文档这里说的不明白)。
第几位 | 7 | [6:4] | [3:0] |
---|---|---|---|
Redundancy bits | 保留 | ChMaskCntl |
NbRep |
冗余(Redundancy
)位中,NbRep表示每条上行消息被重复收到的次数,仅用于 unconfirmed
类型的上行消息。默认值为 1
,有效范围 [1:15]。如果终端设备收到NbRep == 0,则使用默认值。服务器使用该字段控制节点上行数据冗余,以得到给定的服务质量。终端在重传时的调频照常执行,每次重发以后等待接收数据,直到接收窗口过期。
信道掩码控制(ChMaskCntl)字段控制上面ChMask的位掩码的解释。当网络上信道的实现超过16个,该字段必须是一个非0值。用它来控制ChMask使用哪16个信道,还可以用它来全局性的打开或关闭所欲使用指定调制方式的信道。该字段的具体使用和地域相关,具体见第7章。
信道频率也和地域有关,具体定义见第6章。
终端收到 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 | MaxDCycle |
终端允许的发射占空比的最大值:
MaxDutyCycle有效范围[0:15]。在没有区域调节设置占空比限制的情况下,使用 0
表示“占空比没有限制”。
值为 255
时要求终端设备立刻转为静默状态,等价于远程关闭终端。
终端收到DutyCycleReq后回复DutyCycleAns, DutyCycleAns不包含任何payload。
RXParamSetupReq
,RXParamSetupAns
)对于每一次的上发,通过下发RXParamSetupReq命令,可以修改第二个接收窗口(RX2)使用的频率和数据率。还可以使下行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,其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 bits 含义
字段 | (值=)0 | (值=)1 |
---|---|---|
Channel ACK | (对于终端)频率不可用 | RX2 信道设置成功 |
RX2 Data rate ACK | (对于终端)未知的数据速率 | RX2 数据速率设置成功 |
RX1DRoffset ACK | RX1 上行/下行数据速率的偏移不在可用范围 |
设置成功 |
其中的任何一个是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 服务器发送的数据是 4331 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。
启用新定义的信道,并可以马上用它进行通信。
终端回复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,就表示命令执行失败,不会创建信道。
RXTimingSetupReq
,RXTimingSetupAns
)RXTimingSetupReq用来配置上行TX结束到打开第一个接收窗口的延迟。第二个接收窗口比第一个晚1秒打开(根据当前规范这里时间差不能改动)。
大小(字节) | 1 |
---|---|
RXTimingSetupReq Payload | Settings |
延迟(Delay)字段指定延迟,由两个4位的索引组成:
大小(bits) | 7:4 | 3:0 |
---|---|---|
Settings | RFU |
Del |
延迟单位是秒(s),0对应1秒:
Del | 延迟(秒) |
---|---|
0 | 1 |
1 | 1 |
2 | 2 |
3 | 3 |
… | … |
15 | 15 |
终端设备回复RXTimingSetupAns,不携带payload(负载数据)。
看到有些伙伴提问问题,由于本人的CSDN一般不在线。
为了方便交流,附个邮箱,有问题或者想法的朋友可以
本文由 qingchuwudi 译制,除非另有声明,在不与原著版权冲突的前提下,本作品采用知识共享署名 3.0 中国大陆许可协议进行许可。