陳孝松
(浙江理工大學(xué) 信息學(xué)院,浙江 杭州 310018)
近年來(lái),物聯(lián)網(wǎng)開(kāi)始受到廣泛重視,傳統(tǒng)的無(wú)線網(wǎng)絡(luò)不適合應(yīng)用于物聯(lián)網(wǎng)業(yè)務(wù),因?yàn)槲锫?lián)網(wǎng)的對(duì)象只有在需要信息傳輸時(shí),才會(huì)去連網(wǎng)嘗試傳輸,其他時(shí)間大多是在等待和休眠。當(dāng)物聯(lián)網(wǎng)設(shè)備的狀態(tài)為休眠時(shí),選擇下線釋放所占用的頻譜資源[1]。
LoRa是一種低功耗廣域物聯(lián)網(wǎng)(Low-Power Wide-Area Network,LPWAN)的長(zhǎng)距離通信技術(shù),可以解決傳統(tǒng)無(wú)線網(wǎng)絡(luò)傳輸距離遠(yuǎn)和低功耗不可兼得的矛盾[2]。與WiFi[3],Zigbee,BLE,2G/3G/4G等網(wǎng)絡(luò)相比,LoRa技術(shù)的最大優(yōu)點(diǎn)是傳輸距離遠(yuǎn)[4],受其他信號(hào)的干擾小[5]。與NB-IoT技術(shù)相比,LoRa在功耗和響應(yīng)時(shí)間實(shí)時(shí)性方面的性能更優(yōu)[6]。
現(xiàn)在大多數(shù)公司采用的LoRa節(jié)點(diǎn)是基于Semtech公司提供的SX1278模塊[7],LoRa網(wǎng)關(guān)是基于美國(guó)Semtech公司提供的SX1301模塊[8]。由SX1301模塊組成的LoRa網(wǎng)關(guān)由于硬件的限制,只能工作在半雙工模式下,即接收和發(fā)送不能同時(shí)工作。
為了解決這個(gè)不足,本文設(shè)計(jì)了一種全雙工LoRa網(wǎng)關(guān)[9]。把低成本的SX1278模塊添加到原始的LoRa網(wǎng)關(guān)上,實(shí)現(xiàn)了同時(shí)接收與發(fā)送數(shù)據(jù)[10-12]。
原始LoRaWAN系統(tǒng)架構(gòu)如圖1所示[13],LoRa節(jié)點(diǎn)由MCU(STM32)和SX1278模塊構(gòu)成,LoRa網(wǎng)關(guān)由樹(shù)莓派和模塊SX1301構(gòu)成,LoRa服務(wù)器由LoRa Gateway Bridge,LoRa App Server,LoRa Server構(gòu)成。
圖1 原始LoRa系統(tǒng)架構(gòu)
LoRa節(jié)點(diǎn)的MCU(STM32)控制SX1278調(diào)制解調(diào)模塊,只能在一個(gè)信道上接收或發(fā)送,處于半雙工工作模式[14]。
LoRa服務(wù)器LoRa Gateway Bridge負(fù)責(zé)把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負(fù)責(zé)處理LoRa網(wǎng)絡(luò)數(shù)據(jù)。LoRa App Server負(fù)責(zé)處理LoRa的應(yīng)用數(shù)據(jù)。
LoRa網(wǎng)關(guān)的樹(shù)莓派(MCU)控制SX1301調(diào)制解調(diào)模塊,只能在一個(gè)信道上接收或發(fā)送,也處于半雙工工作模式[15]。
LoRa信號(hào)的傳輸時(shí)間為前導(dǎo)碼時(shí)間加上有效負(fù)載時(shí)間:
Tpacket=Tpreamble+Tpayload。
(1)
前導(dǎo)碼的傳輸時(shí)間為:
Tpreamble=(npreamble+4.25)Tsym,
(2)
有效負(fù)載的傳輸時(shí)間為:
Tpayload=npayload×Tsym。
(3)
npayload為有效負(fù)載符號(hào)數(shù),定義如下:
npayload=8+max(ceil(tmp)(CR+4),0),
(4)
(5)
式中,PL為有效負(fù)載的字節(jié)數(shù),SF表示擴(kuò)頻因子,H取0或1,DE取0或1,CR為編碼率。
原始LoRa網(wǎng)關(guān)是半雙工網(wǎng)關(guān),在同一時(shí)刻,只能接收或發(fā)送數(shù)據(jù)。原始LoRa網(wǎng)關(guān)在接收數(shù)據(jù)時(shí),可以同時(shí)接收8個(gè)信道的數(shù)據(jù);在發(fā)送數(shù)據(jù)時(shí),在同一時(shí)間只能在一個(gè)信道上發(fā)送一個(gè)數(shù)據(jù)包。如圖2所示,在原始LoRa網(wǎng)關(guān)加上SX1278模塊后,就成為一個(gè)全雙工的網(wǎng)關(guān),上行數(shù)據(jù)和下行數(shù)據(jù)在LoRa網(wǎng)關(guān)上互不影響,極大的提高了信道利用率。
圖2 改進(jìn)的LoRa系統(tǒng)架構(gòu)
從成本角度考慮,SX1278模塊是SX1301模塊的幾十分之一,這是提出全雙工網(wǎng)關(guān)設(shè)計(jì)的最大優(yōu)勢(shì)[16]。
從性能角度考慮,原始LoRa網(wǎng)關(guān)的SX1301模塊在進(jìn)行發(fā)送數(shù)據(jù)時(shí),只能在一個(gè)信道上發(fā)送。SX1301模塊在發(fā)送工作模式時(shí),所起到的作用和SX1278模塊一樣。
從可實(shí)現(xiàn)角度考慮,針對(duì)SX1278模塊和SX1301模塊,芯片廠商已經(jīng)放出免費(fèi)和開(kāi)源的代碼,只需在開(kāi)源代碼上進(jìn)行修改,就可以實(shí)現(xiàn)功能。
網(wǎng)關(guān)的硬件連接圖如圖3所示,樹(shù)莓派負(fù)責(zé)控制數(shù)據(jù)的發(fā)送與接收,同一時(shí)刻只能有一個(gè)模塊和樹(shù)莓派進(jìn)行SPI通信。當(dāng)LoRa網(wǎng)關(guān)接收數(shù)據(jù)時(shí),SX1301模塊使能,SX1278模塊不使能,樹(shù)莓派只和SX1301模塊通信。當(dāng)LoRa網(wǎng)關(guān)發(fā)送數(shù)據(jù)時(shí),SX1278模塊使能,SX1301模塊不使能,樹(shù)莓派只和SX1278模塊通信。
圖3 網(wǎng)關(guān)硬件連接圖
由此可知,對(duì)每一個(gè)模塊而言,數(shù)據(jù)包的傳輸方向是固定的,如圖4所示。對(duì)SX1301模塊,只工作在接收模式,接收來(lái)自LoRa節(jié)點(diǎn)的數(shù)據(jù)。對(duì)SX1278模塊,只工作在發(fā)送模式,把數(shù)據(jù)發(fā)送給LoRa節(jié)點(diǎn)。圖5為L(zhǎng)oRa網(wǎng)關(guān)程序流程圖。
圖4 數(shù)據(jù)包傳輸方向
圖5 LoRa網(wǎng)關(guān)程序流程圖
如圖5所示,除了原始LoRa網(wǎng)關(guān)程序里具有的上行和下行線程外,改進(jìn)后的LoRa網(wǎng)關(guān)程序另外創(chuàng)建了一個(gè)線程用于控制SX1278模塊的數(shù)據(jù)發(fā)送。上行線程從SX1301緩存中讀取數(shù)據(jù),上傳至LoRa服務(wù)器。下行線程收到LoRa服務(wù)器的數(shù)據(jù)后,不是送至原先的SX1301緩存中,而是存入SX1278緩存中。SX1278處理線程從緩存中讀取到數(shù)據(jù)后,先對(duì)數(shù)據(jù)包中的時(shí)間戳進(jìn)行合法性判斷,然后定時(shí)通過(guò)SX1278調(diào)制解調(diào)模塊發(fā)送至LoRa節(jié)點(diǎn)。
實(shí)驗(yàn)中,服務(wù)器使用內(nèi)核版本為4.10.0-28-generic的Ubuntu 16.04.2的操作系統(tǒng)。在服務(wù)器上部署GO,Redis,PostgreSQL與Node.js開(kāi)發(fā)環(huán)境,處理LoRa網(wǎng)絡(luò)數(shù)據(jù)和應(yīng)用數(shù)據(jù)。
為了使實(shí)驗(yàn)現(xiàn)象更明顯,所有的LoRa節(jié)點(diǎn)在同一個(gè)信道上發(fā)送,上行信號(hào)有效負(fù)載字節(jié)數(shù)PL=50,根據(jù)式(1)計(jì)算可知,當(dāng)擴(kuò)頻因子SF=12,編碼率CR=1,前導(dǎo)碼長(zhǎng)度為8時(shí),上行信號(hào)傳輸時(shí)間為2.794 s。下行信號(hào)有效負(fù)載字節(jié)數(shù)PL=20,傳輸時(shí)間為1.811 s。上行信號(hào)每個(gè)節(jié)點(diǎn)發(fā)送周期20 s,下行信號(hào)一個(gè)節(jié)點(diǎn)接收周期為10 s,上下行信號(hào)都不需要確認(rèn)幀。
圖6為L(zhǎng)oRa節(jié)點(diǎn)日志記錄,對(duì)每種情況,數(shù)據(jù)包發(fā)送總數(shù)為1 000個(gè)。
圖 6 LoRa節(jié)點(diǎn)日志
節(jié)點(diǎn)個(gè)數(shù)與上行信號(hào)發(fā)送成功率的關(guān)系如表1所示,可以看出,在數(shù)據(jù)量不大的情況(4個(gè)節(jié)點(diǎn))和數(shù)據(jù)量較大的情況(14個(gè)節(jié)點(diǎn)),改進(jìn)的LoRa網(wǎng)關(guān)都能起到全雙工的作用。當(dāng)下行信號(hào)發(fā)送時(shí),原始的半雙工網(wǎng)關(guān)上行信號(hào)的發(fā)送成功率下降了很多,而改進(jìn)后的全雙工網(wǎng)關(guān)上行信號(hào)的發(fā)送成功率不受任何影響。
表1 節(jié)點(diǎn)個(gè)數(shù)與上行信號(hào)發(fā)送成功率的關(guān)系
原始LoRa網(wǎng)關(guān)的SX1301模塊的發(fā)送時(shí)間同步是芯片完成的,而改進(jìn)LoRa網(wǎng)關(guān)的SX1278模塊的發(fā)送時(shí)間同步是靠軟件完成的。本實(shí)驗(yàn)的時(shí)間同步是在樹(shù)莓派Linux系統(tǒng)的用戶態(tài)下完成的,Linux系統(tǒng)用戶態(tài)和內(nèi)核態(tài)之間的通信有一定的延遲。本實(shí)驗(yàn)網(wǎng)關(guān)上的Linux系統(tǒng)因?yàn)樗\(yùn)行的程序比較單一,所以Linux系統(tǒng)用戶態(tài)和內(nèi)核態(tài)通信的延遲對(duì)實(shí)驗(yàn)結(jié)果沒(méi)影響。但是如果Linux系統(tǒng)運(yùn)行的程序過(guò)多時(shí),就會(huì)出現(xiàn)延遲非常大的情況,就會(huì)導(dǎo)致發(fā)送時(shí)間的同步有很大的誤差。如果能把SX1278的發(fā)送時(shí)間同步在樹(shù)莓派Linux系統(tǒng)的內(nèi)核態(tài)中完成,就能把延遲降到最小,時(shí)間同步也會(huì)更加精確,這是需要進(jìn)一步做的工作。
本文從實(shí)際應(yīng)用出發(fā),研究和實(shí)現(xiàn)了把原始的半雙工LoRa網(wǎng)關(guān)改進(jìn)成全雙工LoRa網(wǎng)關(guān)的設(shè)計(jì)方案。SX1301模塊的成本非常高,而SX1278模塊相對(duì)而言成本非常低,把二者結(jié)合做成全雙工網(wǎng)關(guān)的成本和原始LoRa網(wǎng)關(guān)的成本幾乎一樣,而性能卻大幅提升。網(wǎng)關(guān)可以發(fā)送和接收LoRa上行信號(hào)和下行信號(hào)。硬件和軟件實(shí)現(xiàn)也并不復(fù)雜,都是在原來(lái)開(kāi)源代碼的基礎(chǔ)上進(jìn)行修改。由實(shí)驗(yàn)結(jié)果可知,改進(jìn)后的全雙工LoRa網(wǎng)關(guān)可以正常工作,相對(duì)原始的半雙工LoRa網(wǎng)關(guān)性能提升了,LoRa網(wǎng)絡(luò)信道利用率也得到提高。