目录
lora常用概念缩写
扩频因子(SF)
编码率(CR)
信号带宽(BW)
lora发送参数关系
lora数据包结构
前导码
报头
低数据速率优化
如何简单直白的去理解lorawan协议
水表
电表
Rx1 和 Rx2
ABP 和 OTAA
上行去重和下行路由
lora常用概念缩写
针对特定应用,开发人员可通过调制扩频因子、带宽、纠错编码率这三个关键设计参数,对lora调制调解技术进行优化。
扩频因子(SF)
SX1278数据手册中描述:
lora扩频调制技术采用多个信息码片来代表有效负载信息的每个位。扩频信息的发送速度称为符号速率(Rs),而码片速率与标称符号速率之间的比值即为扩频因子,其表示每个信息位发送的符号数量。
例如有一个bit需要传输,数据为1。当SF为1时,传输的数据就用1来表示。当SF为6时,传输的数据就用111111来表示。
即需要传输的总数据量增大了6倍。这样扩频后传输的话,可以降低误码率(信噪比),但是在同样数据量的条件下却减少了可以传输的实际数据。
所以SF越大,传输的数据速率(比特率)越小。协议中规定了SF的范围为6~12。
扩频因子(RegModulationCfg) | 扩频因子(码片/符号) | lora调解器信噪比(SNR) |
6 | 64 | -5dBm |
7 | 128 | -7.5dBm |
8 | 256 | -10dBm |
9 | 512 | -12.5dBm |
10 | 1024 | -15dBm |
11 | 2048 | -17.5dBm |
12 | 4096 | -20dBm |
注意:因为不同扩频因子之间为正交关系,因此必须提前获知链路发送端和接收端的扩频因子。另外,还必须获知接收机输入端的信噪比。在负信噪比的条件下信号也能正常接收,这改善了lora接收机的灵敏度、链路预算及覆盖范围。
SF6(lora调制解调器的数据传输速率最快,因此仅在特定情况下使用)很特殊,在SX1276/77/78使用SF6时,需要进行一下操作:
在RegModulationCfg2中,将SpreadingFactor设置为6;
将报头设置为隐式模式;
在寄存器地址(0x31)的bit0~bit2中写入101;
在寄存器地址(0x37)中写入0x0c。
编码率(CR)
编码率就是有用部分数据占数据流的比例。
为进一步提高链路的鲁棒性(可理解成稳定性),lora调制解调器采用循环纠错编码进行前向错误检测与纠错。使用这样的纠错编码之后,会产生传输开销。
在存在干扰的情况下,前向纠错能有效提高链路的可靠性。因此,编码率(及抗干扰性能)可以随着信道条件的变化而变化(可以选择在报头中加入编码率以便接收端能够解析,可参考lora的数据包结构)。
编码率(RegTxCfg1) | 循环编码率 | 开销比率 |
1 | 4/5 | 1.25 |
2 | 4/6 | 1.5 |
3 | 4/7 | 1.75 |
4 | 4/8 | 2 |
信号带宽(BW)
BW:限定允许通行该信道的信号下限频率和上限频率。比如一个信道允许的通带的为1.5kHz~15kHz,则其带宽为13.5kHz。
增加BW可以提高有效数据速率以缩短传输时间,但这是以牺牲部分接收灵敏度为代价。多数国家对允许占用带宽都设有一定的约束。
FSK调制解调器描述的带宽是指单边带带宽,LoRa调制解调器描述的带宽是指双边带带宽(全信道带宽)。
注意:较低频段(169MHz)不支持250kHz和500kHz的带宽。
带宽(kHz) | 扩频因子 | 编码率 | 标称比特率(bps) |
7.8 | 12 | 4/5 | 18 |
10.4 | 12 | 4/5 | 34 |
15.6 | 12 | 4/5 | 37 |
20.8 | 12 | 4/5 | 49 |
31.2 | 12 | 4/5 | 73 |
41.7 | 12 | 4/5 | 98 |
62.5 | 12 | 4/5 | 146 |
125 | 12 | 4/5 | 293 |
250 | 12 | 4/5 | 586 |
500 | 12 | 4/5 | 1172 |
lora发送参数关系
符号速率Rs = 符号带宽BW / 2 ^ 扩频因子SF。
数据速率DR = 扩频因子SF * 符号速率Rs * 编码率CR。
lorawan协议主要使用了125kHz信号带宽设置,但其它专用协议可以利用其它的信号带宽设置。改变BW、SF和CR也就改变了链路预算和传输时间,需要在电池寿命和举例上做个权衡。
lora数据包结构
lora调制解调器数据包格式:隐式 和 显式。
显式数据包的报头较短。
射频PHY层数据包结构:
Preamble | PHDR | PHDR_CRC | PHYPayload | CRC |
前导码
前导码用于保持接收机与输入的数据流同步。默认情况下,数据包含有12个符号长度的前导码。
前导码长度是一个可以通过编程来设置的变量,所以前导码的长度可以扩展。例如,在接收密集型应用中,为了缩短接收机占空比,可缩短前导码的长度。然而,前导码的最小允许长度就可以满足所有通讯需求。
对于希望前导码是固定开销的情况,可以将前导码寄存器长度设置在6~65535之间来改变发送前导码长度,实际发送前导码的长度范围为6+4 ~ 65535+4个符号。这样几乎就可以发送任意长的前导码序列。
接收机会定期执行前导码检测。因此,接收机的前导码长度应和发射机一致。如果前导码长度为未知或可能会发生变化,应将接收机的前导码长度设置为最大值。
报头
在RegModemConfig1寄存器,通过设定ImplicitHeaderModeOn位选择包头类型:显式报头模式、隐式报头模式。
显式报头模式:
默认的操作模式,按照 4/8 的最大纠错码发送。
包含有效负载长度(以字节为单位)、前向纠错码率、可选的16位负载CRC。
隐式报头模式:
在特定情况下,如果有效负载长度、编码率和CRC为固定或已知,则比较有效的做法是通过调用隐式报头模式来缩短发送时间。这种情况下,需要手动设置无线链路两端的有效负载长度、错误编码率和CRC。
如果 SF = 6 ,则只能使用隐式报头模式。
低数据速率优化
由于SF较高时数据包的发送时间可能较长,因此可以选择在数据包发送和接收期间提高传输对频率变化的鲁棒性。有效数据速率较低时,可通过LowDataRateOptimize位提高LoRa链路的鲁棒性。当单个符号传输时间超过16ms时,必须使用过LowDataRateOptimize位。
注意:发射机和接收机的LowDataRateOptimize位设置必须一致。
如何简单直白的去理解lorawan协议
下面内容来源
以主要的应用场景:水表和电表为例。
水表
总所周知,水表是带电池的,对于无线远程水表来说最大的挑战就是功耗。若要实现低功耗,最简单的解决方法就是只有在要发送数据时电路才工作,其余时间进入睡眠。这就是lorawan协议的A模式,class A。
如果一个水表只有发数据的时候电路才工作,其他时间都在睡眠,那么网络服务器如果想给这个水表发消息,比如说设置上报时间参数,那就没办法去完成。
lorawam协议规定了,终端发送完数据的1s以后开始接收服务器的下行(Rx1),下1s以后接收第2个数据(Rx2)。服务器只要按照约定的1s/2s下发就可以了。
电表
水表已经接入了lora网络,此时电表也想接入。电表有自己的特点,不需要电池,自身一直有电,对实时性要求比较高(网络服务器点一下断闸,电表就能立即断电)。最简单的方法就是电表不睡眠,除了自己主动发送的时间,其余时候都处在接收模式。这就是lorawan协议的C模式,class C。
设计要求RxC=Rx2,即频率和扩频因子都相等。
Rx1 和 Rx2
无线通信的终端要接收到网关下发的消息,需要满足以下几个条件:
时间T:只有时间对上了才能收得到
频率F:只有频率对上了才能收得到
扩频因子SF:只有SF对上了才能收得到(扩频通信才有,lora是扩频通信)
所以是一个三元组(T,F,SF),Rx1和Rx2不只是时间的概念,而是这个三元组的概念。所以Rx1、Rx2对应的三元组不一样。
水表一般没有下行命令,是不是Rx1、Rx2就没有必要了呢?
不是的,水表在上报数据时,怎么知道网络服务器收到了这条数据呢?
最简单的方法就是服务器收到了水表上报,就回一条指令。
具体逻辑是:
水表上报一帧数据;
水表等待网络服务器回复,Rx1等待,Rx2等待;
如果收到了网络服务器的回复,水表继续睡眠;
如果没有收到网络服务器的回复,水表再重发一次。
在设计的时候Rx1的频率和SF是和上行的频率和SF有关系。这引出了lora同频、异频的概念,跟Rx1有关,跟Rx2无关。
lora同频:Rx1下行的频率和上行的频率一致。
lora异频:Rx1下行的频率和上行的频率不一致。
以lorawan 8频点的场景:每次上报都会从8个频点里选择1个上报,那么Rx1下行的频点每次都不一样,好处是不会互相干扰。
Rx2设计成固定的频率和固定的SF,例如lorawan-CN470模式就设计了Rx2的频率是505.3MHz,SF=12。固定的方式更容易收到,但容易相互干扰。
Rx1:设计成和上行消息有关的频率和SF,相互干扰小。
Rx2:设计成和固定的频率和SF,容易收到,但相互干扰大。
Rx1可以用来发送回复帧,相互干扰小。电表断、合闸指令一般是实时的,用Rx2(固定方式处理简单,不用记录之前上报的频率)。
ABP 和 OTAA
lora入网方式:ABP(手动激活)和OTAA(空中激活)。
lora传输是需要加密的,每一个设备都有两个密钥:NwkSkey & AppSkey。每一个设备的两个密钥都不一样。
ABP:终端写入 NwkSkey & AppSkey 密钥,然后把这个密钥参数通过另外一种方式告诉网络服务器,这样网络服务器就能解出终端上报的信息。
ABP入网方式这种方式已经很安全了,但还是存在一定的风险。终端和网络服务器之间的每一次通信都是用NwkSkey & AppSkey加密的,窃密者通过接收空中的无线信号有可能做出一些攻击行为的。此时更安全的入网方式OTAA出现了。
OTAA:终端和网络服务器之间同步一个密钥Appkey,在入网的过程中双方通过Appkey协商出一个临时的 NwkSkey & AppSkey,入网成功后双方就用临时密钥通信。下一次再入网时, NwkSkey & AppSkey 就又变了。
OTAA更安全。对于攻击者来说:
因为Appkey只在入网的那一瞬间出现,攻击者不容易捕捉。
因为每次入网的 NwkSkey & AppSkey 都会改变,攻击者分析了这一次的数据,下次又变了。
OTAA这种方式在通信行业很常见,以GSM手机卡为例子,有一个唯一的标识码IMSI,但空中通信时用的是临时码TMSI,IMSI只在建立连接时用一下。
重放攻击:把空中收到的消息再发送出去,这样网关和网络服务器又收到了这条消息。这样子攻击者无法伪造消息。
比如电表上报的最新消息是继电器状态是断开的,在此之前是闭合的。如果攻击者一直重放之前的消息,那么业务系统上继电器状态就是闭合的,会造成严重的后果。
lora设计时考虑到如何预防重放攻击,方法是FCnt。也就是每一次上报都有一个计数,后面收到的计数一定要大于之前收到的,否者就认为是不可信任的消息。(没有收到网络服务器回复而重传的消息中,FCnt不变)
上行去重和下行路由
lora是无线传输,每一次终端上报数据都会到多个网关,这些数据是完全一样的,业务系统只要一条就可以了。这就是上行去重的概念。
NS网络服务器会做这样的处理,在一小段时间内,如果收到多条数据符合以下情况就认为是同一条数据,给AS应用服务器报一次即可。
同一终端上报
FCnt一致
校验位一致
下行时怎么办呢?如果要给一个电表下行,难道要从网关A、B、C都要下发一条指令吗?肯定是不行的,Rx2的缘故会导致互相干扰,所以只能选择一个网关下发消息,这就是lora的下行路由的概念。比如可以选择网关B下行,选择的策略是什么呢?还是要看上行,终端上报一次数据,哪个网关接收的信号质量最好,就作为下一次下行路由的选择对象。