倪峰,金海峰,蘇春芳
(江陰職業(yè)技術(shù)學(xué)院 計算機科學(xué)系,江蘇 江陰 214405)
LoRa與NB-IoT是目前窄帶物聯(lián)網(wǎng)領(lǐng)域的研究與應(yīng)用熱點。LoRa一種低功耗的廣域物聯(lián)網(wǎng)技術(shù),它采用了擴頻調(diào)制技術(shù),可實現(xiàn)超遠距離的無線傳輸,且兼顧了低功耗的需求,在智能建筑、智慧城市、智能制造等領(lǐng)域有著廣闊的應(yīng)用前景。Cisco、IBM和Semtech共同發(fā)起了LoRaAlliance聯(lián)盟,制定了LoRaWan標(biāo)準(zhǔn)規(guī)范。國內(nèi)的中興通訊、騰訊、阿里等企業(yè)也紛紛加入LoRaWan的陣營,成立了CLAA聯(lián)盟,制定適合中國國情的技術(shù)標(biāo)準(zhǔn),成為全球最大的LoRa物聯(lián)網(wǎng)生態(tài)圈。LoRa工作在非授權(quán)頻段,按照LoRaWan Regional Parameters標(biāo)準(zhǔn),中國地區(qū)有2個ISM免費頻段,分別為CN779-787和CN470-510,其中CN779-787最大功率僅為10 dBm,實際利用價值不高,CN470-510最大發(fā)射功率可達17 dBm,是部署LoRaWan的最佳頻段。
如圖1所示,LoRa節(jié)點與LoRa網(wǎng)關(guān)之間組成星型拓?fù)浣Y(jié)構(gòu),網(wǎng)關(guān)負(fù)責(zé)節(jié)點數(shù)據(jù)的透傳,網(wǎng)關(guān)與LoRaWan Server之間通過IP網(wǎng)絡(luò)進行通信,LoRaWanServer負(fù)責(zé)網(wǎng)關(guān)接入控制、LoRaWan協(xié)議解析、RF數(shù)據(jù)包的收發(fā)、數(shù)據(jù)加密與解密、數(shù)據(jù)存儲、應(yīng)用層下行指令的轉(zhuǎn)發(fā)等工作。部分網(wǎng)關(guān)內(nèi)嵌了LoRaWanServer功能,但功能較弱。目前TTN、騰訊云、阿里云、華為云等物聯(lián)網(wǎng)開發(fā)平臺提供LoRaWanServer功能,也可搭建開源的云服務(wù)器如ChirpStack。ChirpStack的前身為著名的開源項目LoRaServer,可通過租用阿里的ECS云服務(wù)器、騰訊的CVM云服務(wù)器等進行公有云的搭建部署,并實現(xiàn)域名訪問,也可在內(nèi)部網(wǎng)絡(luò)中搭建私有云平臺。ChirpStack的使用非常靈活,且安全性高,主要包括PostgreSQL、Redis、Mosquitto等軟件模塊,一般部署在Linux環(huán)境中,但安裝較為煩瑣,后續(xù)維護卸載不便,為此國內(nèi)的銳米通信等曾發(fā)布開源的LoRaServer一鍵安裝包。隨著Docker容器技術(shù)的發(fā)展,提供了更為便捷、輕量化、可移植的解決方案,在本地配置好的鏡像可部署在其他Linux版本的環(huán)境中,系統(tǒng)耦合度低,輕便靈活,因此Docker技術(shù)目前成為LoRaWan云平臺構(gòu)建的研究熱點。本文使用Docker容器技術(shù)在Ubuntu上安裝部署ChirpStack環(huán)境,硬件層選用南京易通匯聯(lián)的TJ81 LoRa網(wǎng)關(guān)和XC20 LoRa節(jié)點,節(jié)點使用ClassA工作模式,選用OTAA入網(wǎng)方式,網(wǎng)關(guān)接收通道的中心頻點為475 MHz,發(fā)射通道中心頻點505 MHz,發(fā)射和接收通道左右各5 MHz的帶寬。客戶端可通過MQTT協(xié)議或訪問ChirpStack提供的Restful API實現(xiàn)數(shù)據(jù)的上下行。
圖1 LoRa的網(wǎng)絡(luò)架構(gòu)
虛擬化實現(xiàn)了在當(dāng)前操作系統(tǒng)中模擬運行其他操作系統(tǒng)的功能,傳統(tǒng)的虛擬化技術(shù)如VMWare、VisualBox等,依賴于物理CPU和內(nèi)存,是硬件級別的虛擬化,存在占用資源多、運行慢等缺點。而Docker容器并非模擬完整的操作系統(tǒng),通過Linux提供的命名空間對不同的容器進行隔離,實現(xiàn)了操作系統(tǒng)級別的虛擬化,通過開源的應(yīng)用程序容器引擎,將程序和依賴包整合在一個文件中,運行此文件生成一個虛擬容器,程序在此虛擬容器中運行,可發(fā)布到任何Linux環(huán)境中,容器使用沙箱機制,容器之間不存在任何接口,容器性能開銷較低。
Docker由鏡像、容器、倉庫三部分構(gòu)成,鏡像是一個最小root文件系統(tǒng),是靜態(tài)的概念,而容器則是鏡像運行時的實體,倉庫是代碼控制中心,用于保存鏡像。如圖2所示,Docker使用C/S架構(gòu),Docker客戶端與本地或者遠端主機的守護進程進行通信,守護進程負(fù)責(zé)構(gòu)建和維護容器,當(dāng)需要構(gòu)建Docker容器時,守護進程從倉庫中拉取鏡像,鏡像可以存放在Docker官方提供的DockerHub中,也可以存放在私有倉庫中。守護進程得到鏡像后,生成Container容器,容器擁有獨立的root文件、進程空間等,用戶程序可以在容器中獨立運行。也可以將構(gòu)建好的鏡像推送到倉庫中,便于在其他主機上部署和使用。
圖2 Docker的架構(gòu)
Docker存儲庫中保存了安裝Docker所需組件,可通過HTTPS方式從Docker存儲庫上拉取安裝包自動安裝,安裝需要root權(quán)限,主要流程如圖3所示,相關(guān)命令由于篇幅所限不再贅述。
圖3 Ubuntu下Docker組件安裝流程
安裝完Docker后,從github上拉取ChirpStack代碼到本機,完成ChirpStack組件的安裝。拉取成功后會在用戶目錄下生成chirpstack-docker目錄,在該目錄下運行sudo docker-compose up命令,在容器中運行ChirpStack組件。
在Docker容器中運行ChirpStack相應(yīng)組件,容器中運行了以下進程:(1)chirpstack-network-server:LoRaWan網(wǎng)絡(luò)服務(wù)器。(2)chirpstack-gateway-bridge:LoRaWan網(wǎng)關(guān)通信。(3)chirpstack-application-server:LoRaWan應(yīng)用服務(wù)器。(4)mosquitto:MQTT消息代理。(5)redis:會話存儲。(6)postgresSQL:數(shù)據(jù)存儲。
按照LoRaWan標(biāo)準(zhǔn)約定,中國地區(qū)使用470~510 MHz的頻率范圍,本文使用的TJ81網(wǎng)關(guān)遵循相關(guān)協(xié)議,因此需要設(shè)置相應(yīng)參數(shù),將chirpstack-docker/dockercompose-env.yml配置文件中的NETWORK_SERVER__BAND__NAME字段以及chirpstack-docker/configuration/chirpstack-network-server/chirpstack-network-server.toml中的network_server.band字段的默認(rèn)值EU868(歐洲)修改為CN_470_510(中國),并將默認(rèn)的歐洲頻段刪除。
ChirpStack提供Web界面便于用戶自定義配置,主要業(yè)務(wù)流程如圖4所示。創(chuàng)建Network-server后需將訪問地址修改為chirpstack-network-server:8000。創(chuàng)建Gateway-profiles后將其與Network-server關(guān)聯(lián),同時設(shè)置網(wǎng)關(guān)監(jiān)聽信道號。本文使用的TJ81 LoRa網(wǎng)關(guān)設(shè)置的起始頻點為472.3 MHz,按照LoRaWan Regional Parameters V1.0標(biāo)準(zhǔn)的約定,設(shè)置Gateway-profile對應(yīng)的信道號為10至17,共8個信道號,匹配TJ81網(wǎng)關(guān)所監(jiān)聽的8個物理信道,上行頻率范圍:472.3 MHz~473.7 MHz,下行頻率范圍:502.3 MHz~503.7 MHz,信道頻率間隔200 kHz。Service-profiles負(fù)責(zé)管理服務(wù)配置文件,用于定義用戶和組織在網(wǎng)絡(luò)服務(wù)器上能使用的功能。Device-profiles負(fù)責(zé)設(shè)置設(shè)備功能和啟動參數(shù),設(shè)置LoRaWan MAC version為目前流行的1.0.2版本,設(shè)置LoRaWanRegionalParametersversion為版本A。LoRa節(jié)點支持OTAA和ABP兩種入網(wǎng)方式。OTAA入網(wǎng)方式需要節(jié)點向NS發(fā)送Joinrequest報文,報文中包含DevEUI、AppEUI和AppKey三個參數(shù),DevEUI為節(jié)點的身份唯一標(biāo)識,AppEUI為應(yīng)用ID,AppKey用于節(jié)點計算會話秘鑰。節(jié)點發(fā)送的Joinrequest報文經(jīng)網(wǎng)關(guān)透傳至NS后,若NS判斷為合法請求,則會下發(fā)Joinaccept報文,經(jīng)網(wǎng)關(guān)轉(zhuǎn)發(fā)至節(jié)點,節(jié)點從中解析出devAddr、appSkey和nwkSkey,其中devAddr為LoRa節(jié)點的唯一短地址,其余兩個參數(shù)用于數(shù)據(jù)加密使用。相對而言,ABP的入網(wǎng)方式則簡單許多,直接將devAddr、appSkey和nwkSkey這三個參數(shù)配置給ABP終端節(jié)點,這三個加密參數(shù)將固定不變,相對而言O(shè)TAA終端節(jié)點每次入網(wǎng)時會動態(tài)改變加密參數(shù),安全性高??梢奜TAA入網(wǎng)方式相對復(fù)雜,安全性高,而ABP方式簡化入網(wǎng)方式,安全性相對較弱,但由于OTAA入網(wǎng)方式需要接收NS的Joinaccept報文,在一些信號較弱的環(huán)境中,可能會導(dǎo)致數(shù)據(jù)丟包的情況發(fā)生,而采用ABP入網(wǎng)方式相對穩(wěn)定,故這兩種入網(wǎng)方式有各自的優(yōu)缺點。節(jié)點設(shè)備有ClassA、ClassB和ClassC三種類型,ClassA數(shù)據(jù)上行后短暫打開2個接收窗口,其余時間一直處于休眠狀態(tài),優(yōu)點是省電,但下行數(shù)據(jù)的實時性受限,若錯過本次接收窗口時間,需等到下次數(shù)據(jù)上行時才能接收下行數(shù)據(jù)。ClassB具備ClassA的特點,可根據(jù)網(wǎng)關(guān)接收的時間同步Beacon信標(biāo)打開接收窗口,其余時間休眠,下行數(shù)據(jù)的延遲問題有所提高,設(shè)備相對省電。ClassC設(shè)備的接收窗口時刻處于打開狀態(tài),能實時接收下行數(shù)據(jù),但最為耗電。本文使用的XC20節(jié)點采用ClassA工作模式,采用OTAA入網(wǎng)方式,故在此步驟完成相應(yīng)設(shè)置。接下來創(chuàng)建和命名網(wǎng)關(guān),將網(wǎng)關(guān)設(shè)備與先前創(chuàng)建的Network-server、Service-profile、Gateway-profile相關(guān)聯(lián),并輸入網(wǎng)關(guān)設(shè)備的ID。最后創(chuàng)建Application,命名并關(guān)聯(lián)Serviceprofile,并將節(jié)點設(shè)備添加到Application中,為節(jié)點設(shè)備配置DevEUI和AppKey,并關(guān)聯(lián)對應(yīng)的Device-profile。當(dāng)節(jié)點入網(wǎng)后,可在Application中查看到入網(wǎng)數(shù)據(jù)信息。
圖4 ChirpStack部署流程
本文中LoRa節(jié)點型號為XC20,使用STM32L431CBT6作為主控芯片,使用SEMTECH的SX1278無線擴頻芯片,最大發(fā)射功率19 dBm,RSSI -140 dBm,半雙工通信,通信距離超過3千米,通過UART進行AT指令交互。網(wǎng)關(guān)型號為TJ81,使用SX1301無線擴頻芯片,8路上行通道、1路下行通道,半雙工通信,最大發(fā)射功率24 dBm。網(wǎng)關(guān)的起始頻點、ID、服務(wù)器IP等必須與ChirpStack配置信息一致。先進行入網(wǎng)狀態(tài)查詢,向節(jié)點發(fā)送“AT+JOIN?”,若返回“+JOIN:1”表示入網(wǎng)成功,可進行數(shù)據(jù)收發(fā),若返回“+JOIN:0”表示入網(wǎng)失敗,則需進行檢查排故。入網(wǎng)成功后可進行數(shù)據(jù)的傳輸,數(shù)據(jù)將進行BASE64加密,向節(jié)點發(fā)送“AT+UNCONMSG=數(shù)據(jù)”或“AT+CONMSG=數(shù)據(jù)”即可將數(shù)據(jù)經(jīng)網(wǎng)關(guān)轉(zhuǎn)發(fā)至ChirpStack,區(qū)別在于是否需要對上行數(shù)據(jù)進行應(yīng)答。如圖5所示,節(jié)點上行數(shù)據(jù)后,可在Application中對應(yīng)的節(jié)點下的LoRaWan Frames內(nèi)實時查閱節(jié)點上行數(shù)據(jù)。如需進行數(shù)據(jù)下行,則需借助MQTT協(xié)議實現(xiàn),通過MQTTBox工具,可實現(xiàn)Topic的推送和訂閱,進行數(shù)據(jù)的上下行。也可通過MQTT協(xié)議開發(fā)用戶層應(yīng)用程序。
圖5 LoRaWan節(jié)點入網(wǎng)與數(shù)據(jù)響應(yīng)
本文通過Docker容器技術(shù)將ChirpStack部署在Ubuntu系統(tǒng)下,實現(xiàn)了LoRaWan云服務(wù),對比分析了Docker技術(shù)與VM技術(shù)的特點,對ChirpStack云服務(wù)的部署進行了詳細(xì)闡述,對LoRa節(jié)點的入網(wǎng)方式和工作模式進行了分析和選型,實現(xiàn)LoRa節(jié)點數(shù)據(jù)的上下行。經(jīng)驗證,ChirpStack在Docker容器中運行穩(wěn)定,可方便的部署在本地或阿里云等服務(wù)器上。后續(xù)將對LoRa的傳感層數(shù)據(jù)采集與傳輸以及應(yīng)用層程序的開發(fā)做進一步研究。