目录
ADR、ADRACKReq in FCtrl(与数据速率有关)
FPending in FCtrl(帧挂起位,只在下行有效)
lorawan协议介绍
lora是由Semtech面向长距离、低功耗、低速率应用而开发的无线调制技术。
LoRaWAN网络通常采用星型拓扑结构, 由拓扑中的网关来转发终端与后台网络服务器间的消息。 网关通过标准IP连接来接入网络服务器, 而终端则通过单跳的 LoRa 或者 FSK 来和一个或多个网关通讯。 虽然主要传输方式是终端上行传输给网络服务器, 但所有的传输通常都是双向的。LoRa的数据速率范围可以从 0.3kbps 到 50kbps。
为了最大程度地延长终端的电池寿命和扩大网络容量, LoRa网络使用速率自适应(ADR)机制来独立管理每个终端的速率和RF输出。
每个设备可以在任意可用的信道, 任意时间, 使用任意数据速率发送数据, 只要遵守如下规定:
终端的每次传输都使用伪随机方式来改变信道。 频率的多变使得系统具有更强的抗干扰能力。
终端要遵守相应频段和本地区的无线电规定中的最大发射占空比要求。
终端要遵守相应频段和本地区的无线电规定中的最大发射时长要求。
发射占空比: 发射时长占总时长的比例。 按照无线电规定, 每个设备不能持续占用信道, 通过最大发射占空比来限制终端占用信道的时间。 例如某终端发送某数据时的发射时长为1s, 当地无线电规定中的最大发射占空比为1%, 则该终端需要等候99s才能进行下一次的发射。
lorawan classes
Class A、Class B、Class C
所有的lorawan设备都必须实现Class A功能。Class B和Class C可选(即使如此,设备在任何情况下都必须兼容Class A)。
Class A(双向传输终端): Class A 的终端在每次上行后都会紧跟两个短暂的下行接收窗口, 以此实现双向传输。 终端基于自身通信需求来安排传输时隙, 在随机时间的基础上具有较小的变化(即ALOHA协议)。 这种Class A 操作为应用提供了最低功耗的终端系统, 只要求应用在终端上行传输后的很短时间内进行服务器的下行传输。 服务器在其他任何时间进行的下行传输都得等终端的下一次上行。
Class B(划定接收时隙的双向传输终端): Class B 的终端会有更多的接收时隙。 除了Class A 的随机接收窗口, Class B 设备还会在指定时间打开别的接收窗口。 为了让终端可以在指定时间打开接收窗口, 终端需要从网关接收时间同步的信标(Beacon)。 这使得服务器可以知道终端何时处于监听状态。
Class C(最大化接收时隙的双向传输终端): Class C 的终端基本是一直打开着接收窗口, 只在发送时短暂关闭。Class C 的终端会比Class A 和 Class B 更加耗电, 但同时从服务器下发给终端的时延也是最短的。
Class A
PHY帧格式
上行消息
上行消息是由终端发出, 经过一个或多个网关转发给网络服务器。
上行消息使用lora射频帧的严格模式,消息中含有PHDR和PHDR_CRC。载荷有CRC校验来保证完整性。
PHDR、PHDR_CRC、CRC都通过射频收发器加入。
格式如下:
Preamble | PHDR | PHDR_CRC | PHYPayload | CRC |
下行消息
下行消息是由网络服务器发出, 经过单个网关转发给单个终端。
下行消息使用lora射频帧的严格模式,消息中含有PHDR和PHDR_CRC。
格式如下:
Preamble | PHDR | PHDR_CRC | PHYPayload |
接收窗口
每个上行传输后终端都要开两个短的接收窗口。接收窗口开始时间的规定,是以传输结束时间为参考。
第一接收窗口 RX1 使用的频率/速率和上行频率/速率有关, 在上行调制结束后的 RECEIVE_DELAY1秒(+/- 20微秒) 打开。 上行和 RX1 时隙下行速率的关系是按区域规定, 详细描述在[LoRaWAN地区参数]文件中。 默认第一窗口的速率是和最后一次上行的速率相同。
第二接收窗口 RX2 使用一个固定可配置的频率和数据速率, 在上行调制结束后的 RECEIVE_DELAY2秒(+/- 20微秒) 打开。 频率和数据速率可以通过 MAC 命令配置。 默认的频率和速率是按区域规定, 详细描述在[LoRaWAN地区参数]文件中。
接收窗口的时间长度至少要让终端射频收发器有足够的时间来检测到服务器下行的前导码。如果在任何一个接收窗口中检测到前导码, 射频收发器需要继续激活, 直到整个下行帧都解调完毕。
如果在第一接收窗口检测到数据帧, 且这个数据帧的地址和MIC校验通过确认是给这个终端, 那终端就不必开启第二个接收窗口。
终端在第一或第二接收窗口中收完下行消息后, 或者在第二接收窗口失效之后(第一或第二窗口均未收到下行消息), 才能再发起另一个上行消息。
如果网络服务器想要发一个下行消息给终端, 它会精确地在两个接收窗口的起始点发起传输。
节点在LoRaWAN收发窗口阶段可以收发其他协议, 只要终端能满足当地要求以及兼容LoRaWAN协议。
MAC帧格式
ADR、ADRACKReq in FCtrl(与数据速率有关)
LoRa网络允许终端采用任何可能的数据速率。 LoRaWAN协议利用该特性来优化固定终端的数据速率。 这就是自适应数据速率(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_DELAY到了之后依旧连接不上,就需要每次逐步降低数据速率。如果终端用它的默认数据速率,那就不需要置位ADRACKReq,因此无法帮助提高链路距离。
注意:不要ADRACKReq立刻回复,这样给网络预留一些余量,让它做出最好的下行调度处理。
注意:上行传输时,如果ADR_ACK_CNT>=ADR_ACK_LIMIT并且当前数据速率比设备的最小数据速率高,就要设置ADRACKReq,其它情况下不需要。
ACK in FCtrl(应答位)
收到confirmed类型的消息时, 接收端要回复一条应答消息(应答位ACK要进行置位)。 如果发送者是终端, 网络服务器就利用终端发送操作后打开的两个接收窗口之一进行回复。 如果发送者是网关, 终端就自行决定是否发送应答。 应答消息只会在收到消息后回复发送, 并且不重发。
注意:为了让终端尽可能简单,尽可能减少状态,在收到confirmed类型需要确认的数据帧,需要立即发送一个严格的应答数据帧。或者,终端会延迟发送应答,在它下一个数据帧中再携带。
重传流程
当需要应答却没收到应答时就会进行重发, 重发的个数由终端自己定, 可能每个终端都不一样, 这个参数也可以由网络服务器来设置调整。
注意:如果终端设备重发次数达到了最大值,它可以降低数据速率来重连。至于后面是否再重发还是丢弃不管,都取决于终端自己。
注意:如果网络服务器重发次数达到了最大值,它就认为该终端掉线了,直到它再收到终端的消息。一旦和终端设备的连接出现问题时,要不要重发都取决于网络服务器自己。
FPending in FCtrl(帧挂起位,只在下行有效)
帧挂起位(FPending)只在下行交互中使用,表示网关还有挂起数据等待下发,需要终端尽快发送上行消息来再打开一个接收窗口接收。
FCnt
每个终端有两个计数器跟踪数据帧的个数,一个是上下链路计数器(FCntUp),由终端在每次上行数据给网络服务器时累加;另一个是下行链路计数器(FCntDown),由网络服务器在每次下行数据给终端时累加。
网络服务器为每个终端跟踪上行帧计数及产生下行帧计数。 终端入网成功后, 终端和服务端的上下行帧计数同时置0。
每次发送消息后, 发送端与之对应的 FCntUp 或 FCntDown 就会加1。接收方会同步保存接收数据的帧计数, 对比收到的计数值和当前保存的值, 如果两者相差小于 MAX_FCNT_GAP (要考虑计数器滚动) , 接收方就按接收的帧计数更新对应值。 如果两者相差大于 MAX_FCNY_GAP 就说明中间丢失了很多数据, 这条以及后面的数据就被丢掉。
终端在相同应用和网络密钥下, 不能重复用相同的FCntUp数值, 除非是重传。
FOptsLen in FCtrl,FOpts
FCtrl字节中的FOptsLen位字段描述了整个帧可选项(FOpts)的字段长度。FOpts字段存放MAC命令, 最长15字节。
如果FOptsLen为0, 则FOpts为空。 在FOptsLen非0时, 则反之。 如果MAC命令在FOpts字段中体现, FPort不能为0(FPort为0时表示FRMPayload只包含MAC命令)。
MAC命令不能同时出现在FOpts和FRMPayload中, 如果出现了, 设备丢掉该组数据。
FPort
如果帧载荷字段不为空, 端口字段必须体现出来。 端口字段有体现时, 若FPort的值为0表示FRMPayload只包含了MAC命令;
FPort的数值从1到223(0x01..0xDF)都是由应用层使用。 FPort的值从224到255(0xE0..0xFF)是保留用做未来的标准应用拓展。
FRMPayload(MAC帧载荷加密)
如果数据帧携带了载荷,FRMPayload必须要在MIC计算前进行加密。加密机制是采用IEEE802.15.4/2006的AES128算法。
默认的,加密和解密由lorawan层来给所有的FPort来执行。如果加密/解密由应用层来做更方便的话,也可以在lorawan层之上给特定FPort来执行,除了端口0。
具体哪个节点的哪个FPort在lorawan层之上要做加/解密,必须要和网络服务器通过out-of-band信道来交互。
lorawan层的加密
密钥K根据不同的FPort来使用:
FPort | K |
0 | NwkSKey |
1..255 | AppSKey |
lorawan层之上的加密
如果lorawan层之上的层级在已选的端口上(但不能是端口0,这是给MAC命令保留的)提供了预加密的FRMPayload给lorawan,lorawan则不再对FRMPayload进行修改,直接将FRMPayload从MACPayload传给应用层,以及从应用层传到MACPayload。
MIC(消息验证码)
MIC要计算消息中所有字段。消息msg = MHDR | FHDR | FPort | FRMPayload。
MAC命令
对网络管理者而言, 有一套专门的MAC命令用来在服务器和终端MAC层之间交互。 这套MAC命令对应用程序或者应用服务器或者运行在终端设备上的应用程序是不可见的。
单个数据帧中可以包含MAC命令序列, 要么在FOpts字段中捎带, 要么作为独立帧将FPort设成0后放在FRMPayload里。 如果采用FOpts捎带的方式, MAC命令不进行加密并且长度不能超过15字节。如果采用独立帧放在FRMPayload的方式, 那就必须采用加密方式, 并且不能超过FRMPayload的最大长度。
注意: 如果MAC命令不想被窃听, 那就必须以独立帧形式放在FRMPayload中进行发送。
每个MAC命令是由 1字节命令码 (CID) 跟着一段可能为空的特定命令字节序列组成的。
终端激活
为了加入lorawan网络,每个终端需要初始化及激活。
终端激活方式:OTAA(当设备部署和重置时使用)或ABP(初始化和激活都在一个步骤内完成)
终端激活后的数据存储
激活后,终端会存储这些信息:设备地址(DevAddr)、应用ID(AppEUI)、网络会话密钥(NwkSKey)、应用会话密钥(AppSKey)。
OTAA
针对OTAA,终端必须按照加网流程来和网络服务器进行数据交互。如果终端丢失会话消息,则每次必须重新进行一次加网流程。
加网流程需要终端准备好三个参数:DevEUI、AppEUI、AppKey。
DevEUI和AppEUI类似,AppKey是由应用程序拥有者分配给终端,很可能是由应用程序指定的根密钥来衍生的,并且受提供者控制。
当终端通过OTAA方式加入网络,AppKey用来产生会话密钥NwkSKey和AppSKey,会话密钥分别用来加密和校验网络层和应用层数据。
加网流程:join-request(由终端先发送)、join-accept
size(bytes) | 8 | 8 | 2 |
join-request | AppEUI | DevEUI | DevNonce |
DevNonce是一个随机值。网络服务器为每个终端记录过去的DevNonce数值,如果相同设备发出相同的DevNonce的join-request就会忽略。join-request消息不用加密。
size(bytes) | 3 | 3 | 4 | 1 | 1 | (16)Optional |
join- accept | AppNonce | NetID | DevAddr | DLSettings | RXDelay | CFList |
如果网络服务器准许终端加入网络,就会用join-accept对join-request进行应答。join-accept是作为一个普通下行帧进行下发的,唯一的区别是它使用的是JOIN_ACCEPT_DELAY1或JOIN_ACCEPT_DELAY2(分别代替RECEIVE_DELAY1和RECEIVE_DELAY2)。但是它使用的两个接收窗口的信道频率和数据速率与RX1、RX2接收窗口相同。
如果join-request不被接受,则终端不会收到回应。
ABP
在某些情况下,终端需要独立激活。独立激活是让终端绕过join-request和join-accept的加网流程,直接加入到指定网络中。
独立激活终端,意味着DevAddr和两个会话密钥NwkSKey和AppSKey直接存储在终端中,而不是DevEUI、AppEUI、AppKey。终端在一开始就配置好了入网必要的信息。
每个终端必须要有唯一的NwkSKey和AppSKey。这样,一个设备的密钥被破解也不会造成其他设备的安全性危险。创建这些密钥的过程中,密钥不允许通过公开可用信息获得(例如节点地址)。