鄭璐豪,鄧世杰,陽(yáng) 韜
(華南理工大學(xué)廣州學(xué)院計(jì)算機(jī)工程學(xué)院,廣州 510800)
在智能聯(lián)網(wǎng)的時(shí)代里,物聯(lián)網(wǎng)正處于高速發(fā)展中,隨著需求的不斷增多,越來(lái)越多可節(jié)省人力的組件應(yīng)該被實(shí)現(xiàn)。而在諸多的用電器密集區(qū)域如商場(chǎng)、工廠、高校教學(xué)樓以及宿舍單位中,其用電設(shè)備都會(huì)有管理困難、用電數(shù)據(jù)模糊,甚至是一些有著高危險(xiǎn)系數(shù)用電器的工廠。而這些場(chǎng)景都可以依靠該項(xiàng)目中的系統(tǒng)搭建出一套體系,該系統(tǒng)提供數(shù)據(jù)可視化,遠(yuǎn)程集中管理,智能開(kāi)關(guān)用電設(shè)備。在降低人力成本的同時(shí)還能降低資源的消耗,同時(shí)對(duì)與較為危險(xiǎn)的工廠可很大幅度地降低其危險(xiǎn)系數(shù)。
因此,本文設(shè)計(jì)一種基于ZigBee與MQTT的控制系統(tǒng),實(shí)現(xiàn)上述功能。整套系統(tǒng)為了兼容多棟、多層、多間的場(chǎng)景以及便于管理,采用分布式設(shè)計(jì),通過(guò)上層控制機(jī)對(duì)多個(gè)下層控制機(jī)管理來(lái)實(shí)現(xiàn),并且所用的軟件其搭建的框架也能夠多系統(tǒng)運(yùn)行,對(duì)微機(jī)的要求降低并且兼容性也更高。為了順應(yīng)移動(dòng)智能設(shè)備的發(fā)展,該套系統(tǒng)使用uni-app開(kāi)發(fā)出對(duì)應(yīng)的網(wǎng)頁(yè)版、小程序等等多種版本,讓教室的管理人員和預(yù)約人員都能用手機(jī)等移動(dòng)設(shè)備做到遠(yuǎn)程控制、遠(yuǎn)程監(jiān)控或遠(yuǎn)程申請(qǐng)。直接點(diǎn)觸控制的方式能讓使用者更加便捷地使用該系統(tǒng),同時(shí)也符合現(xiàn)代科技發(fā)展的趨勢(shì)。
系統(tǒng)整體由用于存放前后端以及數(shù)據(jù)庫(kù)的云服務(wù)器、運(yùn)行在Linux微機(jī)或樹(shù)莓派上的MQTT服務(wù)器,以及和用電器互通的硬件集群3大模塊組成,如圖1所示。
圖1 總體布局
為了滿足外網(wǎng)可訪的需求,故采用了云服務(wù)。其中云服務(wù)主要構(gòu)成為前后端、數(shù)據(jù)庫(kù)。而采用云服務(wù)器最大的優(yōu)點(diǎn)是可以獲取一個(gè)公網(wǎng)IP搭配域名解析直接訪問(wèn)網(wǎng)站。用戶(hù)通過(guò)訪問(wèn)該服務(wù)器下的相關(guān)功能界面進(jìn)行頁(yè)面的請(qǐng)求發(fā)送,并獲取服務(wù)器返回的相關(guān)數(shù)據(jù)。同時(shí)將數(shù)據(jù)庫(kù)放置云服務(wù)器便于后端的訪問(wèn),且提高了數(shù)據(jù)的安全性。
為了降低成本,MQTT服務(wù)器則是搭建在一臺(tái)處于局域網(wǎng)內(nèi)的Linux微機(jī)或樹(shù)莓派上。此服務(wù)器中有著能通過(guò)MQTT接收發(fā)送相關(guān)數(shù)據(jù)的Qt程序,同時(shí)服務(wù)器通過(guò)直接獲取云端數(shù)據(jù)庫(kù)的信息,通過(guò)實(shí)時(shí)監(jiān)聽(tīng)數(shù)據(jù)庫(kù)將改變后的數(shù)據(jù)發(fā)送給硬件集群,實(shí)現(xiàn)指令發(fā)送。并且在硬件部分有相關(guān)任務(wù)被執(zhí)行后也會(huì)將數(shù)據(jù)傳回?cái)?shù)據(jù)庫(kù)作更新操作。
在硬件方面,主要采用可聯(lián)網(wǎng)STM32控制板和ZigBee無(wú)線傳輸模塊以及繼電器組成一整個(gè)控制體系。在無(wú)線傳輸模塊收到無(wú)線信號(hào)將數(shù)據(jù)傳至控制板處理,并將處理結(jié)果以高低電平的方式作用于繼電器上使繼電器開(kāi)閉,達(dá)到用電器開(kāi)關(guān)。
整套系統(tǒng)數(shù)據(jù)走向清晰,層級(jí)分明,通過(guò)將物聯(lián)網(wǎng)與小程序相結(jié)合,在便于客戶(hù)使用的同時(shí)也符合科技發(fā)展趨勢(shì)。
該項(xiàng)目在前端上有H5端以及該H5端對(duì)應(yīng)的一個(gè)后臺(tái)管理系統(tǒng)(PC端),在H5端上采用了uni-app框架進(jìn)行開(kāi)發(fā)[1],因?yàn)榭紤]到后續(xù)可能還有小程序端、APP端,所以就采用了uni-app這個(gè)跨平臺(tái)框架,該框架是一個(gè)使用Vue.js開(kāi)發(fā)所有前端應(yīng)用的框架,開(kāi)發(fā)者編寫(xiě)一套代碼,可發(fā)布到iOS、Android、H5,以及各種小程序等多個(gè)平臺(tái)。
后臺(tái)管理系統(tǒng)使用了Vue.js框架配合Element-ui組件庫(kù)進(jìn)行開(kāi)發(fā)。H5端以及后臺(tái)管理系統(tǒng)都使用axios作為網(wǎng)絡(luò)請(qǐng)求庫(kù),并且在開(kāi)發(fā)上遵循組件化和模塊化的開(kāi)發(fā)思想,組件化能提高前端代碼的復(fù)用性及閱讀性。模塊化是指根據(jù)業(yè)務(wù)的需求將代碼進(jìn)行隔離成獨(dú)立的模塊,這樣能讓后續(xù)的項(xiàng)目更好地進(jìn)行維護(hù),也滿足高內(nèi)聚、低耦合的軟件開(kāi)發(fā)思想。
該項(xiàng)目在服務(wù)端使用node.js的egg.js框架進(jìn)行開(kāi)發(fā),egg.js是一個(gè)由阿里巴巴開(kāi)發(fā)的基于Koa現(xiàn)有約束和規(guī)范的“企業(yè)級(jí)web開(kāi)發(fā)框架”,該框架現(xiàn)在也廣泛使用在阿里內(nèi)部的項(xiàng)目里。這個(gè)框架也做了很多安全的防范,比如幫助防止csrf攻擊。更重要的是egg.js按照一套統(tǒng)一的約定進(jìn)行應(yīng)用開(kāi)發(fā),有了制定好的約定,不需要團(tuán)隊(duì)去協(xié)商制定規(guī)范進(jìn)行開(kāi)發(fā),這樣可以減少開(kāi)發(fā)人員的學(xué)習(xí)成本,防止因?yàn)橐?guī)范協(xié)商問(wèn)題造成溝通成本的提高。
在操作數(shù)據(jù)庫(kù)上,不再使用傳統(tǒng)的sql語(yǔ)句進(jìn)行操作,而是使用Sequelize,它是一個(gè)基于promise的Node.js ORM。sequelize本質(zhì)上是對(duì)sql語(yǔ)句上進(jìn)行了封裝[2],而使用sequelize能幫助通過(guò)代碼進(jìn)行建表,以及模型關(guān)聯(lián),聯(lián)表查詢(xún),從而提高開(kāi)發(fā)效率,如圖2所示。
圖2 前后端服務(wù)器
由于該項(xiàng)目為前后端分離結(jié)構(gòu),所以前后端的代碼分別部署在兩個(gè)服務(wù)器上。服務(wù)器采用了阿里云的ecs云服務(wù)器。但是在前后端分離的項(xiàng)目里,前端向后端發(fā)起請(qǐng)求的時(shí)候,會(huì)產(chǎn)生跨域,而跨域是出于瀏覽器的同源策略的限制,同源策略會(huì)阻止一個(gè)域的javascript腳本和另外一個(gè)域的內(nèi)容進(jìn)行交互,“協(xié)議/一級(jí)域名/二級(jí)域名/端口號(hào)”有一個(gè)不同就是跨域。而解決辦法可以通過(guò)后端服務(wù)器去設(shè)置允許前端跨域的地址,或者在前端通過(guò)方向代理的方式去解決,而使用方向代理用戶(hù)不知道自己真正訪問(wèn)的是誰(shuí),只知道自己訪問(wèn)了一臺(tái)服務(wù)器,然后通過(guò)這臺(tái)服務(wù)器去分發(fā)到其他服務(wù)器,而請(qǐng)求都是這臺(tái)服務(wù)器分發(fā)的,所以也就解決了跨域的問(wèn)題。
MQTT服務(wù)器在該項(xiàng)目中充當(dāng)一個(gè)數(shù)據(jù)橋梁以及數(shù)據(jù)格式轉(zhuǎn)換的角色。在該服務(wù)器中除了要運(yùn)行MQTT的服務(wù)組件外,還要運(yùn)行由Qt框架[3]所搭建的MQTT數(shù)據(jù)橋梁接通程序。該程序也是所有MQTT服務(wù)器中客戶(hù)端的一員,充當(dāng)數(shù)據(jù)的“接收發(fā)員”。該程序采用開(kāi)源的emqx/qmqtt的開(kāi)源模塊[4]交叉編譯構(gòu)成MQTT的客戶(hù)端模塊組件進(jìn)行編寫(xiě),并采用MySql的Qt官方驅(qū)動(dòng)于數(shù)據(jù)庫(kù)進(jìn)行對(duì)接。程序直接連接云服務(wù)上的數(shù)據(jù)庫(kù),由于Qt與MySql的庫(kù)文件中沒(méi)有數(shù)據(jù)庫(kù)實(shí)時(shí)監(jiān)聽(tīng)的模塊[5],固采用“偽監(jiān)聽(tīng)”的方式實(shí)時(shí)關(guān)注數(shù)據(jù)庫(kù)的改動(dòng),通過(guò)定時(shí)器設(shè)定每秒查詢(xún)一次當(dāng)前狀態(tài)表中的關(guān)鍵字段,與舊狀態(tài)表中的記錄作比較,若比較結(jié)果不同,則在對(duì)應(yīng)主題下發(fā)送對(duì)應(yīng)的變動(dòng)指令,同時(shí)修改舊狀態(tài)表。硬件部分在執(zhí)行完相關(guān)指令后會(huì)反饋相關(guān)數(shù)據(jù),數(shù)據(jù)在被Qt程序截獲后會(huì)被轉(zhuǎn)化為對(duì)應(yīng)的操作記錄寫(xiě)入日志中保存。
若硬件端所連的用電設(shè)備被人為手動(dòng)開(kāi)關(guān),則根據(jù)硬件的設(shè)計(jì),在人為開(kāi)關(guān)后都會(huì)返回一個(gè)反饋信息,當(dāng)程序的一個(gè)特定訂閱反饋信息的客戶(hù)端收到該反饋信息后會(huì)根據(jù)回傳數(shù)據(jù)生成對(duì)應(yīng)的修改數(shù)據(jù)庫(kù)命令直接更新數(shù)據(jù)庫(kù)的對(duì)應(yīng)字段。
同時(shí)程序也有對(duì)應(yīng)的定時(shí)功能,用戶(hù)可以自主設(shè)定時(shí)間,在固定時(shí)間內(nèi)自動(dòng)發(fā)送關(guān)閉或開(kāi)啟命令,可執(zhí)行全部關(guān)閉或按類(lèi)別關(guān)閉,并且程序會(huì)自主維持一個(gè)長(zhǎng)運(yùn)行操作,會(huì)在每日12點(diǎn)整的時(shí)候作重啟動(dòng)作,將所有客戶(hù)端重置后重新連接,達(dá)到message編號(hào)歸零的操作,如圖3所示。
圖3 MQTT服務(wù)器
在這里展示項(xiàng)目中的教室控制案例中的數(shù)據(jù)格式。在數(shù)據(jù)格式上采用JSON數(shù)據(jù)格式,通過(guò)協(xié)商好的鍵值對(duì),如表1所示。
表1 系統(tǒng)控制指令格式
本系統(tǒng)的硬件部分是通過(guò)STM32單片機(jī)接收MQTT的消息,然后使能繼電器,進(jìn)而控制電器開(kāi)關(guān)來(lái)實(shí)現(xiàn)的。
繼電器的工作原理是將一個(gè)簡(jiǎn)單回路的一根導(dǎo)線一分為二,導(dǎo)線一端連接繼電器公共端,另一端連接在繼電器常開(kāi)端。當(dāng)繼電器接收到使能信號(hào),繼電器的公共端和常開(kāi)端連接在一起,將電路恢復(fù)到正常狀態(tài)。
傳統(tǒng)電器開(kāi)關(guān)大多是用單刀單擲開(kāi)關(guān),配合繼電器的使用會(huì)出現(xiàn)一種狀況:用戶(hù)需要手動(dòng)控制開(kāi)關(guān),但是MQTT服務(wù)器沒(méi)有發(fā)送消息,繼電器沒(méi)有被使能,導(dǎo)致用戶(hù)無(wú)法正常使用電器。針對(duì)這種情況,本系統(tǒng)對(duì)電器開(kāi)關(guān)進(jìn)行一些改進(jìn)。
本系統(tǒng)使用單刀雙擲開(kāi)關(guān)作為繼電器和電器開(kāi)關(guān)[6],單片機(jī)引出兩條導(dǎo)線,一條導(dǎo)線連接到繼電器,為繼電器提供使能信號(hào);另一條導(dǎo)線連接在電路,作為電流檢測(cè),如圖4所示。當(dāng)電路是通路或者斷路時(shí),單片機(jī)會(huì)識(shí)別出當(dāng)前電路狀態(tài),然后反饋到MQTT服務(wù)器。用戶(hù)手動(dòng)控制開(kāi)關(guān)不受影響,同時(shí)服務(wù)器也能知道當(dāng)前電器狀態(tài)。
圖4 開(kāi)關(guān)改進(jìn)
STM32單片機(jī)是硬件結(jié)構(gòu)的核心部分,搭載LAN8720A以太網(wǎng)卡配置物理層,使用Lwip輕量IP協(xié)議配置數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層、傳輸層。當(dāng)STM32單片機(jī)連接上以太網(wǎng)之后,配置相關(guān)信息進(jìn)而連接上MQTT服務(wù)器,單片機(jī)和服務(wù)器可以相互收發(fā)消息。
STM32單片機(jī)和MQTT服務(wù)器通信時(shí)使用JSON數(shù)據(jù)格式,單片機(jī)調(diào)用cJSON庫(kù)可以對(duì)數(shù)據(jù)進(jìn)行解析和打包[7]。
在一個(gè)場(chǎng)景中并不需要所有電器設(shè)備都要入網(wǎng),只需要至少一個(gè)聯(lián)網(wǎng)設(shè)備接收MQTT服務(wù)器的消息,然后使用ZigBee自組網(wǎng)將數(shù)據(jù)轉(zhuǎn)發(fā)出去[8],也能達(dá)到控制的目的。ZigBee無(wú)線傳輸技術(shù)在物聯(lián)網(wǎng)中也是經(jīng)常使用到的技術(shù)。
本文設(shè)計(jì)的控制系統(tǒng)經(jīng)過(guò)實(shí)踐操作,利用高校中的教學(xué)樓作為實(shí)踐對(duì)象,順利通過(guò)測(cè)試。經(jīng)過(guò)測(cè)試,與傳統(tǒng)的教室控制系統(tǒng)相比,在使用服務(wù)器以及路由器的搭橋之下實(shí)現(xiàn)了根據(jù)課表時(shí)間自動(dòng)控制用電設(shè)備的開(kāi)關(guān),通過(guò)指令的方式控制教室中的用電器開(kāi)關(guān)并返回相關(guān)用電設(shè)備的用電情況,比傳統(tǒng)的系統(tǒng)更加智能,也大大降低了教室用電成本以及人力維護(hù)成本。該系統(tǒng)也可用于其他場(chǎng)景,具有一定的經(jīng)濟(jì)和社會(huì)效益。