LoRa MAC层说明书(第3章)——MAC层通信过程

3 MAC通信

总体上,LoRa会区分上传链路信息和下传链路信息。上传链路信息是终端节点通过一个或者多个网关进行中继后上传到网络节点。所有的上传链路使用射频包的显示模式。在该种模式下,LoRa的物理包头和CRC校验都被包括了。数据载荷的完整性通过射频增加的CRC来确保。

PHY Preamble PHDR CRC PYHPayload CRC

下行链路是网络服务器端通过一个或多个网关将数据发送给终端节点。所有的下行链路也是使用显示模式,但是为了确保数据尽可能短从而对子带的占空比限制影响尽可能小,没有数据的完整性校验。

PHY Preamble PHDR CRC PYHPayload

在终端节点每次上传之后会打开两个短暂的接受窗口,接受窗口的开始时间是由发送结束时间确定的。
LoRa MAC层说明书(第3章)——MAC层通信过程_第1张图片
第一个接收窗口RX1在传输结束后的CLS2_RECEIVE_DELAY1秒后开始,第二个接收窗口RX2在传输接受后的CLS2_RECEIVE_DELAY2秒后开始。接受窗的长度是5个符号长,所以具体时间会根据传输速率而不同。这个是检测下行链路前导码的最短时间。如果在一个RX的时间间隔中检测到了前导码,那么无线电的接受状态会一直持续到下行帧被解调。如果一个帧在第一个时间间隔内被检测到并被解调,那么终端节点就不会打开第二个时间窗。

如果网络节点需要传递下行信息给A类节点,它将总是在这两个接受时间窗中一个的开始启动传输。
Note:终端节点在第二个接受时间窗结束之前不允许传输任何信息。
Note:对于第三类终端节点,如果预定的时间窗与从上行链路发送操作的开始时间发生重叠,并且在该发送操作之后第二个接受时间窗结束,那么终端节点将不提供接收窗的服务。

3.1 MAC负载格式

LoRa的上行和下行链路的负载以单字节的MAC header(MHDR)开始,然后是最多59字节的MAC 负载(MACPayload),最后是一个4字节的消息确认码(MIC),从而保证整个数据不超过64字节。

字节数 1 1~59 4
PHYPayload MHDR MACPayload MIC

MAC头指定了消息类型(MType),并且根据当前LoRa的MAC层的数据格式的版本号(Major)来规定编码帧。

MType 描述
000 加入请求
001 加入同意
010 数据未经确认
011 数据确认
100 ~ 110 RFU
111 所有权

LoRa的MAC层区分4种不同的MAC消息类型:加入请求、加入接受、未确认的消息和确认消息。加入请求和加入接受是第二章中OTAA的过程中使用。数据消息用来传输MAC控制和应用数据,甚至有可能在同一个数据中。确认消息必须要无线接受端确认,而未确认信息不需要确认。所有权信息最终可以用来实现不可交互的非标准信息格式,并且必须使用在对专有拓展有相同理解的设备中。

Major 描述
00 Version 1
01 ~ 11 RFU

Note:版本号规定了在加入过程中的消息格式以及以及最前面的4字节数据。遂于每一个版本,终端节点需要实现不同版本的数据格式。版本信息需要提前让网络服务器知道。

对于不同的消息类型使用不同方法进行信息完整性确认.

PHY的负载信息,也被称做数据帧,包括数据头(FHDR),随之的是可选的端口(FPort)以及可选的帧负载(FRMPayload)。如果存在的话,FPort的值为0意味着FRMPayload只包含MAC指令。章节3.2包含了可能的MAC指令列表。FPort的值为1~255的用途应用规定。

字节数 7~23 0~1 0~(N-1)
数据帧 FHDR FPort FRMPayload

FHDR中包括了一个字节的帧控制(FCtrl),两个字节的帧计数(FCnt),终端节点的短地址(DevAddr),以及最多15字节的帧操作(FOpts)用来传输MAC指令。

字节数 4 1 2 0~15
数据帧 DevAddr FCtrl FCnt FOpts

LoRa网络的一个特点就是它允许终端节点自主确定使用传输速率。LoRa的MAC使用该项功能来优化固定端的传输速率。移动终端使用他们默认的数据速率,因为在快速移动的无线电信道中进行数据管理是不实际的。如果ADR比特被设置了,那么网络就会通过通过适当的MAC命令对终端速率进行控制。如果ADR比特被清除了,网络将不会试图独立于接受信号的质量进行终端设备的数据速率控制。ADR由终端设备根据需要设置或者清除。但是,如果可能,ADR应该被开启以增加电池寿命和最小化网络容量。

字节数 7~23 0~1 0~(N-1)
数据帧 FHDR FPort FRMPayload

FHDR中包括了一个字节的帧控制(FCtrl),两个字节的帧计数(FCnt),终端节点的短地址(DevAddr),以及最多15字节的帧操作(FOpts)用来传输MAC指令。

比特 7 6 5 4 3~0
FCtrl ADR ADRACKReq ACK FPending FOptsLen

Note:就算是可移动的终端设备事实上大部分时间都是不移动的,所以取决于设备的移动状态,终端设备可以要求网络使用ADR对其数据速率进行优化。

如果终端节点的数据速率被网络优化到大于默认的数据速率,终端节点需要验证网络仍然可以接受到上行帧。在每个上行链路后,终端节点通过ADR_ACK_CNT进行计数。在ADR_ACK_LIMIT个连续上传链路且没有下传链路,终端节点会设置ADR 反馈需要(ADRACKReq)比特。网关需要在下一个ADR_ACK_DELAY上传链路,网关需要下行链路帧进行反馈,从而在上行链路之后任意一个下行链路都会重置ADRACK计数器。下行链路的ACK不需要设置,因为在终端设备的接受串口期内任意的反馈都意味这网关任然接受来自终端的上行链路。如果在下一个ADR_ACK_DELAY中仍然没有接受到数据,终端会尝试切回默认的拓展因子以扩大连接范围来获得重新连接。如果终端设备使用默认的扩展因子,那么ADRACKReq就不应该被设置,因此在这种情况下是没法提高连接范围的。
Note:不要求立即响应ADR确认请求为网络提供了灵活性,以便更佳地调度其下行链路。

终端节点会保持两个帧计数器来跟踪上传到网络服务器的帧数目(FCntUp)和终端节点接收到网络服务器的帧数目(FCntDown)。网络服务端反之也会保存终端节点的上述帧指针。在初始化的时候,所有的指针都被初始化成0。每次收到一帧数据都会加1.在接受端,相应的计数器会和接受到的数据进行同步,使得接受的值就算比当前计数器的值大也会很接近,因此最多丢失MAX_FCNT_GAP帧的数据。帧计数超出这个范围的帧将会被丢弃。

LoRa的MAC允许使用16比特或者32比特的帧计数器。网络端需要实现帧计数器的带外通知。如果使用16比特的计数器,Fcnt可以直接被用作计数器的值,并在需要的时候加上前导的0。如果使用的32比特的计数器,为计数器的低16位。
Note:由于FCn仅仅包含了32位的最低有效位,所以服务器必须从流量中推出帧计数器的高16位。

对于数据帧确认收到先前的数据帧,确认位(ACK)应该被先设置。

Note: 对于需要确认的信息,接收者需要反馈一个应答信号。如果发送者是终端,网络端需要准确地在CLS2_RECEIVE_DELAY1或者CLS2_RECEIVE_DELAY2秒进行应答。如果发送端是网关,那么终端设备可以自己决定在什么时候发送。

终端设备需要尽可能少的保持在发送状态,所以在接收到确认信息后就会立刻发送确认信息。或者终端可以推迟确认信息,使其和下一个信息一起。

该确认机制的详细时序框图在Annex 7中。

保留帧比特(FPending)只被使用在下行链路中,表明网关有更多的数据需要传输,因此要求终端尽快打开另一个接受窗口。FPending具体使用参见Annex 7.3。

帧的可选操作长度(FOptesLen)表明帧中实际FOpts的长度。FOpts是一个最长15字节的捎带在数据帧上的MCA指令。具体的MAC指令可见章节3.2。如果长度为0,说明FOpts是缺失的。

这部分的MIC计算的消息为:
msg = MHDR | FHDR | FPort |FRMPayload
len(msg)使用字节表示消息的长度。现在MIC通过下面公式进行计算:
cmac = aes128_cmac(NwkSKey, B0 | msg)
MIC = cmac[0..3]
此处的 B0 B 0 如下定义:

字节 1 4 1 4 4 1 1
B0 B 0 0x49 0 Dir DevAddr FCnt 0x00 len(msg)

Dir是指数据方向,0表示上行,1表示下行。

如果数据帧是有负载的,那么负载要在验证码计算之前进行加密。加密算法使用通用的AES_128算法。密钥K的使用取决于数据消息的FPort:

FPort K
0 NwkSKey
1~255 AppSkey

加密后的信息
pld = FRMPayload
对于每一个消息,算法定义了一系列的 Ai A i :

字节 1 4 1 4 4 1 1
Ai A i 0x01 0 Dir DevAddr FCnt 0x00 i

对于 Ai A i 被加密成 Si S i
Si S i = aes128_encrypt(K, Ai A i ) for i = 1 …k
S = S1 S 1 | S2 S 2 Sk S k
有效载荷的加密通过截断操作:
(pld | pad16 p a d 16 )xor S
来得到第一个len(pld)字节。

3.2 MAC指令

为了更好地管理网络,网络服务器和终端节点之间可以通过一系列的指令进行信息交换。MAC层命令永远不会暴露给应用、应用服务器和终端设备。一个单独的数据,帧可以包含任意一个MAC控制序列。MAC控制既可以作为FOpts的附属,又可以单独作为数据帧的FRMPayload发送,此时的FPort会被设置成0。作为附属的MAC命令序列会被明文发送,并且不会超过15字节。作为FRMPayload发送的MAC指令永远会被加密同时只要不超过最大的FRMPayload长度。不应该被窃听者窃听的信息必须作为一个独特消息的FRMPayload进行发送。

MAC命令由一个一字节的命令号,后面跟着可能是空的命令特有的字节序列。

CID Command 发送方 描述
终端 网关
0x02 LinkCheckReq * 终端设备用来验证连接
0x02 LinkCheckAns * 网关应答,同时发送接受功率,告知接受质量(连接边缘)
0x03 LinkADRReq * 通知终端修改数据速率、发送功率以及通道
0x03 LinkADRAns * 对上述的应答
0x06 DevStatusReq * 请求终端状态
0x06 DevStatusReq * 返回终端设备信息,包括电量、射频占空比、RF功率和发送包的数量

3.2.1 链接检查

通过LinkCheckReq指令,终端设备可以检查它与网络的连接状况。该命令是没有负载的,如果LinkCheckReg被网关接收到,就会返回一个LinkCheckAns命令。

字节 1 1
LinkCheckAns负载 Margin GwCnt

调制余量(Mar’gin)是一个8比特的取值在0~254的无符号整数,是上次成功连接中接受信号的dB值。0值意味着信号解调没有余量,20dB则意味着终端节点到最近网关解调增益。
网关计数(GwCnt)是网关成功接受上次LinkCheckReq的数目。

通过LinkADR命令,网络服务器可以要求终端节点执行速率适配。

比特 4 4 16
LinkADReq负载 数据速率 发送功率 ChMask

数据速率被如下进行编码:

数据速率 配置
0 LoRa:SF12/125kHz
1 LoRa:SF11/125kHz
2 LoRa:SF10/125kHz
3 LoRa:SF9/125kHz
4 LoRa:SF8/125kHz
5 LoRa:SF7/125kHz
6 LoRa:SF7/250kHz
7 FSK: 100kbps
8~15 RFU

发送功率被如下编码:

发送功率 配置
0 20dBm
1 14dBm
2 11dBm
3 8dBm
4 5dBm
5 2dBm
6~15 RFU

信道掩码对可能的中频进行编码:

比特 中频
0 868.1
1 868.3
2 868.5
3 868.85
4 869.05
5 869.525
6 869.95
7~15 RFU

终端使用LinkADRReq回应LinkADRAns命令。

字节 LinkADRReq负载
1 剩余

剩余是上次成功接受的LinkADRAns命令的解调信噪比。这是一个8比特的有符号数,范围在-127到127。-128被保留并且意味着该值不能正确计算。

3.2.3终端设备状态

DevStatusReq指令中,网络服务器需要终端的状态信息,如果终端接受到了该命令,就会返回一个DevStatusAns指令。

字节 1 1
DevStatusAns负载 电池 剩余

电池等级按照如下进行编码:

电池等级 描述
0 设备连接外带电源
1~254 1最小,254最大
255 无法测量

剩余部分是上次解调DevStatusReq的SNR,这一个一个8比特的有符号数,最小值为-127,最大为127。

你可能感兴趣的:(翻译,LoRa协议)