三、Introduction on LoRaWAN options
本文件描述了一种用于可为移动的或固定在一个固定位置的电池供电的终端设备而优化的LoRaWAN™网络协议。LORA™是一个由Semtech公司开发的长距离低功耗低通信速率无线调制应用。设备实现多类包括CLASSA在内的通信模式。LoRaWAN网络通常部署成星型网络拓扑结构, 网关中继终端及后端网络中央服务器的数据。网关通过标准IP协议连接至网络服务器,而终端采用单跳网络LORA™或FSK与一个或多个网关通信。所有通信一般是双向的,当然上行通信预计将是主要的流量。各个终端设备和网关的通信分散在不同的频率信道和通信速率之中。通信速率将根据通信范围和消息的持续时间取一个折中值,以不同的速率通信实现互不干扰。Lora的通信速率范围从0.3kbps到50kbps。为了最大限度的提高终端设备的电池寿命和网络容量,LoRa基础网络能管理通信速率和每个终端设备的RF输出,也就是说,具备自适应通信速率(ADR)功能。只要遵守以下规则,终端设备可能用任何可用的信道、任何可用的通信速率通信:
- [x] 1)终端的每次通信以伪随机的方式改变通信信道。产生的频率多样性使系统在干扰上更具鲁棒性。
- [x] 2)终端遵守该子带规定的最大发送占空比和地方法规。
- [x] 3)终端遵守该子带规定的最大发射持续时间(或滞留时间)和地方法规。
所有LoRaWAN设备至少实现了CLASSA的功能。此外,他们还可能实现了本文档描述的CLASS B,CLASS C或被其他人自定义的功能。
所有多字节采用的都是小端模式(little endian)和EUI是64位整数,发送为小端模式。
LoRaWAN CLASSA CLASSB CLASSC 区分
双向终端设备(CLASSA)
A类的终端设备允许双向通信,每一个终端设备的上行传输,跟随两个短的下行接收窗口。发送时隙的调度基于终端设备自己的通信需求,该时隙是基于随机时间基础(ALOHA类型的协议的)上的很小变动。CLASSA适用于超低功耗终端系统的应用,该类应用只要求终端发送上行传输之后,服务端再下行传输至终端。从服务端在任何其他时间下行链路通信将必须等待直到下一个预定的上行链路通信(即每次只能先上行数据才能收到下行数据)。
带接收时隙的双向终端设备(CLASSB)
B类的终端设备允许更多的接收时隙。除A类随机接收窗口,B类设备中在计划的时间打开额外的接收窗口。为了使终端设备打开它的接收窗口,在计划的时间中接收到来自网关的同步信标(Beacon帧)。这允许服务端知道什么时候终端正在侦听信号。
最大接收时隙的双向终端设备(CLASSC)
C类有近连续打开接收窗口的终端设备,只有发射时才关闭接收。CLASSC终端设备将比CLASS A、CLASS B功耗更大,但CLASS C终端设备的通信延迟最低。
LoRa调制解调器的链路控制
通过配置寄存器RegOpMode,就能将FSK调制解调器切换成LoRaTM调制解调器,切换操作可以在飞行模式(睡眠模式)下进行;LoRa调制解调器采用专有的调制和解调程序,将扩频调制与循环纠错编码技术结合起来,从而提高了链路预算和抗干扰性。LoRa调制解调器的配置图:
LoRa调制解调器拥有独立的双端口数据缓冲FIFO,而且在所有操作模式下均可通过SPI接口访问该通道。选定LoRa调制模式之后,配置寄存器中SX1276/77/78的映射关系发生变化。
RegOpMode寄存器
name | bits | description |
---|---|---|
LongRangeMode | 7bit | 0:FSK/OOK模式 1:LoRa模式 该位仅可在睡眠模式下修改。 |
AccessSharedReg | 6bit | 设置该位,允许在LoRa 模式下访问FSK 寄存器页面 |
reserved | 5~4bits | 预留 |
LowFrequencyModeOn | 3bit | 访问低频模式寄存器(从地址0x61开始)0:高频 1:低频 |
Mode | 2~0bits | 收发器模式(睡眠、待机等) |
RegOpMode.LongRangeMode进入Lora模式
- #define OPMODE_LORA 0x80 //LoRa模式,该位仅可在睡眠模式下修改。
- // 进入Lora模式的操作
- static void opmodeLora() {
- u1_t u = OPMODE_LORA;
- #ifdef CFG_sx1276_radio
- u |= 0x8; // TBD: sx1276 high freq
- #endif
- writeReg(RegOpMode, u);
- }
RegOpMode.AccessSharedReg
一般情况下仅当器件设置为 LoRa 模式时,才能访问到 LoRa 寄存器(同理, FSK 寄存器仅在 FSK 模式下才能访问);但是如果设置了AccessSharedReg位,则允许在LoRa模式下访问位于地址空间(0x0D:0x3F)的 FSK 寄存器页面 。
该位在器件处于睡眠模式时工作。为确保之后能够正常访问 LoRa 寄存器,完成相关设置后清零该位。
RegOpMode.AccessSharedReg=0:访问LoRa寄存器页面0x0D:0x3F
RegOpMode.AccessSharedReg=1:(在LoRa模式下)访问FSK寄存器页面0x0D:0x3F
RegOpMode.mode(2~0bits) 进入操作模式
- #define OPMODE_SLEEP 0x00 //000:睡眠模式
- #define OPMODE_STANDBY 0x01 //001:待机模式
- #define OPMODE_FSTX 0x02 //010:频率合成发送(FSTx)
- #define OPMODE_TX 0x03 //011:发送(Tx)
- #define OPMODE_FSRX 0x04 //100:频率合成接收(FSRx)
- #define OPMODE_RX 0x05 //101:持续接收(RXCONTINUOUS)
- #define OPMODE_RX_SINGLE 0x06 //110:单次接收(RXSINGLE)
- #define OPMODE_CAD 0x07 //111:信道活动检测(CAD)
- // 操作进入相应模式
- static void opmode (u1_t mode) {
- writeReg(RegOpMode, (readReg(RegOpMode) & ~OPMODE_MASK) | mode);
- }
- opmode(OPMODE_SLEEP);
- opmode(OPMODE_STANDBY);
- // ...
扩频因子(SF值)、调制带宽(BW)、纠错编码率(CR)
针对特定的应用,可以通过调整 扩频因子(SF值)、调制带宽(BW)及纠错编码率(CR) 这三个关键设计参数对LoRa调制解技术进行优化。对上述某个或多个参数进行调整之后,可实现在链路预算、 抗干扰性、频谱占用度及标称数据速率之间达到平衡。
扩频因子
LoRaTM扩频调制技术采用多个信息码片来代表有效负载信息的每个位。扩频信息的发送速度称为符号速率(Rs),而码片速率与标称符号速率之间的比值即为扩频因子,其表示每个信息位发送的符号数量。
扩频因子取值
RegModulationCfg2.SF | 扩频因子(码片/符号) | LoRa解调器 信噪比(SNR) |
---|---|---|
6 | 64 | -5 dB |
7 | 128 | -7.5dB |
8 | 256 | -10 dB |
9 | 512 | -12.5 dB |
10 | 1024 | -15 dB |
11 | 2048 | -17.5 dB |
12 | 4096 | -20 dB |
因为不同扩频因子(SpreadingFactor)之间为正交关系,因此必须提前获知链路发
送端和接收端的扩频因子。另外,还必须获知接收机输入端的信噪比。在负信噪比条件下信号也能正常接收, 这改善了LoRa接收机的灵敏度、链路预算及覆盖范围。
扩频因子寄存器取值在RegModemConfig2寄存器中。
RegModemConfig2寄存器
- [x] RegModemConfig2.SpreadingFactor 取值(SF值):
- #define SX1272_MC2_SF7 0x70 //RegModemConfig2.SpreadingFactor=7 128 码片/符号
- #define SX1272_MC2_SF8 0x80 //RegModemConfig2.SpreadingFactor=8 256 码片/符号
- #define SX1272_MC2_SF9 0x90 //RegModemConfig2.SpreadingFactor=9 512 码片/符号
- #define SX1272_MC2_SF10 0xA0 //RegModemConfig2.SpreadingFactor=10 1024 码片/符号
- #define SX1272_MC2_SF11 0xB0 //RegModemConfig2.SpreadingFactor=11 2048 码片/符号
- #define SX1272_MC2_SF12 0xC0 //RegModemConfig2.SpreadingFactor=12 4096 码片/符号
-
- /* sf_t sf = getSf(LMIC.rps);
- enum _sf_t { FSK=0, SF7, SF8, SF9, SF10, SF11, SF12, SFrfu };
- SX1272_MC2_SF7 + [0~5]<<4 即可得到SF7、SF8、SF9、SF10、SF11、SF12
- */
- mc2 = (SX1272_MC2_SF7 + ((sf-1)<<4));
- if (getNocrc(LMIC.rps) == 0) {
- mc2 |= SX1276_MC2_RX_PAYLOAD_CRCON;
- }
-
- writeReg(LORARegModemConfig2, mc2);
- [x] RegModemConfig2.RxPayloadCrcOn取值:
上行数据格式
前导码 可选报头 数据有效负载 0x34(8bytes) 报头+报头_CRC PayLoad+PayLoad_CRC 下行数据格式
前导码 可选报头 数据有效负载 0x34(8bytes) 报头+报头_CRC PayLoad 上行、下行报头CRC及数据有效负载CRC都是芯片自动填充的,并且有时候某一项PayLoad_CRC不是必选项。
- //RegModemConfig2.RxPayloadCrcOn = 0: CRC 关闭
- //RegModemConfig2.RxPayloadCrcOn = 1: CRC 开启
- #define SX1276_MC2_RX_PAYLOAD_CRCON 0x04
-
- if (getNocrc(LMIC.rps) == 0) {
- mc2 |= SX1276_MC2_RX_PAYLOAD_CRCON;
- }
-
- writeReg(LORARegModemConfig2, mc2);
扩频因子6(SF6)设置(特定)
当扩频因子SF为6时, LoRa调制解调器的数据传输速率最快,因此这一扩频因子仅在特定情况下使用。使用时,需在SX1276/77/78寄存器上进行以下几项设置:
- [x] 将RegModemConfig2.SpreadingFactor设置为6;
- [x] 将报头设置为隐式模式(即RegModemConfig1.ImplicitHeaderModeOn设置为1);传输对时间有苛求的数据时使用隐式报头。
- [x] 在寄存器地址(0x31)的2至0位中写入0b101一值;0x31在Lora模式下为预留寄存器,除本情况外不使用。
- [x] 在寄存器地址(0x37)中写入0x0C一值。0x37在Lora模式下为预留寄存器,除本情况外不使用。
编码率
LoRaTM调制解调器采用循环纠错编码进行前向错误检测与纠错,以提高链路的鲁棒性。使用纠错编码之后,会产生额外的传输开销。每次传输产生的循环编码开销见下表。
编码率(RegTxCfg1) | 循环编码率 | 开销比率 |
---|---|---|
1 | 4/5 | 1.25 |
2 | 4/6 | 1.5 |
3 | 4/7 | 1.75 |
4 | 4/8 | 2 |
前向纠错能有效提高链路的可靠性。由此,编码率(及抗干扰性能)可以随着信道条件的变化而变化——可以选择在报头中加入编码率以便接收端能够解析。
RegModemConfig1.CodingRate 纠错编码率
隐式报头模式下应在接收机上设置该位,以确定预期编码率。
RegModemConfig1.CodingRate = 001 : 4/5
RegModemConfig1.CodingRate = 010 : 4/6
RegModemConfig1.CodingRate = 011 : 4/7
RegModemConfig1.CodingRate = 100 : 4/8
所有其他值:预留
- #define SX1276_MC1_CR_4_5 0x02
- #define SX1276_MC1_CR_4_6 0x04
- #define SX1276_MC1_CR_4_7 0x06
- #define SX1276_MC1_CR_4_8 0x08
- // ...
- switch( getCr(LMIC.rps) ) {
- case CR_4_5: mc1 |= SX1276_MC1_CR_4_5; break;
- case CR_4_6: mc1 |= SX1276_MC1_CR_4_6; break;
- case CR_4_7: mc1 |= SX1276_MC1_CR_4_7; break;
- case CR_4_8: mc1 |= SX1276_MC1_CR_4_8; break;
- default:
- ASSERT(0);
- }
- // ...
- // set ModemConfig1
- writeReg(LORARegModemConfig1, mc1);
- // ...
信号带宽
增加信号带宽,可以提高有效数据速率以缩短传输时间,但这是以牺牲部分一接收灵敏度为代价。当然,多数国家对允许占用带宽都设有一定的约束。FSK调制解调器描述的带宽是指单边带带宽,而LoRaTM调制解调器中描述的带宽则是指双边带带宽(或全信道带宽)。LoRaTM调制解调器规格表中列出了在多数规范约束的带宽范围。
带宽(kHz) | 扩频因子 | 编码率 | 标称比特率(bps) |
---|---|---|---|
7.8 | 12 | 4/5 | 18 |
10.4 | 12 | 4/5 | 24 |
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 |
注意: 较低频段(169 MHz)不支持250kHz和500kHz的带宽。
RegModemConfig1.Bw 信号带宽
- #define SX1276_MC1_BW_125 0x70
- #define SX1276_MC1_BW_250 0x80
- #define SX1276_MC1_BW_500 0x90
-
- // ...
- switch (getBw(LMIC.rps)) {
- case BW125: mc1 |= SX1276_MC1_BW_125; break;
- case BW250: mc1 |= SX1276_MC1_BW_250; break;
- case BW500: mc1 |= SX1276_MC1_BW_500; break;
- default:
- ASSERT(0);
- }
- // ...
- // set ModemConfig1
- writeReg(LORARegModemConfig1, mc1);
- // ...
比特速率、码片速率和符号速率等区分
经过信源编码的含有信息的数据称为“比特”;
经过信道编码和交织后的数据称为“符号”;
经过最终扩频得到的数据称为“码片”。
符号表示约定
- BW表示带宽(BandWidth)
- SF表示扩频因子(SpreadingFactor)
- Rs符号速率(Symbol Rate)
- cps码片速率(chip per-second)
- Rb比特率(Bit Rate)
符号速率(Symbol Rate)
- SymbolRate和BitRate的对应关系要依据调制方式。如是BPSK调制,那么1bit可以代表0,1两种信息,此时BitRate=SymbolRate。如是QPSK调制,4个信息就需要2bit来表示,此时BitRate=2 SymbolRate。
- 符号速率*扩频因子=码片速率。
码片速率(chip per-second)
- 系统通过扩频把比特转换成码片。码片相当于模拟调制中的载波作用,是数字信号的载体。
- 一个数据信号(如逻辑1或0)通常要用多个编码信号来进行编码,那么其中的一个编码信号就称为一个码片。
- 码片数率是指扩频调制之后的数据数率,用cps表示(chip per-second) 。
LoRa发送参数关系(扩频因子、码片速率、符号速率)
- [x] LoRa符号速率
Rs = \frac{BW}{2^{SF}}
发送信号为恒包络信号。每赫兹每秒发送一个码片。
- [x] 扩频因子
码片速率=符号速率×扩频因子
SF = \frac{cps}{{Rs}}