三、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}}