目录
3.1.2.6 Class B enabled bit (ClassB in FCtrl, uplink only)
1.总体结构
所有的LoraWan数据帧都遵循如下结构:
MACpayload的最大长度M,与地区参数和使用的数据速率有关。超过最大长度M的MACPaylaod数据,都会被丢弃。
2.MHDR结构
FType指示帧类型,Major标识LoraWan协议版本
2.1 FType
FType | 含义 |
000 | Join Request |
001 | Join Accept |
010 | unconfirmed data uplink |
011 | unconfirmed data downlink |
100 | confirmed data uplink |
101 | confirmed data downlink |
110 | RFU |
111 | Prorietary |
unconfirmed数据不需要对端回复ack,confirmed则需要对端回复ack
Prorietary类型数据用于实现私有化数据类型通信
2.2 Major
Major指定Join流程时数据帧的格式以及MACPaylaod的前四个字节的数据格式。
对于每个主版本号,end-device可以实现不同次版本号的数据帧格式。
end-device使用的次版本号应事先通过带外通信告知NS(例如,作为终端设备个性化信息的一部分)
3.MACPayload
MACPayload由FHDR加上可选的FPort,可选的FRMPaylaod组成
一个数据帧,如果有合法的FHDR,但没有FOpts(FOptsLen=0),没有FPort,没有FRMPayload,它也是一个合法的数据帧
3.1 FHDR
FHDR包含4Byte的设备地址DevAddr,1Byte的控制字段FCtrl,2Byte的帧序号,还有最多15Byte的选项字段FOpts
3.1.1 下行数据FCtrl
1.当下行链路ADR位被设置时,该消息通知终端:NS能够发送ADR命令。终端可以独立地设置/取消设置上行链路ADR位。
2.当下行链路ADR位未设置时,它告诉终端,由于无线电信道的快速变化,网络暂时无法估计最佳DR。在这种情况下,终端可以选择:
不设置上行链路ADR位,并按照自己的策略控制其上行链路DR、TX功率和信道计划。这应该是移动终端的典型策略
忽略它(保持上行链路ADR位设置),并在没有下行的情况下应用正常的ADR退避算法。这应该是固定终端的典型策略。
3.1.2 上行数据FCtrl
1.LoRaWAN允许终端单独地使用任何合法的DR和发射(TX)功率。
2.NS使用此功能来调整和优化终端设备的重传次数、DR和TX功率。
这被称为数据速率自适应(ADR),当该功能启用时,终端设备将使用尽可能快的DR和最小的TX功率。
3.1.2.1 ADR
1.当信道快速衰减或连续变化时,ADR控制可能会失败。
当NS无法控制终端的DR时,终端的应用层应该控制它。在这种情况下,建议使用各种不同的DR。
2.如果上行帧设置了ADR位,则网络可以通过MAC命令来控制终端设备的重传次数、数据速率和TX功率。
3.如果ADR位没有设置,则NS应知道终端设备不响应"设置重传次数、数据速率或TX功率"的MAC命令。
服务器仍然可以使用LinkADReq命令来通知终端推荐的配置。
即使未设置ADR位,终端设备也应接受LinkADReq中的信道掩码控制。
终端应使用LinkADAns响应所有LinkADReq命令,指示哪些命令元素被接受,哪些被拒绝。
这与设置上行链路ADR位时不同,在这种情况下,终端接受或拒绝整个命令。
ADR位可以由终端或NS根据需要设置。应尽可能启用ADR,以延长终端的电池寿命并最大限度地提高网络容量。
即使是移动终端在大多数时候也是不动的。根据其移动状态,终端可以请求NS使用ADR优化其数据速率。
终端设备TX功率默认是最大发射功率,NS可以用LinkADReq MAC命令更改终端的发送功率
终端设备DR默认是最低DR。通过ABP激活并设置ADR位的终端,应使用最低DR,直到NS通过LinkADReq MAC命令配置更高的DR。
使用ABP激活的终端,使用Join流程中确定的初始化上行 DR
如果终端希望检查异常连接,或者DR由NS优化的终端,其使用的DR高于其默认DR或TX功率低于其默认值,则终端应定期验证网络是否仍在接收上行链路帧。
每次增加上行链路帧计数时,终端应增加ADRACKCnt计数。
如果发送ADR_ACK_LIMIT次(ADRACKCnt ≥ ADR_ACK_LIMIT)消息后,没有收到Class A下行响应,终端应在上行传输时设置ADRACKReq位。服务器要在下一个ADR_ACK_DELAY帧中使用Cass A下行帧进行响应。
在上行数据之后接收的Class A下行帧应重置ADRACKCnt计数器。接收到Class A下行数据后,终端应清除ADRACKReq位。
终端接收到Class A下行数据,表明服务器已经接收到来自该终端的上行数据,因此不需要设置下行ACK位。
如果在下一个上行ADR_ACK_DELAY内没有接收到Class A下行消息,则终端应尝试将TX功率设置为默认值,然后切换到下一个较低DR来重新获得连接。
每次发送ADR_ACK_DELAY上行帧时,终端应逐步降低其DR。一旦终端达到默认数据速率,并在ADRACKReq=1的情况下发送ADR_ACK_DELAY上行数据而未接收下行数据,则应重新启用所有默认上行频率信道,并将NbTrans重置为其默认值1。
此外,如果在退避期间的任何时候,所产生的配置导致TX功率、DR或信道掩码的无效组合,则终端设备应立即重新启用所有默认信道,并使用该终端设备允许和可用的最大TX功率。
对于固定信道区域(US、AU、CN等),终端应启用所有信道。对于动态信道区域(EU、IN、AS等),终端应启用该区域的默认信道,并且不对动态配置信道的配置进行更改。
3.1.2.2 ACK
当接收到confirmed类型消息时,接收设备用设置了ACK的数据帧进行响应。
如果服务器接收到这样一个confirmed类型消息,它应该发送一个ack。
如果服务器发送ack,则应使用终端在发送操作后打开的CLASS A接收窗口之一发送该ack。
如果终端在其CLASS A接收窗口之一中接收到confirmed类型消息,则应在其下一次上行中发送ack。
如果终端在其CLASS A接收窗口之外,即在B类ping时隙或 RXC中接收到这样的confirmed类型消息,它也应该发送ACK。
ack仅应针对收到的最新帧进行响应,且发送次数不超过NbTrans次。服务器应仅在上行confirmed类型消息的CLASS A接收窗口(RX1/RX2)中发送ack
重传过程:
1)下行数据
下行confirmed类型消息或unconfirmed类型消息不使用相同的帧计数器值重新传输。
在下行confirmed类型消息里,如果没有接收到ACK,则通知应用服务器,并且应用服务器可以发送新的confirmed类型消息
2) 上行数据
Uplink confirmed 类型数据和 unconfirmed类型数据会重传 NbTrans次,直到收到class A下行消息
NbTrans可被NS用于控制终端上行重传次数。终端在重传时也应该像平时一样进行跳频。
在每次重传之后,应该进行等待,直到接收窗口超时
重传之间的延迟由终端决定,每个终端的延迟可能不同
3.1.2.3 FPending
FPending仅在下行通信使用。对于CLASS A设备,FPending表示网NS有更多待发送的数据,因此终端需要会尽快发送上行帧。
对于CLASS B设备,FPending表示在发生冲突的情况下,应监听ping时隙的优先级
3.1.2.4 FCnt
每个终端有两个帧计数器。当数据传输到NS时,FCntUp由终端递增。
当数据被发送到终端时,FCntDown由NS递增。NS跟踪上行链路帧计数器并为每个终端设备生成下行链路计数器。
每当OTAA终端成功处理Join-Accept帧时,终端(FCntUp)和网络侧(FCntDown)上的帧计数器都会重置为0。
ABP设备的帧计数出厂时设置为0,之后即使断电,也不应该被清除
3.1.2.5 FOptsLen
FOptsLen指示FOpts的长度,FOpts传输最大长度为15个字节的MAC命令
如果FOptsLen=0,则FOpts字段应不存在。如果FOptsLen≠0,例如:FOpts字段中存在MAC命令,则不应使FPort=0(FPort不应存在或不等于0)。
MAC命令不得同时出现在payload field字段和frame options字段中。如果发生这种情况,终端应丢弃该数据
3.1.2.6 Class B enabled bit (ClassB in FCtrl, uplink only)
在上行中,ClassB设置为1,表明终端已经启用了ClassB,并且现在准备好了接收下行ping。
3.2 Port field (FPort)
如果FRMPayload不为空,则FPort字段应存在。FPort 0表示FRMPayload仅包含MAC命令。
FPort 1到223是应用相关的。FPort 224专门用于LoRaWAN MAC层测试。FPort保留224和255以供LoRa联盟使用和分配。
FPort 224目的是提供专用的测试端口,以在终端的最终版本上通过MAC 命令运行测试场景,而不必在实际测试时依赖终端的特定测试版本。
测试不应与现场操作同时进行,但终端的MAC层实现应与正常应用程序完全相同。
应使用 AppSKey对测试协议进行加密。这确保了网络不能在没有涉及终端设备所有者的的情况下启用终端设备的测试模式。
3.3 FRMPayload
如果数据帧携带FRMPayload,则应在计算MIC之前对其进行加密。
秘钥取决于端口
FPort | KEy |
0 | NwkSkey |
1,255 | AppSkey |
4 MIC
消息完整码,会根据帧中的所有字段进行计算
msg = MHDR | FHDR | FPort | FRMPayload
MIC计算方式如下:
CMAC = aes128_cmac(NwkSKey, B0 | msg)
MIC = CMAC[0..3]
B0的定义如下:
DIR = 0表示上行,DIR = 1表示下行