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