大家好,又见面了,我是你们的朋友全栈君。
版本管理
目录
第4章 MAC帧格式… 1
前言… 1
4.1 MAC层(PHYPayload) 2
4.2 MHDR帧头… 2
4.2.1 消息类型(MType位字段) 2
4.2.2 数据消息的主版本(Major位字段) 3
4.3 MAC载荷(MACPayload) 4
4.3.1 帧头(FHDR) 4
4.3.2 端口字段(FPort) 8
4.3.3 MAC帧载荷加密(FRMPayload) 9
4.4 消息校验码(MIC) 10
第5章 MAC命令… 11
5.1 连接检查命令(LinkCheckReq, LinkCheckAns) 13
5.2 连接ADR命令 (LinkADRReq, LinkADRAns) 13
5.3 终端发射占空比 (DutyCycleReq, DutyCycleAns) 16
5.4 接收窗口参数 (RXParamSetupReq, RXParamSetupAns ) 16
5.5 终端设备状态 (DevStatusReq, DevStatusAns) 18
5.6 创建/修改信道 (NewChannelReq, NewChannelAns, DlChannelReq, DlChannelAns) 19
5.7 设置收发时延 (RXTimingSetupReq, RXTimingSetupAns) 22
5.8 终端传输参数(TxParamSetupReq, TxParamSetupAns) 23
第4章 MAC帧格式
前言
LoRa所有上下行链路消息都会携带PHY载荷,PHY载荷以1字节MAC帧头(MHDR)开始,紧接着MAC载荷(MACPayload),最后是4字节的MAC校验码(MIC)。
射频PHY层:
Preamble | PHDR | PHDR_CRC | PHYPayload | CRC |
---|
图5.射频PHY结构(注意 CRC只有上行链路消息中存在)
PHY载荷:
MHDR | MACPayload | MIC |
---|
或者
MHDR | Join-Request | MIC |
---|
或者
MHDR | Join-Response | MIC |
---|
图6.PHY载荷结构
MAC载荷:
FHDR(Frame Header) | FPort | FRMPayload |
---|
FHDR(见4.3.1章节):
DevAddr | FCtrl | FCnt | FOpts |
---|
图8.帧头结构
4.1 MAC层(PHYPayload)
Size (bytes) | 1 | 1..M | 4 |
---|---|---|---|
PHYPayload | MHDR | MACPayload | MIC |
MACPayload字段的最大长度M,在第6章有详细说明。
4.2 MHDR帧头
Bit# | 7..5 | 4..2 | 1..0 |
---|---|---|---|
MHDR bits | MType | RFU | Major |
MAC头中指定了消息类型(MType)和帧编码所遵循的LoRaWAN规范的主版本号(Major)。
4.2.1 消息类型(MType位字段)
LoRaWAN定义了六个不同的MAC消息类型:join request, join accept, unconfirmed data up/down, 以及 confirmed data up/down 。
MType | 描述 |
---|---|
000 | Join Request |
001 | Join Accept |
010 | Unconfirmed Data Up |
011 | Unconfirmed Data Down |
100 | Confirmed Data Up |
101 | Confirmed Data Down |
110 | RFU |
111 | Proprietary |
表1.MAC消息类型
4.2.1.1 Join-request and join-accept 消息
join-request和join-accept都是用在空中激活流程中,具体见章节6.2
4.2.1.2 Data messages
Data messages 用来传输MAC命令和应用数据,这两种命令也可以放在单个消息中发送。 Confirmed-data message 接收者需要应答。 Unconfirmed-data message 接收者则不需要应答。 Proprietary messages 用来处理非标准的消息格式,不能和标准消息互通,只能用来和具有相同拓展格式的消息进行通信。
不同消息类型用不同的方法保证消息一致性,下面会介绍每种消息类型的具体情况。
4.2.2 数据消息的主版本(Major位字段)
Major位字段 | 描述 |
---|---|
00 | LoRaWAN R1 |
01..11 | RFU |
注意:Major定义了激活过程中(join procedure)使用的消息格式(见章节6.2)和MAC Payload的前4字节(见第4章)。终端要根据不同的主版本号实现不同最小版本的消息格式。终端使用的最小版本应当提前通知网络服务器。
4.3 MAC载荷(MACPayload)
MAC载荷,也就是所谓的“数据帧”,包含:帧头(FHDR)、端口(FPort)以及帧载荷(FRMPayload),其中端口和帧载荷是可选的。
4.3.1 帧头(FHDR)
FHDR是由终端短地址(DevAddr)、1byte帧控制字节(FCtrl)、2byte帧计数器(FCnt)和用来传输MAC命令的帧选项(FOpts,最多15个byte)组成。
Size(bytes) | 4 | 1 | 2 | 0..15 |
---|---|---|---|---|
FHDR | DevAddr | FCtrl | FCnt | FOpts |
FCtrl在上下行消息中有所不同,
下行消息如下:
Bit# | 7 | 6 | 5 | 4 | [3..0] |
---|---|---|---|---|---|
FCtrl bits | ADR | RFU | ACK | FPending | FOptsLen |
上行消息如下:
Bit# | 7 | 6 | 5 | 4 | [3..0] |
---|---|---|---|---|---|
FCtrl bits | ADR | ADRACKReq | ACK | RFU | FOptsLen |
4.3.1.1 帧头中 自适应数据速率 的控制(ADR, ADRACKReq in FCtrl)
LoRa网络允许终端采用任何可能的数据速率。LoRaWAN协议利用该特性来优化固定终端的数据速率[J1] 。这就是自适应数据速率(Adaptive Data Rate (ADR))。当这个使能时,网络会优化使得尽可能使用最快的数据速率。
移动的终端由于射频环境的快速变化,数据速率管理就不再适用了,应当使用固定的数据速率。
如果ADR的位字段有置位,网络就会通过相应的MAC命令来控制终端设备的数据速率。如果ADR位没有设置,网络则无视终端的接收信号强度,不再控制终端设备的数据速率。ADR位可以根据需要通过终端及网络来设置或取消。不管怎样,ADR机制都应该尽可能使能,帮助终端延长电池寿命和扩大网络容量。
注意:即使是移动的终端,可能在大部分时间也是处于非移动状态。因此根据它的移动状态,终端也可以请求网络使用ADR来帮助优化数据速率。
如果终端被网络优化过的数据速率高于自己默认的数据速率,它需要定期检查下网络仍能收到上行的数据。每次上行帧计数都会累加(是针对于每个新的上行包,重传包就不再增加计数),终端增加 ADR_ACK_CNT 计数。如果累计ADR_ACK_LIMIT次上行(ADR_ACK_CNT >= ADR_ACK_LIMIT)都没有收到下行回复,它就得置高ADR应答请求位(ADRACKReq)。 网络必须在规定时间内回复一个下行帧,这个时间是通过ADR_ACK_DELAY来设置,上行之后收到任何下行帧就要把ADR_ACK_CNT的计数重置。当终端在接收时隙中的任何回复下行帧的ACK位字段不需要设置,表示网关仍在接收这个设备的上行帧。如果在下一个ADR_ACK_DELAY上行时间内都没收到回复(例如,在总时间ADR_ACK_LIMIT ADR_ACK_DELAY之后),终端必须切换到下一个更低速率,使得能够获得更远传输距离来重连网络。终端如果在每次ADR_ACK_LIMIT到了之后依旧连接不上,就需要每次逐步降低数据速率。如果终端用它的默认数据速率,那就不需要置位ADRACKReq,因为无法帮助提高链路距离。
注意:不要ADRACKReq立刻回复,这样给网络预留一些余量,让它做出最好的下行调度处理。
注意:上行传输时,如果 ADR_ACK_CNT >= ADR_ACK_LIMIT 并且当前数据速率比设备的最小数据速率高,就要设置 ADRACKReq,其它情况下不需要。
4.3.1.2 消息应答位及应答流程(ACK in FCtrl)
收到confirmed类型的消息时,接收端要回复一条应答消息(应答位ACK要进行置位)。如果发送者是终端,网络就利用终端发送操作后打开的两个接收窗口之一进行回复。如果发送者是网关,终端就自行决定是否发送应答。 应答消息只会在收到消息后回复发送,并且不重发。
注意:为了让终端尽可能简单,尽可能减少该状态,即在收到confirmation类型需要确认的数据帧,需要立即发送一个严格的应答数据帧。或者终端会延迟发送应答,在它下一个数据帧中再携带。
4.3.1.3 重传流程
当需要应答却没收到应答时就会进行重发,重发的个数由终端自己定,可能每个终端都不一样,这个参数也可以由网络服务器来设置调整。
注意:一些应答机制的示例时序图在第18章中有提供。
注意:如果终端设备重发次数到达了最大值,它可以降低数据速率来重连。至于后面是否再重发还是说丢弃不管,都取决于终端自己。
注意:如果网络服务器重发次数到达了最大值,它就认为该终端掉线了,直到它再收到终端的消息。一旦和终端设备的连接出现问题时,要不要重发都取决于网络服务器自己。
注意:在重传期间的数据速率回退的建议策略在章节18.4中有描述。
4.3.1.4 帧挂起位(FPending in FCtrl 只在下行有效)
帧挂起位(FPending)只在下行交互中使用,表示网关还有挂起数据等待下发,需要终端尽快发送上行消息,然后终端再打开一个接收窗口。
FPending的详细用法在章节18.3。
4.3.1.5 帧计数器(FCnt)
每个终端有两个计数器跟踪数据帧的个数,一个是上行链路计数器(FCntUp),由终端在每次上行数据给网络服务器时累加;另一个是下行链路计数器(FCntDown),由服务器在每次下行数据给终端时累计。 网络服务器为每个终端跟踪上行帧计数及产生下行帧计数。 终端入网成功后,终端和服务端的上下行帧计数同时置0。 每次发送消息后,发送端与之对应的 FCntUp 或 FCntDown 就会加1。 接收方会同步保存接收数据的帧计数,对比收到的计数值和当前保存的值,如果两者相差小于 MAX_FCNT_GAP (要考虑计数器滚动),接收方就按接收的帧计数更新对应值。如果两者相差大于 MAX_FCNY_GAP 就说明中间丢失了很多数据,这条以及后面的数据就被丢掉。
LoRaWAN的帧计数器可以用16位和32位两种,节点上具体执行哪种计数,需要在带外通知网络侧,告知计数器的位数。 如果采用16位帧计数,FCnt字段的值可以使用帧计数器的值,此时有需要的话通过在前面填充0(值为0)字节来补足;如果采用32位帧计数, FCnt就对应计数器32位的16个低有效位(上行数据使用上行FCnt,下行数据使用下行FCnt)。
终端在相同应用和网络密钥下,不能重复用相同的FCntUp数值,除非是重传。
4.3.1.6 帧可选项(FOptsLen in FCtrl, FOpts) FCtrl 字节中的FOptsLen位字段描述了整个帧可选项(FOpts)的字段长度。
FOpts字段存放MAC命令,最长15字节,详细的MAC命令见章节4.4。
如果FOptsLen为0,则FOpts为空。在FOptsLen非0时,则不为空。如果MAC命令在FOpts字段中体现,port0不能用(FPort要么不体现,要么非0)。
MAC命令不能同时出现在FRMPayload和FOpts中,如果出现了,设备丢掉该组数据。
4.3.2 端口字段(FPort)
如果帧载荷字段不为空,端口字段必须体现出来。端口字段有体现时,若FPort的值为0表示FRMPayload只包含了MAC命令;具体见章节4.4中的MAC命令。 FPort的数值从1到223(0x01..0xDF)都是由应用层使用。 FPort的值从224到255(0xE0..0xFF)是保留用做未来的标准应用拓展。
Size(bytes) | 7..23 | 0..1 | 0..N |
---|---|---|---|
MACPayload | FHDR | FPort | FRMPayload |
N是应用程序载荷的字节个数。N的有效范围具体在第7章有定义。
N应该小于等于: N <= M – 1 – (FHDR长度) M是MAC载荷的最大长度。
4.3.3 MAC帧载荷加密(FRMPayload)
如果数据帧携带了载荷,FRMPayload必须要在MIC计算前进行加密。 加密机制是采用IEEE802.15.4/2006的AES128算法。
默认的,加密和加密由LoRaWAN层来给所有的FPort来执行。如果加密/解密由应用层来做更方便的话,也可以在LoRaWAN层之上给特定FPorts来执行,除了端口0。具体哪个节点的哪个FPort在LoRaWAN层之外要做加解密,必须要和服务器通过out-of-band信道来交互(见第19章)。
4.3.3.1 LoRaWAN加密
密钥K根据不同的FPort来使用:
FPort | K |
---|---|
0 | NwkSKey |
1..255 | AppSKey |
具体加密是这样: pld = FRMPayload 对于每个数据帧,算法定义了一个块序列Ai,i从1到k,k = ceil(len(pld) / 16):
Size(bytes) | 1 | 4 | 1 | 4 | 4 | 1 | 1 |
---|---|---|---|---|---|---|---|
Ai | 0x01 | 4x 0x00 | Dir | DevAddr | FCntUp or FCntDown | 0x00 | i |
方向字段(Dir)在上行帧时为0,在下行帧时为1. 块Ai通过加密,得到一个由块Si组成的序列S。
Si = aes128_encrypt(K, Ai) for i = 1..k S = S1 | S2 | .. | Sk
通过异或计算对payload进行加解密:
4.3.3.2 LoRaWAN层之上的加密 如果LoRaWAN之上的层级在已选的端口上(但不能是端口0,这是给MAC命令保留的)提供了预加密的FRMPayload给LoRaWAN,LoRaWAN则不再对FRMPayload进行修改,直接将FRMPayload从MACPayload传到应用层,以及从应用层传到MACPayload。
4.4 消息校验码(MIC)
消息检验码要计算消息中所有字段。 msg = MHDR | FHDR | FPort | FRMPayload
MIC是按照[RFC4493]来计算:
cmac = aes128_cmac(NwkSKey, B0 | msg) MIC = cmac[0..3]
块B0的定义如下:
Size(bytes) | 1 | 4 | 1 | 4 | 4 | 1 | 1 |
---|---|---|---|---|---|---|---|
B0 | 0x49 | 4x 0x00 | Dir | DevAddr | FCntUp or FCntDown | 0x00 | len(msg) |
方向字段(Dir)在上行帧时为0,在下行帧时为1。
第5章 MAC命令
对网络管理者而言,需要有一套专用的MAC命令用在服务器和终端MAC层之间交互。这套MAC命令对应用程序(不管是服务器端还是终端设备的应用程序)是不可见的。
单个数据帧中可以携带MAC命令,要么在FOpts字段中捎带,要么在独立帧中将FPort设成0后放在FRMPayload里。如果采用FOpts携带的方式,MAC命令是不加密并且不长度超过15字节。如果采用独立帧放在FRMPayload的方式,那就必须采用加密方式,并且不超过FRMPayload的最大长度。
注意:如果MAC命令不想被窃听,那就必须以独立帧形式放在FRMPayload中。
每个MAC命令是由 1字节CID 跟着一段可能为空的字节序列组成的。
CID | Command | 发送端 | 描述 | |
---|---|---|---|---|
终端 | 网关 | |||
0x02 | LinkCheckReq | √ | 终端利用这个命令来判断网络连接质量 | |
0x02 | LinkCheckAns | √ | LinkCheckReq的回复。包含接收信号强度,告知终端接收质量[J2] | |
0x03 | LinkADRReq | √ | 向终端请求改变数据速率,发射功率,重传率以及信道[J3] | |
0x03 | LinkADRAns | √ | LinkADRReq的回复。 | |
0x04 | DutyCycleReq | √ | 向终端设置发送的最大占空比。[J4] | |
0x04 | DutyCycleAns | √ | DutyCycleReq的回复。 | |
0x05 | RXParamSetupReq | √ | 向终端设置接收时的参数。[J5] | |
0x05 | RXParamSetupAns | √ | RXParamSetupReq的回复。 | |
0x06 | DevStatusReq | √ | 向终端查询其状态。 | |
0x06 | DevStatusAns | √ | 返回终端设备的状态,即电池余量和链路解调预算。[J6] | |
0x07 | NewChannelReq | √ | 创建或修改 1个射频信道 定义。[J7] | |
0x07 | NewChannelAns | √ | NewChannelReq的回复。 | |
0x08 | RXTimingSetupReq | √ | 设置接收时隙的时间。[J8] | |
0x08 | RXTimingSetupAns | √ | RXTimingSetupReq的回复。 | |
0x09 | TxParamSetupReq | √ | 通过NS设置终端节点的最大停留(dwell time)时间和EIRP最大有效发射功率(基于地区规则)[J9] | |
0x09 | TxParamSetupAns | √ | TxParamSetupReq的回复 | |
0x0A | DlChannelReq | √ | 通过上行与下行的频偏量修改定义的下行RX1的信道[J10] | |
0x0A | DlChannelAns | √ | DlChannelReq的回复 | |
0x80~0xFF | 私有 | √ | √ | 给私有网络命令拓展做预留。 |
表4:MAC命令表
注意:MAC命令的长度虽然没有明确给出,但是MAC执行层必须要知道。因此未知的MAC命令无法被忽略,且前面未知的MAC命令会终止MAC命令的处理队列。所以建议按照LoRaWAN协议介绍的MAC命令来处理MAC命令。这样所有基于LoRaWAN协议的MAC命令都可以被处理,即使是更高版本的命令。
注意:通过NS调整任何值(如,RX2,创建或调整信道的设置)保持有效,直到终端节点重新Join。因此在每一个节点成功入网后,节点使用默认缺省参数,并且根据需要,由NS(网络服务器)重新调整参数。
5.1 连接检查命令(LinkCheckReq, LinkCheckAns)
使用LinkCheckReq命令,可以检查一个终端的网络连接情况,这个命令没有负载字节。
当通过一个或多个网关传达LinkCheckReq命令时,需要有LinkCheckAns命令回复。
Size (bytes) | 1 | 1 |
---|---|---|
LinkCheckAns Payload | Margin | GwCnt |
射频调制边界(Margin)是一个8位无符号整数,范围是0~254,Margin值的含义是指最后一次接收到LinkCheckReq命令时的dB值。“0”代表通信架构的调制层级(0 dB或没有边界),当值为“20”时,代表网关层级到达20 dB以上。“255”是默认缺省设置。
网关数量(GwCnt)是指成功接收LinkCheckReq命令的网关数量。
5.2 连接ADR命令 (LinkADRReq, LinkADRAns)[J11]
使用LinkADRReq命令,NS请求一个终端节点执行自适应速率模式。
Size (bytes) | 1 | 2 | 1 |
---|---|---|---|
LinkADRReq Payload | DataRate_TXPower | ChMask | Redundancy |
DataRate_TXPower字节含义如下:
Bits | [7:4] | [3:0] |
---|---|---|
DataRate_TXPower | DataRate | TXPower |
请求的数据速率(DataRate)和发射功率(TXPower)是根据区域差异和指定的LoRaWAN地区参数文档制定。发射功率是指设备传输数据时最大的功率。当一个终端节点收到一条命令让发射功率超过它自身的能力范围时,终端按自身能力最大范围设定。信道掩码(ChMask)为上行通道编译成可用的信道,同将bit 0连接至LSB(最低有效位):
Bit# | Usable channels |
---|---|
0 | Channel 1 |
1 | Channel 2 |
.. | .. |
15 | Channel 16 |
一个数据位在ChMask区域里被置位为1,意味着如果这个信道允许数据速率使用在终端,则通信信道可以被用作上行通信。一个数据位复位为0,意味着应该回避该通信信道。
Bits | 7 | [6:4] | [3:0] |
---|---|---|---|
Redundancy bits | RFU(预留) | ChMaskCntl | NbTrans |
在冗余位中,NbTrans的值是指每一次上行报文的重复次数(即单条上行报文发送时,重复发送的次数),这种方式适用于“unconfirmed”的上行结构,且有效范围为[1:15]。NbTrans为0代表接收的终端应使用默认缺省值。这个区域可通过网络管理员去控制节点上行的冗余,用来获得更优质网络服务。[J12] 终端可以在重复的网络传输时进行跳频,它会等待每次重复,直至接收窗口时间关闭。不论何时,一次下行报文都可以在RX1的时间窗口接收,同时它会停止相同时间内的上行报文。对于class A的终端设备,RX2同样可以接收。
信道掩码控制(ChMaskCntl)区域是之前已定义ChMask 的控制。[J13] 它可以控制16个通道的ChMask应用,也可以通过特定调制方法全局的打开或关闭全部的通道。这些使用需要遵守当地规则,查看当地的LoRaWAN地区参数文档[PARAMS]。
网络服务器在单一的下行报文时,可能包括多个LinkAdrReq命令。为了配置终端的信道掩码,终端将会处理所有连续的LinkAdrReq报文,在现有的下行报文序列中,作为单独的命令发出。终端节点可以接受或拒绝所有的信道掩码控制,并且在每一次LinkAdrAns报文中,可以为每一条命令提供一样的信道掩码ACK状态标识。终端设备将最后一条报文中,处理数据速率(DataRate),发送功率(TXPower)和重复次数(NbTrans),同时此次设置将管理终端的全局状态。不论接受或拒绝最终的设置,在每次LinkAdrAns报文中,终端设备将反馈统一的ACK。
信道频率每个地区都有差异,详情请见第6章。一个终端将通过LinkADRReq去应答LinkADRReq命令。
Size (bytes) | 1 |
---|---|
LinkADRAns Payload | Status |
Status字节含义如下:
Bits | [7:3] | 2 | 1 | 0 |
---|---|---|---|---|
Status bits | RFU | Power ACK | Data rate ACK | Channel mask ACK |
LinkADRAns bits有如下含义:
Bit = 0 | Bit = 1 | |
---|---|---|
Channel mask ACK | 发送的信道掩码未定义或失效; 命令被丢弃,节点状态不会改变 | 信道掩码成功设置 |
Data rate ACK | 数据速率是未知的,或设备信道不支持;命令被丢弃,节点状态不会改变 | 数据速率成功设置 |
Power ACK | 命令被丢弃,节点状态不会改变 | 功率等级成功设置 |
如果这3个bits中,任意一个为0,则命令失效,节点保持原有状态。
5.3 终端发射占空比 (DutyCycleReq, DutyCycleAns)
DutyCycleReq 命令是终端网络通信中,一个周期中,允许发射的最大传输时间。
Size (bytes) | 1 |
---|---|
DutyCycleReq Payload | DutyCyclePL |
DutyCyclePL bits有如下含义:
Bits | 7:4 | 3:0 |
---|---|---|
DutyCyclePL | RFU | MaxDCycle |
终端最大的工作周期为:
MaxDutyCycle有效范围是[0 : 15]。如果值为0,则代表没有占空比的限制。
终端设备使用DutyCycleAns回复DutyCycleReq命令。DutyCycleReq MAC不包含数据负载。
5.4 接收窗口参数 (RXParamSetupReq, RXParamSetupAns )
RXParamSetupReq 命令可以为第二个接收窗口(RX2)后的每一个上行数据改变频率和数据速率的设置。同时RXParamSetupReq也可以设置上行和RX1窗口下行数据速率的偏差量。
Size (bytes) | 1 | 3 |
---|---|---|
RXParamSetupReq Payload | DLsettings | Frequency |
DLsettings bits有如下含义:[J14]
Bits | 7 | 6:4 | 3:0 |
---|---|---|---|
DLsettings | RFU | RX1DRoffset | RX2DataRate |
RX1DRoffset区域设置的是终端第一个接收窗口(RX1)上行数据速率和下行数据速率的偏差量。[J15] 默认缺省设置为0。这个偏差通常可以为某一区域平衡上下行连接边界的最大功率负载。
RX2DataRate区域设置的是终端第二个接收窗口(RX2)下行的数据速率,DR的值与约定LinkADRReq命令一致(0代表DR1/125kHZ)。Frequency的区域用来设置第二个接收窗口信道的频率,凭借这个频率可以定义NewChannelReq命令。
RXParamSetupAns命令通常使用在终端对RXParamSetupReq命令的ACK(acknowledge)应答。应该在终端的所有上行包的FOpt区域添加RXParamSetupAns命令,直至遇到Class A的下行包。[J16] 这样可以保证即使在上行丢包的情况下,网络也会知道下行参数是否应用到终端。
数据负载仅包含一个状态字节。
Size (bytes) | 1 |
---|---|
RXParamSetupAns Payload | Status |
这个状态字(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的允许范围 | RX1数据速率偏移量已成功设置 |
如果这3个bits中,任意一个为0,则命令失效,节点保持原有状态。
5.5 终端设备状态 (DevStatusReq, DevStatusAns)
网络服务器可使用DevStatusReq命令请求一个终端的状态信息。DevStatusReq命令没有数据负载。如果一个终端接收到DevStatusReq命令,终端应使用DevStatusAns回复。
Size (bytes) | 1 | 1 |
---|---|---|
DevStatusAns Payload | Battery | Margin |
电池电量(Battery)包含以下信息:
Battery | Description |
---|---|
0 | 终端连接着外接电源 |
1..254 | 电源电量,1(Min)-254(Max) |
255 | 未读出电量数据 |
边界(Margin)是指最近一次成功接收到DevStatusReq命令的信噪比。它是有符号整数,占用6个bit,范围是-32到31。
5.6 创建/修改信道 (NewChannelReq, NewChannelAns, DlChannelReq, DlChannelAns)
NewChannelReq命令可以修改已存在或新创建信道的参数。NewChannelReq命令可以设置新信道的中心频点,也可以设置这个信道上行数据速率的范围:
Size (bytes) | 1 | 3 | 1 |
---|---|---|---|
NewChannelReq Payload | ChIndex | Freq | DrRange |
信道序号(ChIndex)是创建或修改信道的序号。依照地区和频带使用波段,LoRaWAN协议强制使用规定信道,则全部设备必须与其一致,不可通过NewChannelReq命令修改(参见第6章)。若默认信道数目为N,信道Index从0到N-1,则可接受范围ChIndex是N到15。[J17] 一个设备必须能够处理至少16个不同的信道。在其他地区内,设备可能还将必须设置定义超过16个信道。
频率(Freq)区域是一个24位无符号整数。实际信的频率(Hz)的值是Freq的100倍,且100 MHz以下作为将来扩展的预留。同时可每隔100 Hz设置100MHz到1.67GHz的信道频率。Freq为0则无法设置。同时也必须检查终端设备的硬件是否支持这一频率,否则将返回错误值。
数据速率(DrRange)区域是指该信道允许的上行数据速率(DR)。这段区域有2个4-bits的索引:
Bits | 7:4 | 3:0 |
---|---|---|
DrRange | MaxDR | MinDR |
根据协议5.2章节规定的最小数据速率 (MinDR)部分,指定了信道允许的最低上行数据速率。如,0代表DR0 / 125 kHz。同样,最大数据速率(MaxDR)也定义了最高上行数据速率。例如,DrRange = 0x77代表这个信道只有50 kbps GFSK[J18] 可用[J19] ,DrRange = 0x50代表信道支持DR0 / 125 kHz到DR5 / 125 kHz。
新定义或修改过的信道可以立即使用进行通信。RX1下行频率与上行频率相同。
终端设备可用NewChannelAns命令回复NewChannelReq命令。NewChannelAns负载报文包括如下内容:
Size (bytes) | 1 |
---|---|
NewChannelAns Payload | Status |
状态位(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 | 设置频率不可用 | 频率已设置 |
如果这2个bits中,任意一个为0,则命令失效,且不会创建新的信道。
DlChannelReq命令可以连接不同的RX1下行频率。该命令应用在支持NewChannelReq命令的地区(如欧盟和中国,而美国、澳洲则不适用)。
该命令设置RX1下行的中心频点,如下:
Size (bytes) | 1 | 3 |
---|---|---|
DlChannelReq Payload | ChIndex | Freq |
信道索引(ChIndex)修改下行频率的信道序号。
频率(Freq)区域是一个24 bits的无符号整数。频率(Freq)区域是一个24位无符号整数。实际信的频率(Hz)的值是Freq的100倍,且100 MHz以下作为将来扩展的预留。终端设备必须检查硬件是否支持该频率,否则将返回错误值。
终端设备使用DlChannelAns命令来回复DlChannelReq命令。应该在终端的所有上行包的FOpt区域添加DlChannelReq命令,直至遇到Class A的下行包。这样可以保证即使在上行丢包的情况下,网络也会知道下行参数是否应用到终端。
数据负载包含如下信息:
Size (bytes) | 1 |
---|---|
DlChannelAns Payload | Status |
状态位(Status)代表如下含义:
Bits | 7:2 | 1 | 0 |
---|---|---|---|
Status | RFU | Uplink frequency exists (上行频率状态) | Channel frequency ok (信道频率状态) |
Bit = 0 | Bit = 1 | |
---|---|---|
Channel frequency ok | 该频率设备不可用 | 该频率可用 |
Uplink frequency exists | 该信道未定义该上行频率,下行频率仅可设置一个有效上行频率[J20] | 上行频率有效 |
5.7 设置收发时延 (RXTimingSetupReq, RXTimingSetupAns)
RXTimingSetupReq命令允许配置接收和发送间的时间间隔,该值决定终端在发送(TX)上行数据后,与第一个接收窗口打开的延时。第二个接收窗口会在第一个接收窗口关闭1秒后打开。
Size (bytes) | 1 |
---|---|
RXTimingSetupReq Payload | Settings |
延时(Delay)区域是指间隔时间。该区域包含2个4-bit索引:
Bits | 7:4 | 3:0 |
---|---|---|
Settings | RFU | Del |
该延时以秒为单位。Del 0映射1秒。
Del | Delay [s] |
---|---|
0 | 1 |
1 | 1 |
2 | 2 |
3 | 3 |
.. | .. |
15 | 15 |
终端设备可用RXTimingSetupAns命令回复RXTimingSetupReq命令,且没有数据负载。
应该在终端的所有上行包的FOpt区域添加DlChannelReq命令,直至遇到Class A的下行包。这样可以保证即使在上行丢包的情况下,网络也会知道下行参数是否应用到终端。
5.8 终端传输参数(TxParamSetupReq, TxParamSetupAns)
该MAC命令仅适用部分可用地区。请参考LoRaWAN区域参数[PARAMS]文档。
TxParamSetupReq命令被用在告知终端最大的停留时间(dwell time)[J21] 。例如,一个数据包在空中的最大连续传输时间,以及终端允许的最大有效同性辐射功率(Effective Isotropic Radiated Power ,EIRP)。
Size (bytes) | 1 |
---|---|
TxParamSetup payload | EIRP_DwellTime |
该结构中的EIRP_DwellTime是指:
Bits | 7:6 | 5 | 4 | 3:0 |
---|---|---|---|---|
MaxDwellTime | RFU | DownlinkDwellTime | UplinkDwellTime | MaxEIRP |
TxParamSetupReq命令的第0-3位用在最大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 |
EIRP的最大值要与设备的最大发射功率一致。设备一般不要求传输功率,但应不超过指定的EIRP值。
Bit 4和Bit 5定义了上下行各自的最大停留时间(dwell time),如下表:
Coded Value | Dwell Time |
---|---|
0 | No Limit |
1 | 400 ms [J22] |
终端设备可用TxParamSetupAns命令回复TxParamSetupReq命令,且TxParamSetupAns命令没有数据负载。
当该MAC命令在当地区域禁止使用,则设备不应处理该MAC命令,且不发送ACK(acknowledgement)。
[J1]DR0 <-> SF12
DR1 <-> SF11
DR2 <-> SF10
DR3 <-> SF9
DR4 <-> SF8
DR5 <-> SF7
[J2]通过MAC命令查看当前环境的RSSI,SNR等
[J3]通过MAC命令设置DR,TXPower(发射功率)
[J4]通过MAC命令设置发送的占空比
占空比是指一个周期内,设备可用于通信的时间。
例如:占空比设为0.01,是指100 s内,仅可以使用1 s。
[J5]通过MAC命令设置终端节点的接收参数
[J6]通过MAC命令查询终端节点的剩余电量,链路预算
[J7]通过MAC命令创建和修改射频信道
[J8]通过MAC命令设置节点接收时隙参数
[J9]通过MAC命令设置停留时间和有效全向发射功率
EIRP=TXPower-Loss Gain
[J10]通过MAC命令设置或修改RX1的信道
[J11]DR0 <-> SF12
DR1 <-> SF11
DR2 <-> SF10
DR3 <-> SF9
DR4 <-> SF8
DR5 <-> SF7
[J12]即不使用NBTrans上行报文重复发送,但可以用在其他功能,如“confirmed“的上行结构,提高网络服务质量。
[J13]CHMaskCntl是每一组Channel的组号,每一组内有16个信道(频点),而在组内进行单独控制时,可使用Channel Mask控制。
[J14]RX1DROffset 0 1 2 3 4 5
UL: DL DL DL DL DL DL
DR0 :DR0 DR0 DR0 DR0 DR0 DR0
DR1 :DR1 DR0 DR0 DR0 DR0 DR0
DR2 :DR2 DR1 DR0 DR0 DR0 DR0
DR3 :DR3 DR2 DR1 DR0 DR0 DR0
DR4 :DR4 DR3 DR2 DR1 DR0 DR0
DR5 :DR5 DR4 DR3 DR2 DR1 DR0
[J15]查看《LoRaWAN_Regional_Parameters_v1_0-20161012_1397_1.pdf》,可设置上行与下行的DR偏移量,即若使用DROffset=5时,上行使用DR5(SF7),对应下行映射为DR0(SF12)
[J16]原文:The RXTimingSetupAns command should be added in the FOpt field of all uplinks until a class A downlink is received by the end-device.
[J17]假设默认可用5个信道(频点),则默认信道的Index为0-4,那么创建新的信道(频点)Index的范围在5-15。所以说,后文又提到硬件设备至少要支持16个信道。
[J18]高斯频移键控GFSK – Gauss frequency Shift Keying ,是在调制之前通过一个高斯低通滤波器来限制信号的频谱宽度。
[J19]GFSK是一种射频调制方式,50kbps是网络速度。
[J20]原文:the downlink frequency can only be set for a channel that already has a valid uplink frequency .
[J21]停留时间(dwell time) [J21]是指网关或节点在发送数据时,允许的最大发送时间。因为有些地区对发送时间有限制。例如,不允许终端的发包时间超过2秒。
[J22]也就是说,dwell time是不可配的,要么不开启,要么只能设置成40ms
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179184.html原文链接:https://javaforall.cn