


摘? 要:現代智能家居設備可通過手機APP被遠程控制,這些控制信息流通常會通過云服務器VPS中轉,存在安全隱患。當中轉VPS接受大量請求時,可能會產生網絡阻塞而延時。該文設計了一種價格低廉而又可靠的遠程控制方案,以MQTT協議傳輸信息,家居控制端采用NodeMCU控制模塊(ESP8266帶Wi-Fi),網絡架構以一種VPN技術,在手機APP和家庭路由器(OpenWrt系統)之間進行P2P內網穿透的直連通信,既保證了安全性,又提高了控制響應速度。
關鍵詞:內網穿透;ZeroTier;OpenWrt;MQTT;NodeMCU;ESP8266
中圖分類號:TP319? ? ? 文獻標識碼:A 文章編號:2096-4706(2020)18-0169-03
Abstract:Modern smart home devices can be remotely controlled through mobile APP. These control information streams are usually transferred through the cloud server VPS,which has security risks. When the transit VPS accepts a large number of requests,it may cause network congestion and delay. This paper designs a low-cost and reliable remote control scheme,which uses MQTT protocol to transmit information and the home controlled terminals use NodeMCU modules(ESP8266 with Wi-Fi). The network architecture uses a VPN technology to carry out P2P intranet penetration direct communication between mobile APP and home(OpenWrt)router,which not only ensures the security,but also improves the control response speed.
Keywords:intranet penetration;ZeroTier;OpenWrt;MQTT;NodeMCU;ESP8266
0? 引? 言
當下智能家居設備在家庭中逐漸普及,給生活帶來了便利。有時我們不在家中,卻想要查詢或控制家中的電器設備,這時就要求我們能對其進行遠程控制。目前常見的遠程家居設備控制方案通常采用云服務器中轉傳輸信息,存在兩個缺點,一是信息可被截獲,存在安全隱患,二是當中轉VPS接受大量請求時,可能會產生網絡阻塞而延時。本文采用內網穿透技術,使得控制端與家庭路由器之間不經過VPS中轉消息,以P2P直連,再結合MQTT協議和NodeMCU控制模塊,與手機端APP軟件以及開源OpenWrt路由系統一起構建了一個廉價可靠而又靈敏的物聯網家居遠程控制系統。
1? 內網穿透技術介紹
通常每個家庭的智能家居設備會以家庭智能路由器為中心構建一個小型局域網,在該局域網中以有線或Wi-Fi方式連接PC、手機、平板等各種智能聯網設備。當我們人在家中,手中的手機通常直連入家庭局域網,這時手機上的APP軟件可容易地控制家中聯網設備。而當人處于住所以外的地方,這時手中手機連接的網絡要么是4G/5G通信網絡,要么是另一個Wi-Fi局域網,這種情況下想要連接上自己的家庭局域網并控制聯網設備,則需要內網穿透技術才能達到目的。
內網穿透的目的是從外網(Internet)訪問局域網內部某一個聯網的設備,涉及NAT/NAPT和P2P等技術。
1.1? NAT和NAPT
NAT中文含義是網絡地址轉換,NAT不僅能解決IP地址不足的問題,還能有效地避免來自網絡外部的攻擊,隱藏并保護網絡內部的計算機[1]。NAPT中文含義是網絡地址端口轉換,能完成<內部地址+內部端口>和<外部地址+外部端口>之間的轉換,被稱為“多對一”的NAT,目前大多數中等及大型局域網中路由設備主要都采用NAPT。
1.2? P2P技術
P2P點對點技術又稱對等互聯網絡技術,可以使得不同局域網的內網設備實現直連。它的重要能力就是內網穿透,檔案分享類軟件如電騾等就使用了P2P技術。P2P傳輸的方法主要有中繼、逆向連接、打洞(UDP或TCP方式)等技術。需要注意,針對雙方都是對稱NAT網絡進行UDP打洞則不可行,而目前國內幾個主要4G網絡提供商的局域網大都是對稱NAT類型,使用常見內網穿透方式通常會失敗。
1.3? 實用內網穿透方案
商用內網穿透方案主要有花生殼、NAT123、蒲公英等。開源方案有frp、NPS、ngrok、ZeroTier、n2n、Tinc等。ZeroTier是一款適用于全球互聯網的智能以太網軟交換技術。它是建立在加密安全的全球點對點對等網絡(P2P)之上的分布式網絡管理程序。它提供了先進的網絡虛擬化和管理功能,與企業SDN交換機不相上下,能同時跨局域網和廣域網,幾乎可以連接任何類型的應用程序或設備。[2]
ZeroTier協議是原始的,在OSI模型意義上,它有兩個概念上獨立但緊密耦合的層:VL1和VL2。VL1是底層的點對點傳輸層,即“虛擬線”,而VL2是一個模擬的以太網層,它為操作系統和應用程序提供友好常見的通信介質。[2]
P2P連接過程為[2]:(1)A想發送一個包到B,但由于它沒有直接路徑,所以它將包發送到上級R(根節點);(2)如果R有一個直接鏈接到B,R會將包轉發到B那里。否則,R會繼續向上級根節點發送數據包,直到到達行星根節點群為止。行星根節點群知道所有的節點,所以如果B在線,包最終會到達B;(3)R還向A發送一個路由消息,其中包含關于R如何到達B的提示。同時,轉發包到B的根節點R也發送路由消息,通知B根節點R如何到達A;(4)A和B獲取它們的路由會合消息,并嘗試向彼此發送測試消息,可能會完成對任何阻擋的NAT或有狀態防火墻的穿孔。如果建立起了直接的鏈接,則包不再走先前的轉發路線。
2? 系統架構設計
手機通過4G/5G或局域網連接入公網Internet,家庭局域網路由器(OpenWrt系統)通過光貓接入公網。手機和路由器中均安裝有ZeroTier客戶端,前期通過ZeroTier的根服務器完成打洞,之后手機和路由器之間可建立起直連通道。路由器的OpenWrt系統上安裝有MQTT服務器(SSL版)[3],轉發MQTT消息給局域網中的所有NodeMCU控制模塊。本文采用了有較強內網穿透能力的ZeroTier技術,設計的系統架構如圖1所示。
3? 系統架構搭建及網絡連通測試
按照圖1架構方式,首先使用ZeroTier搭建內網穿透環境,分為五個步驟:(1)在ZeroTier官網先注冊賬號;(2)再根據使用的場景下載不同版本的ZeroTier客戶端軟件(有Linux,Windows,Android,OpenWRT環境);(3)網頁登錄個人賬號工作面板,創建網絡ID;(4)在使用環境中運行ZeroTierOne軟件,加入創建好的網絡ID;(5)在工作面板上授權各客戶端的連接,分配虛擬局域網IP,如圖2的192.168.191.39和192.168.191.16所示,其中39為手機IPv4地址,16為路由器(OpenWrt系統)分得地址。網絡連通測試只需由路由器向手機IPv4地址發送PING包,若建立起了P2P通道,則可PING通。
4? 手機APP與NodeMCU控制模塊通信設計及編碼實現
本文采用的物聯網通信協議是MQTT,該協議適合智能家居設備,有各種語言版本的實現。MQTT服務器采用開源Mosquitto(支持MQTT V3.1.1協議)[4],支持WebSocket通信方式。在手機APP中采用了開源mqtt.js[5],以網頁WebSocket進行通信。NodeMCU控制模塊的SDK[6]實現了MQTT的通信模塊,編程時只需調用編程接口即可。
Web頁關鍵代碼為:
varmaster = mqtt.connect("ws://192.168.191.16:9001");
master.subscribe("mqtt/d");
master.on("message", function (topic, payload){
console.log(topic+":"+payload);});
function sendMsg(){
master.publish("mqtt/d", "off"); }
btnClose.onclick = function(){sendMsg();}
手機APP調用Web頁,其中IP為由ZeroTier技術分配的虛擬局域網IP地址。
NodeMCU控制模塊進行MQTT通信關鍵Lua代碼為(其中IP為路由器IP地址):
function go()
m = mqtt.Client("NodeMCU", 120)
m:on("message", function(client, topic, data)
print(topic .. ":" )
if data ~= nil then
print(data) --根據mqtt消息進行設備控制,如關燈
end
end)
m:connect("192.168.2.1",
function(m)print("已連接")
m:subscribe("mqtt/d", 0, function(client) print("訂閱成功") end)
m:publish("mqtt/d", " NodeMCU", 0, 0, function(client) print("發送") end)
end,
function(client, reason) print("失敗原因" .. reason) end
)
end
當系統網絡連通后,從手機APP發布的MQTT消息內網穿透后,直接以P2P方式傳到家庭路由器(OpenWrt系統)上,該路由器上MQTT服務器收到這個消息后,轉發給NodeMCU控制模塊從而控制家居設備,比如開關空調、調節空調等。我院計算機科學系多個實驗室機房采用這種方案實現了對機房內空調和燈的遠程控制,完成的空調控制端模塊和手機端APP界面如圖3和圖4所示。實際運用的網絡環境為移動4G通信網絡(對稱NAT)和電信寬帶網絡(端口限制NAT),通信過程表明采用ZeroTier技術和這種架構,網絡響應迅速,是一種實際可用且可靠的方案。
5? 結? 論
本文構建了一種可內網穿透家庭局域網進行網絡直連,進而控制智能家居設備的方案。該方案硬件方面由手機/平板,廣域網(4G/5G通信網絡),VPS(ZeroTier根服務器),家庭光貓,路由器(OpenWrt系統),多個NodeMCU控制模塊和多臺受控設備(燈、電視、空調等)構成;軟件方面有手機/平板APP(ZeroTier客戶端、遠程家居設備控制程序),路由器OpenWrt系統運行的ZeroTier客戶端、MQTT服務器(Mosquitto)軟件,NodeMCU控制模塊程序,結合MQTT協議進行信息交互。采用了ZeroTier的P2P技術能在除兩方局域網都是對稱NAT網關設備之外的多種情景下進行內網穿透。實際場景應用表明這是一種穩定可靠且快速的遠程控制家居設備的方案。
參考文獻:
[1] FALL K R,STEVENS W R.TCP/IP詳解 卷1:協議:第2版 [M].吳英,張玉,許昱瑋,譯.北京:機械工業出版社,2016:212.
[2] ZeroTier.MANUAL [EB/OL].[2020-05-20].https://zerotier.com/manual/.
[3] OpenWRT. package:mosquitto-ssl [DB/OL].[2020-05-20].https://openwrt.org/packages/pkgdata/mosquitto-ssl.
[4] Eclipse. An open source MQTT broker [EB/OL].[2020-05-20].http://mosquitto.org/.
[5] MQTT.js.The MQTT client for Node.js and the browser [EB/OL].[2020-05-19]https://github.com/mqttjs/MQTT.js
[6] ROBINSON S,TUAN PM.MQTT Module [EB/OL].(2015-01-23).https://nodemcu.readthedocs.io/en/release/modules/mqtt/.
作者簡介:錢立(1978—),男,漢族,四川遂寧人,碩士,副教授,研究方向:軟件專業Java/Web開發前端技術、物聯網嵌入式軟件技術等。