陳孝松
(浙江理工大學 信息學院,浙江 杭州 310018)
近年來,物聯網開始受到廣泛重視,傳統的無線網絡不適合應用于物聯網業務,因為物聯網的對象只有在需要信息傳輸時,才會去連網嘗試傳輸,其他時間大多是在等待和休眠。當物聯網設備的狀態為休眠時,選擇下線釋放所占用的頻譜資源[1]。
LoRa是一種低功耗廣域物聯網(Low-Power Wide-Area Network,LPWAN)的長距離通信技術,可以解決傳統無線網絡傳輸距離遠和低功耗不可兼得的矛盾[2]。與WiFi[3],Zigbee,BLE,2G/3G/4G等網絡相比,LoRa技術的最大優點是傳輸距離遠[4],受其他信號的干擾小[5]。與NB-IoT技術相比,LoRa在功耗和響應時間實時性方面的性能更優[6]。
現在大多數公司采用的LoRa節點是基于Semtech公司提供的SX1278模塊[7],LoRa網關是基于美國Semtech公司提供的SX1301模塊[8]。由SX1301模塊組成的LoRa網關由于硬件的限制,只能工作在半雙工模式下,即接收和發送不能同時工作。
為了解決這個不足,本文設計了一種全雙工LoRa網關[9]。把低成本的SX1278模塊添加到原始的LoRa網關上,實現了同時接收與發送數據[10-12]。
原始LoRaWAN系統架構如圖1所示[13],LoRa節點由MCU(STM32)和SX1278模塊構成,LoRa網關由樹莓派和模塊SX1301構成,LoRa服務器由LoRa Gateway Bridge,LoRa App Server,LoRa Server構成。

圖1 原始LoRa系統架構
LoRa節點的MCU(STM32)控制SX1278調制解調模塊,只能在一個信道上接收或發送,處于半雙工工作模式[14]。
LoRa服務器LoRa Gateway Bridge負責把LoRa網關的UDP數據包轉換為MQTT數據包發送給LoRa App Server,或者把LoRa App Server的MQTT數據包轉換為UDP數據包發送給網關。LoRa Server負責處理LoRa網絡數據。LoRa App Server負責處理LoRa的應用數據。
LoRa網關的樹莓派(MCU)控制SX1301調制解調模塊,只能在一個信道上接收或發送,也處于半雙工工作模式[15]。
LoRa信號的傳輸時間為前導碼時間加上有效負載時間:
Tpacket=Tpreamble+Tpayload。
(1)
前導碼的傳輸時間為:
Tpreamble=(npreamble+4.25)Tsym,
(2)

有效負載的傳輸時間為:
Tpayload=npayload×Tsym。
(3)
npayload為有效負載符號數,定義如下:
npayload=8+max(ceil(tmp)(CR+4),0),
(4)
(5)
式中,PL為有效負載的字節數,SF表示擴頻因子,H取0或1,DE取0或1,CR為編碼率。
原始LoRa網關是半雙工網關,在同一時刻,只能接收或發送數據。原始LoRa網關在接收數據時,可以同時接收8個信道的數據;在發送數據時,在同一時間只能在一個信道上發送一個數據包。如圖2所示,在原始LoRa網關加上SX1278模塊后,就成為一個全雙工的網關,上行數據和下行數據在LoRa網關上互不影響,極大的提高了信道利用率。

圖2 改進的LoRa系統架構
從成本角度考慮,SX1278模塊是SX1301模塊的幾十分之一,這是提出全雙工網關設計的最大優勢[16]。
從性能角度考慮,原始LoRa網關的SX1301模塊在進行發送數據時,只能在一個信道上發送。SX1301模塊在發送工作模式時,所起到的作用和SX1278模塊一樣。
從可實現角度考慮,針對SX1278模塊和SX1301模塊,芯片廠商已經放出免費和開源的代碼,只需在開源代碼上進行修改,就可以實現功能。
網關的硬件連接圖如圖3所示,樹莓派負責控制數據的發送與接收,同一時刻只能有一個模塊和樹莓派進行SPI通信。當LoRa網關接收數據時,SX1301模塊使能,SX1278模塊不使能,樹莓派只和SX1301模塊通信。當LoRa網關發送數據時,SX1278模塊使能,SX1301模塊不使能,樹莓派只和SX1278模塊通信。

圖3 網關硬件連接圖
由此可知,對每一個模塊而言,數據包的傳輸方向是固定的,如圖4所示。對SX1301模塊,只工作在接收模式,接收來自LoRa節點的數據。對SX1278模塊,只工作在發送模式,把數據發送給LoRa節點。圖5為LoRa網關程序流程圖。

圖4 數據包傳輸方向

圖5 LoRa網關程序流程圖
如圖5所示,除了原始LoRa網關程序里具有的上行和下行線程外,改進后的LoRa網關程序另外創建了一個線程用于控制SX1278模塊的數據發送。上行線程從SX1301緩存中讀取數據,上傳至LoRa服務器。下行線程收到LoRa服務器的數據后,不是送至原先的SX1301緩存中,而是存入SX1278緩存中。SX1278處理線程從緩存中讀取到數據后,先對數據包中的時間戳進行合法性判斷,然后定時通過SX1278調制解調模塊發送至LoRa節點。
實驗中,服務器使用內核版本為4.10.0-28-generic的Ubuntu 16.04.2的操作系統。在服務器上部署GO,Redis,PostgreSQL與Node.js開發環境,處理LoRa網絡數據和應用數據。
為了使實驗現象更明顯,所有的LoRa節點在同一個信道上發送,上行信號有效負載字節數PL=50,根據式(1)計算可知,當擴頻因子SF=12,編碼率CR=1,前導碼長度為8時,上行信號傳輸時間為2.794 s。下行信號有效負載字節數PL=20,傳輸時間為1.811 s。上行信號每個節點發送周期20 s,下行信號一個節點接收周期為10 s,上下行信號都不需要確認幀。
圖6為LoRa節點日志記錄,對每種情況,數據包發送總數為1 000個。

圖 6 LoRa節點日志
節點個數與上行信號發送成功率的關系如表1所示,可以看出,在數據量不大的情況(4個節點)和數據量較大的情況(14個節點),改進的LoRa網關都能起到全雙工的作用。當下行信號發送時,原始的半雙工網關上行信號的發送成功率下降了很多,而改進后的全雙工網關上行信號的發送成功率不受任何影響。

表1 節點個數與上行信號發送成功率的關系
原始LoRa網關的SX1301模塊的發送時間同步是芯片完成的,而改進LoRa網關的SX1278模塊的發送時間同步是靠軟件完成的。本實驗的時間同步是在樹莓派Linux系統的用戶態下完成的,Linux系統用戶態和內核態之間的通信有一定的延遲。本實驗網關上的Linux系統因為所運行的程序比較單一,所以Linux系統用戶態和內核態通信的延遲對實驗結果沒影響。但是如果Linux系統運行的程序過多時,就會出現延遲非常大的情況,就會導致發送時間的同步有很大的誤差。如果能把SX1278的發送時間同步在樹莓派Linux系統的內核態中完成,就能把延遲降到最小,時間同步也會更加精確,這是需要進一步做的工作。
本文從實際應用出發,研究和實現了把原始的半雙工LoRa網關改進成全雙工LoRa網關的設計方案。SX1301模塊的成本非常高,而SX1278模塊相對而言成本非常低,把二者結合做成全雙工網關的成本和原始LoRa網關的成本幾乎一樣,而性能卻大幅提升。網關可以發送和接收LoRa上行信號和下行信號。硬件和軟件實現也并不復雜,都是在原來開源代碼的基礎上進行修改。由實驗結果可知,改進后的全雙工LoRa網關可以正常工作,相對原始的半雙工LoRa網關性能提升了,LoRa網絡信道利用率也得到提高。