总发射占空比 = 1/2MaxDCycle
MaxDutyCycle 的有效范围值是[0:15]. 值 0 代表着 "没有占空比限制", 有限制地区的除外.
终端设备用 DutyCycleAns 指令来回复 DutyCycleReq.DutyCycleAns 的 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 指令来应答 ADRParamSetupReq.ADRParamSetupAns 指令不包含负载字段.
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 范围内.
来源: https://www.cnblogs.com/eydonmlau/p/10534469.html