◆劉明晗 遲人華
(哈爾濱理工大學(xué)軟件學(xué)院 黑龍江 150000)
隨著物聯(lián)網(wǎng)技術(shù)的發(fā)展,物聯(lián)網(wǎng)設(shè)備對(duì)消息的即時(shí)性的需求日益增加,如一些警報(bào)系統(tǒng)如無(wú)法及時(shí)的發(fā)出警報(bào),將有可能帶來(lái)嚴(yán)重的后果。
傳統(tǒng)物聯(lián)網(wǎng)消息獲取方案多為基于 WEB的“請(qǐng)求-應(yīng)答”機(jī)制,每隔一段時(shí)間進(jìn)行一次消息的交換,無(wú)法滿足實(shí)時(shí)性的需求,為此我們引入推送技術(shù)來(lái)解決實(shí)時(shí)性的問(wèn)題。
推送技術(shù)指的是一種基于 Internet,將由中心或發(fā)布者發(fā)出消息傳輸給用戶的技術(shù),表現(xiàn)為客戶端能自動(dòng)收到服務(wù)器發(fā)送過(guò)來(lái)的數(shù)據(jù)和信息。主要目的是為了給用戶方便有效地發(fā)送數(shù)據(jù),將實(shí)時(shí)信息發(fā)送到客戶端,它的實(shí)現(xiàn)方式大體而言有 Poll 和Push 兩種。
Poll模式的實(shí)現(xiàn)原理借助短輪詢方式完成推送??蛻舳税凑疹A(yù)先制定好的時(shí)間間隔向服務(wù)器發(fā)出請(qǐng)求,當(dāng)服務(wù)端有新的數(shù)據(jù)時(shí)客戶端就可以獲得到這個(gè)更新。這個(gè)模式最大的特點(diǎn)就是要不斷地去訪問(wèn)服務(wù)器,設(shè)定了時(shí)間間隔便無(wú)法實(shí)現(xiàn)真正的實(shí)時(shí)性,間隔短開啟過(guò)多的連接浪費(fèi)許多不必要的資源(網(wǎng)絡(luò)流量以及服務(wù)器開銷);時(shí)間間隔過(guò)長(zhǎng)就無(wú)法達(dá)到實(shí)時(shí)的效果,就失去了推送的意義。海量需要實(shí)時(shí)交互的物聯(lián)網(wǎng)設(shè)備上,這類推送模式會(huì)在服務(wù)器資源、網(wǎng)絡(luò)可靠傳輸方面存在很多瓶頸。
Push 模式則是通過(guò)客戶端與服務(wù)器間長(zhǎng)時(shí)間建立Socket連接,只要在連接建立后,一旦一方有數(shù)據(jù)更新,就可以馬上通過(guò)Socket鏈接向?qū)Ψ桨l(fā)送數(shù)據(jù),平時(shí)在沒(méi)有更新的消息時(shí),通過(guò)一些心跳包等維持Socket連接。這個(gè)模式的特點(diǎn),能很大的簡(jiǎn)化客戶端的開發(fā)工作,消息能近乎實(shí)時(shí)的發(fā)送到客戶端。但其在資源消耗和網(wǎng)絡(luò)流量的消耗上,根據(jù)協(xié)議選擇的不同,效果會(huì)有很大不同。此外,由于需要維護(hù)Socket連接,對(duì)服務(wù)器也有很高要求。
HTTP輪詢技術(shù)用通俗易懂的話來(lái)說(shuō),就是客戶端不斷的向服務(wù)器發(fā)出請(qǐng)求,獲取最新的消息,它是一種Poll模式的“偽推送”機(jī)制。
(1)輪詢(Polling)
客戶端按照之前設(shè)定好的時(shí)間,向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器接到請(qǐng)求后處理信息,馬上返回響應(yīng)信息然后關(guān)閉連接。輪詢的優(yōu)點(diǎn)在于程序編寫比較容易。缺點(diǎn)則是許多請(qǐng)求沒(méi)有有效數(shù)據(jù),浪費(fèi)帶寬和服務(wù)器資源。
(2)長(zhǎng)輪詢(Long - Polling)
客戶端向服務(wù)器發(fā)送請(qǐng)求,服務(wù)器接到請(qǐng)求并保持連接,等到有新數(shù)據(jù)時(shí)返回響應(yīng)信息,關(guān)閉連接??蛻舳颂幚硗觏憫?yīng)信息,然后再向服務(wù)器發(fā)送新的請(qǐng)求。長(zhǎng)輪詢的優(yōu)點(diǎn)在于保持連接,沒(méi)有消息的情況不會(huì)出現(xiàn)頻繁請(qǐng)求,相比 Polling耗費(fèi)資源更小。缺點(diǎn)則是服務(wù)器保持連接會(huì)消耗內(nèi)存資源,無(wú)法保證返回?cái)?shù)據(jù)的有序性,難于管理維護(hù)。
可擴(kuò)展消息處理現(xiàn)場(chǎng)協(xié)議XMPP(Extensible Messaging and Presence Protocol,簡(jiǎn)稱Jabber)是一種以XML為基礎(chǔ)的開放式實(shí)時(shí)通信協(xié)議,是 IETF(互聯(lián)網(wǎng)工程工作小組)通過(guò)的互聯(lián)網(wǎng)標(biāo)準(zhǔn)。其優(yōu)點(diǎn)是協(xié)議成熟、強(qiáng)大、可擴(kuò)展性強(qiáng),目前許多聊天系統(tǒng)中都使用此協(xié)議,并且有很多開源的解決方案。如同電子郵件的架構(gòu)一般,XMPP是基于服務(wù)器的分布式網(wǎng)絡(luò),在跨域通訊上有著先天優(yōu)勢(shì)。缺點(diǎn)是協(xié)議較為復(fù)雜、冗余(基于 XML,包含許多XML標(biāo)簽)、費(fèi)流量、費(fèi)電,部署的硬件成本相對(duì)高。
MQTT是輕量級(jí)基于代理的“Publish/Subscribe”式的消息傳輸協(xié)議,它的設(shè)計(jì)思想是開放、簡(jiǎn)單、輕量、易實(shí)現(xiàn)。這些特點(diǎn)使它適用于受限環(huán)境。例如(不僅限于此):網(wǎng)絡(luò)價(jià)格昂貴,帶寬較低、無(wú)法保證可靠性;處理器和內(nèi)存的資源有限的嵌入式設(shè)備。
MQTT是基于TCP/IP協(xié)議,能保障消息有序性,傳輸無(wú)損耗,雙向連接網(wǎng)絡(luò)。其功能包括:使用“Publish/Subscribe”消息模式,提供一對(duì)多、一對(duì)一的信息發(fā)布模式,降低應(yīng)用程序耦合性。對(duì)負(fù)載內(nèi)容不可見(jiàn)的消息傳輸。使用 TCP/IP 提供網(wǎng)絡(luò)連接??蛇x消息發(fā)布服務(wù)質(zhì)量(QoS):QoS 0:"至多一次",消息發(fā)布完全依賴底層網(wǎng)絡(luò),不做丟包處理??赡軙?huì)發(fā)生消息丟失或重復(fù)的情況。這一級(jí)別可用于如下情況:傳感器數(shù)據(jù),丟失一次數(shù)據(jù)無(wú)所謂,數(shù)據(jù)不久之后會(huì)再次傳輸;QoS 1:"至少一次",確保消息會(huì)到達(dá),但消息可能會(huì)重復(fù);QoS 2:"只有一次",確保消息不多不少只到達(dá)一次。這一級(jí)別可用于如下情況:計(jì)費(fèi)系統(tǒng),消息重復(fù)或者丟失都會(huì)造成不良后果。一個(gè)小的傳輸開銷和最小化的協(xié)議交換,以減少網(wǎng)絡(luò)流量。當(dāng)發(fā)生異常斷線時(shí)通知有關(guān)各方的機(jī)制。
綜上所述,面對(duì)海量的IoT設(shè)備,我們亟需尋求一種消耗低并且能滿足事實(shí)性需求的推送方式,對(duì)比幾種推送方式,MQTT精巧的協(xié)議更適合應(yīng)用于IoT設(shè)備上。
eMQTT是采用Erlang語(yǔ)言開發(fā),全面支持MQTT V3.1.1協(xié)議,可集群支持大規(guī)模連接的開源MQTT消息服務(wù)器。eMQTT致力于發(fā)布一個(gè)充分發(fā)揮Erlang語(yǔ)言優(yōu)勢(shì),完全開源免費(fèi)架構(gòu)穩(wěn)定可靠,可集群支持大規(guī)模物聯(lián)網(wǎng)客戶端連接的 MQTT消息服務(wù)器。
為了方便實(shí)驗(yàn)研究,本文將在 Azure上創(chuàng)建虛擬機(jī)來(lái)搭建eMQTT Broker,具體配置為A5型Ubuntu 12.04.5版本虛擬機(jī),Host name為emqtt1,AMD Opteron(tm)Processor 4171 HE@2.1GHz的處理器,14G內(nèi)存。
為了滿足云平臺(tái)可擴(kuò)展性的需求,結(jié)合Azure方便的負(fù)載均衡服務(wù)和彈性計(jì)算服務(wù),我們?cè)?Azure上搭建了可彈性擴(kuò)展的eMQTT服務(wù)器集群。由于實(shí)驗(yàn)限制,本文將使用兩臺(tái)相同配置的虛擬機(jī)進(jìn)行集群實(shí)驗(yàn)。Azure端在現(xiàn)有云服務(wù)下建立新的虛擬機(jī),并配置MQTT端口(TCP 1883和8083端口)的負(fù)載均衡集和虛擬機(jī)的可用性集。修改eMQTT Broker的配置信息。
在emqtt1上運(yùn)行命令./bin/emqttd_ctl cluster emqttd@emqtt2將emqtt2節(jié)點(diǎn)加入到集群中,運(yùn)行命令./bin/emqttd_ctl cluster便可查看集群狀態(tài)。
Arduino,是一個(gè)開放源代碼的單芯片微控制器,它使用了Atmel AVR單片機(jī),采用了基于開放源代碼的軟硬件平臺(tái),建構(gòu)于簡(jiǎn)易輸出/輸入(simple I/O)界面板,并且具有使用類似Java、C語(yǔ)言的Processing/Wiring開發(fā)環(huán)境。
Paho 是Eclipse的IoT項(xiàng)目中的一項(xiàng),它提供了MQTT客戶端在多種平臺(tái)上的實(shí)現(xiàn),旨在更好地實(shí)現(xiàn)和構(gòu)建IoT和M2M項(xiàng)目。通過(guò)Paho提供的Arduino類庫(kù),實(shí)現(xiàn)的IoT設(shè)備的實(shí)時(shí)通訊。
系統(tǒng)分為服務(wù)端(MQTT Broker)、底端 IoT硬件設(shè)備(Arduino)、客戶端(Windows Phone、Windows)。服務(wù)端選擇在Azure上搭建兩臺(tái)MQTT Broker進(jìn)行集群來(lái)實(shí)現(xiàn)。底端設(shè)備選用Ardunio Uno作為主要處理模塊,W5100作為網(wǎng)絡(luò)通訊模塊,配合LED小燈來(lái)模擬電燈的控制實(shí)現(xiàn)??蛻舳耸褂肰isual Studio 2013開發(fā)適用于Windows平臺(tái)的通用程序,引入Paho提供的.Net SDK來(lái)實(shí)現(xiàn)MQTT。通過(guò)底端設(shè)備訂閱light主題來(lái)實(shí)現(xiàn)客戶端向底端發(fā)送指令的過(guò)程,同時(shí)客戶端訂閱 control主題來(lái)接收來(lái)自底端設(shè)備的狀態(tài)信息。
本文論述了云推送平臺(tái)在物聯(lián)網(wǎng)上實(shí)現(xiàn)即時(shí)通訊的可行性,通過(guò)對(duì)比幾種可行的推送技術(shù),選取 MQTT為主要方案,使用eMQTT Broker在Azure端搭建可彈性拓展的云推送平臺(tái),設(shè)計(jì)并實(shí)現(xiàn)了一個(gè)客戶端遠(yuǎn)程控制LED燈的應(yīng)用,充分證明了MQTT平臺(tái)在IoT方案上的可行性。
網(wǎng)絡(luò)安全技術(shù)與應(yīng)用2015年8期