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

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

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

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

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

圖4 數(shù)據(jù)包傳輸方向

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

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

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