孫志堯 趙俊 甘雨航
關(guān)鍵詞:微服務(wù);物聯(lián)網(wǎng);控制系統(tǒng);WebSocket 協(xié)議;前后端分離
中圖分類號(hào):TP311 文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2022)36-0088-04
1 引言
每年都會(huì)盛大舉辦的彩燈燈會(huì)作為我國傳統(tǒng)文化的杰出表現(xiàn)方式,也是非物質(zhì)文化遺產(chǎn)之一,并對(duì)我國的文化傳播產(chǎn)生深遠(yuǎn)的影響[1]。傳統(tǒng)的彩燈燈組采用獨(dú)立單片機(jī)的控制方式,燈組之間沒有協(xié)同控制能力。并且,彩燈控制器都采取線下的操控機(jī)制,需要維護(hù)人員到現(xiàn)場進(jìn)行設(shè)備操控及維護(hù)。在舉辦大型的彩燈展會(huì)時(shí),需要大量的設(shè)備維護(hù)人員,耗費(fèi)了大量的人力資源成本。并且,燈組之間沒有直接的協(xié)同關(guān)聯(lián),在進(jìn)行配合表演的時(shí)候,存在一定的操作難度。
物聯(lián)網(wǎng)是指通過傳感、識(shí)別、定位等新一代信息技術(shù)構(gòu)建的物、人、物之間的信息互通互聯(lián),從而實(shí)現(xiàn)智能化感知、監(jiān)控等全方面一體化管理[2]。
利用物聯(lián)網(wǎng)技術(shù),將各個(gè)彩燈設(shè)備之間建立控制網(wǎng)絡(luò),優(yōu)化控制方法,提高設(shè)備的管理效率,也能大幅降低人工成本。同時(shí),在設(shè)備的故障監(jiān)測及診斷方面,高速的網(wǎng)絡(luò)傳輸能力也能更及時(shí)且全面地實(shí)現(xiàn)多設(shè)備的總體狀態(tài)監(jiān)測,最大限度地保證設(shè)備運(yùn)行的穩(wěn)定性和安全性。
2 系統(tǒng)技術(shù)介紹
系統(tǒng)在前后端分離的架構(gòu)基礎(chǔ)上,使用微服務(wù)的后臺(tái)架構(gòu)模式進(jìn)行系統(tǒng)搭建。前端采用Vue.js框架作為基礎(chǔ)框架,加入bootstrap模板實(shí)現(xiàn)頁面的樣式優(yōu)化和接口通信。同時(shí),利用H5的websocket協(xié)議,實(shí)現(xiàn)界面數(shù)據(jù)的實(shí)時(shí)更新。后端采用Go語言的微服務(wù)框架Go-Zero進(jìn)行開發(fā),與控制器之間采用TCP協(xié)議進(jìn)行數(shù)據(jù)通信。數(shù)據(jù)庫采用關(guān)系型數(shù)據(jù)庫MySQL,ORM框架采用Gorm框架實(shí)現(xiàn)數(shù)據(jù)庫的相關(guān)操作。
2.1 前端開發(fā)技術(shù)
Vue.js是一個(gè)國內(nèi)很流行的前端開發(fā)框架,框架將原本耦合的網(wǎng)頁構(gòu)成部分,通過組件的形式進(jìn)行拆分,實(shí)現(xiàn)網(wǎng)頁的結(jié)構(gòu)解耦。同時(shí),頁面中重復(fù)性的功能部分也不再需要重復(fù)開發(fā),可以直接沿用已有組件進(jìn)行功能實(shí)現(xiàn)[3-4]。
Bootstrap模板為前端最為流行的樣式設(shè)計(jì)模板之一,提供了豐富的樣式組件和功能組件,極大地減輕了界面美化的工作難度。同時(shí),模板也提供了詳盡的開發(fā)文檔,讓開發(fā)人員能快速地上手開發(fā),極大地提高了開發(fā)人員的開發(fā)效率。
WebSocket通信協(xié)議是一種基于TCP,可以實(shí)現(xiàn)雙向推送數(shù)據(jù)的全雙工通信協(xié)議[5]。在傳統(tǒng)的實(shí)時(shí)通信策略中,網(wǎng)站大多采用Ajax輪詢方式實(shí)現(xiàn)數(shù)據(jù)的實(shí)時(shí)推送。然而,由于HTTP請(qǐng)求中可能會(huì)包含大量的無效信息,占用了大量的通信資源。為此,在HTML5 中定義了WebSocket通信協(xié)議。該協(xié)議支持雙邊的數(shù)據(jù)推送,實(shí)現(xiàn)了服務(wù)器主動(dòng)向界面端推送數(shù)據(jù)的功能。
2.2 后端開發(fā)技術(shù)
Go語言是Google開發(fā)的一種靜態(tài)強(qiáng)類型、編譯型、并發(fā)型,并具有垃圾回收功能的編程語言。Go語言的高并發(fā)以及部署簡單的特性能夠較為完美地契合微服務(wù)架構(gòu)的開發(fā)模式,可以實(shí)現(xiàn)快速開發(fā),并且能夠承受系統(tǒng)在接收大量訪問時(shí)的承壓能力。
傳統(tǒng)的單體式架構(gòu)將所有的功能模塊嵌合到同一個(gè)服務(wù)系統(tǒng)中,當(dāng)某個(gè)模塊發(fā)生故障或進(jìn)行升級(jí)時(shí),整個(gè)系統(tǒng)都需要下線并重新開發(fā),各個(gè)功能的實(shí)現(xiàn)程序之間的依賴性強(qiáng),耦合度高,而且具有擴(kuò)展局限性[6-7]。微服務(wù)架構(gòu)的設(shè)計(jì)理念是將傳統(tǒng)的單一應(yīng)用程序轉(zhuǎn)變成為一套小型的服務(wù)組合,根據(jù)業(yè)務(wù)邏輯將單體架構(gòu)拆分成多個(gè)服務(wù),每一個(gè)微小的服務(wù)都具有單一職責(zé)且可以單獨(dú)部署和運(yùn)行[8]。
Go-Zero框架是一款國內(nèi)開發(fā)的微服務(wù)框架,集成了各類工程實(shí)踐中的Web和RPC框架,在支持傳統(tǒng)的HTTP API 接口的基礎(chǔ)上,也支持模塊間通信的RPC接口。通過彈性設(shè)計(jì)保障了大并發(fā)服務(wù)端的穩(wěn)定性,并且內(nèi)建服務(wù)發(fā)現(xiàn)和負(fù)載均衡。同時(shí),它支持中間件,方便進(jìn)行系統(tǒng)的功能擴(kuò)展和優(yōu)化。
2.3 云服務(wù)器部署技術(shù)
Docker是一款開源的容器引擎,開發(fā)人員可以將開發(fā)程序打包為一個(gè)鏡像文件或容器,從而實(shí)現(xiàn)系統(tǒng)跨系統(tǒng)的部署能力,簡化部署流程[9]。同時(shí),Docker容器之間相互獨(dú)立,容器之間的運(yùn)行狀態(tài)不會(huì)相互影響,保證了程序運(yùn)行的穩(wěn)定性。
3 系統(tǒng)關(guān)鍵功能實(shí)現(xiàn)
3.1 用戶權(quán)限管理
系統(tǒng)在人員管理方面,采用了權(quán)限管理機(jī)制,即根據(jù)用戶的權(quán)限等級(jí),給予對(duì)應(yīng)的系統(tǒng)操作功能。權(quán)限管理機(jī)制能使系統(tǒng)在進(jìn)行功能展示和設(shè)備管理與維護(hù)保障方面提供更加安全的操作機(jī)制,防止誤操作及惡意操作導(dǎo)致彩燈燈組設(shè)備的損壞,增強(qiáng)系統(tǒng)的操作安全性和穩(wěn)定性。
利用Vue.js提供的路由守衛(wèi),在頁面跳轉(zhuǎn)時(shí),會(huì)由路由守衛(wèi)進(jìn)行用戶登錄狀態(tài)的判定,并根據(jù)賬號(hào)的權(quán)限等級(jí),對(duì)界面中的操作按鈕組等功能模塊進(jìn)行對(duì)應(yīng)的調(diào)整,實(shí)現(xiàn)基本的權(quán)限管理功能,前端驗(yàn)證流程如圖1所示。
同時(shí),為了進(jìn)一步增強(qiáng)系統(tǒng)的安全性,在后端加入了JWT驗(yàn)證機(jī)制。用戶在登錄系統(tǒng)時(shí),后端會(huì)生成專屬的用戶驗(yàn)證碼。當(dāng)后端接收到接口請(qǐng)求時(shí),會(huì)對(duì)該驗(yàn)證碼進(jìn)行核對(duì)。同時(shí),為了保證驗(yàn)證碼的安全性,對(duì)該碼的有效時(shí)長進(jìn)行了配置。當(dāng)用戶退出登錄后,驗(yàn)證碼也將進(jìn)行更新,防止盜用。
3.2 彩燈狀態(tài)監(jiān)測
為了實(shí)現(xiàn)對(duì)于彩燈運(yùn)行狀態(tài)的實(shí)時(shí)監(jiān)測,保證設(shè)備的正常運(yùn)行及發(fā)生故障時(shí)的及時(shí)處理,控制系統(tǒng)會(huì)與彩燈控制器之間建立的TCP鏈接,實(shí)時(shí)地接收控制器發(fā)出的彩燈監(jiān)測數(shù)據(jù)包。數(shù)據(jù)包內(nèi)容包括彩燈的運(yùn)行狀態(tài),包括彩燈的開關(guān)狀態(tài),當(dāng)前所處的運(yùn)行模式及設(shè)備本身的運(yùn)行狀態(tài),傳輸流程如圖2所示。
控制系統(tǒng)接收到彩燈數(shù)據(jù)包后,會(huì)對(duì)數(shù)據(jù)包中的數(shù)據(jù)進(jìn)行解析。為了能夠?qū)崟r(shí)準(zhǔn)確地將數(shù)據(jù)包的解析結(jié)果展示到系統(tǒng)前端的界面上,后端服務(wù)器采用WebSocket協(xié)議進(jìn)行該部分的數(shù)據(jù)傳輸,將數(shù)據(jù)主動(dòng)推送到前端界面。界面會(huì)根據(jù)接收到的數(shù)據(jù),對(duì)展示的內(nèi)容進(jìn)行調(diào)整,如彩燈的亮滅狀態(tài),電流大小等,以保證數(shù)據(jù)的可視化程度和準(zhǔn)確性。
后端服務(wù)器會(huì)在系統(tǒng)的數(shù)據(jù)庫中查找對(duì)應(yīng)設(shè)備的運(yùn)行狀態(tài)參數(shù),與解析結(jié)果進(jìn)行對(duì)比。狀態(tài)參數(shù)與可浮動(dòng)范圍將作為評(píng)判設(shè)備運(yùn)行狀態(tài)的判斷指標(biāo),當(dāng)彩燈數(shù)據(jù)包中的實(shí)時(shí)狀態(tài)參數(shù)偏離正常參數(shù)時(shí),系統(tǒng)會(huì)提示管理員及時(shí)查看,并根據(jù)偏離的范圍大小,進(jìn)一步對(duì)設(shè)備發(fā)出控制指令,及時(shí)關(guān)閉設(shè)備,防止設(shè)備遭受更加嚴(yán)重的損害,處理流程圖如圖3所示。
為了提高對(duì)于設(shè)備故障原因的判斷準(zhǔn)確度,為維護(hù)人員提供更加有效的維修建議,系統(tǒng)為維護(hù)人員開設(shè)了故障原因及維修方法上傳的通道。在原有的設(shè)備診斷基礎(chǔ)上,結(jié)合維修人員的維護(hù)經(jīng)驗(yàn),進(jìn)一步完善系統(tǒng)的故障診斷準(zhǔn)確度。
3.3 彩燈控制
為了實(shí)現(xiàn)控制系統(tǒng)對(duì)多個(gè)彩燈設(shè)備的識(shí)別與控制,在進(jìn)行實(shí)際控制前,需要將設(shè)備的基本信息上傳至系統(tǒng)的設(shè)備管理數(shù)據(jù)庫中。數(shù)據(jù)庫會(huì)對(duì)設(shè)備的基本信息進(jìn)行存儲(chǔ),包括設(shè)備獨(dú)立編號(hào),生產(chǎn)廠家,正常運(yùn)行下的各類參數(shù),設(shè)備的控制協(xié)議。同時(shí),給設(shè)備分配對(duì)應(yīng)的維護(hù)人員,便于設(shè)備維護(hù)情況的回訪。利用表間的外鍵關(guān)系,將設(shè)備的基本信息與存儲(chǔ)的控制協(xié)議建立關(guān)聯(lián),數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)如圖4所示。
控制協(xié)議的由系統(tǒng)提供基礎(chǔ)的控制指令,包括開關(guān),亮度及持續(xù)時(shí)間。同時(shí),系統(tǒng)支持拓展控制指令,以滿足不同設(shè)備的控制需求。
控制系統(tǒng)利用與彩燈控制器建立的TCP鏈接,對(duì)彩燈設(shè)備進(jìn)行控制。由于TCP協(xié)議通信存在丟包和粘包問題,系統(tǒng)采用格式數(shù)據(jù)方法中的組包法[10],在數(shù)據(jù)包的報(bào)文頭中加入描述該數(shù)據(jù)包的數(shù)據(jù)信息。利用固定的格式發(fā)送數(shù)據(jù)包,解決此類問題,數(shù)據(jù)報(bào)文頭格式如表1所示。
在系統(tǒng)后端接收到有關(guān)彩燈控制的指令時(shí),后臺(tái)將根據(jù)彩燈的設(shè)備編號(hào)查詢對(duì)應(yīng)的控制協(xié)議,然后解析系統(tǒng)發(fā)來的控制指令,將指令內(nèi)容轉(zhuǎn)換為控制協(xié)議中的對(duì)應(yīng)內(nèi)容,下發(fā)給控制彩燈燈組的下位機(jī)。
下位機(jī)接收到控制指令,操作彩燈完成對(duì)應(yīng)的動(dòng)作。在完成指令發(fā)送后,燈組設(shè)備會(huì)將指令的執(zhí)行情況,通過數(shù)據(jù)包反饋給系統(tǒng)后端。后端服務(wù)器將根據(jù)接收到的數(shù)據(jù)內(nèi)容,將執(zhí)行結(jié)果展示到前端頁面,同時(shí)將本次的操作保存到設(shè)備操作日志當(dāng)中,流程圖如圖5所示。
3.4 多彩燈協(xié)同控制
利用單個(gè)彩燈的控制協(xié)議,系統(tǒng)提供了多設(shè)備協(xié)同控制的基本控制模式,包括多燈同亮、走馬燈、流水燈、呼吸燈四種模式。通過合理地將各個(gè)設(shè)備進(jìn)行排序,實(shí)現(xiàn)多設(shè)備按照設(shè)定的順序執(zhí)行多燈的協(xié)同控制。同時(shí),系統(tǒng)支持在線配置,可在系統(tǒng)界面進(jìn)行多燈控制的內(nèi)容配置,包括順序、亮度、持續(xù)時(shí)間等。
系統(tǒng)后端會(huì)解析接收到的數(shù)據(jù)包,從中得到彩燈的模式、數(shù)量、控制順序及亮度等信息。由于是同一個(gè)數(shù)據(jù)包發(fā)來的,所以燈組中各個(gè)彩燈設(shè)備的亮度及持續(xù)時(shí)間保持一致,控制流程如圖6所示。
3.5 新設(shè)備接入拓展
系統(tǒng)具有很高的可擴(kuò)展性,支持不同類型的彩燈燈組接入。為此,系統(tǒng)提供了上傳控制協(xié)議及彩燈設(shè)備信息的功能。通過上傳設(shè)備信息和對(duì)應(yīng)的控制協(xié)議,即可實(shí)現(xiàn)新設(shè)備的接入。系統(tǒng)將指定控制協(xié)議的書寫格式,并支持在線編輯和文件上傳兩種方式來實(shí)現(xiàn)控制協(xié)議的導(dǎo)入。
4 結(jié)束語
本文結(jié)合物聯(lián)網(wǎng)技術(shù),基于微服務(wù)架構(gòu),設(shè)計(jì)實(shí)現(xiàn)了在此架構(gòu)下的新型彩燈控制系統(tǒng)。在傳統(tǒng)的物聯(lián)網(wǎng)控制系統(tǒng)的基礎(chǔ)上,增加了支持新型設(shè)備接入的拓展功能,為系統(tǒng)嵌入新型設(shè)備提供了極高的便利性。同時(shí),在設(shè)備維護(hù)方面,也實(shí)現(xiàn)了對(duì)于多設(shè)備的全局性監(jiān)測,減少了設(shè)備的維護(hù)成本。
此外,微服務(wù)的系統(tǒng)架構(gòu)能夠極大地提高系統(tǒng)的穩(wěn)定性和安全性。當(dāng)系統(tǒng)中的某個(gè)模塊發(fā)生故障時(shí),不會(huì)影響其他模塊的運(yùn)行狀態(tài)。對(duì)于系統(tǒng)故障的排查,只需排查指定模塊即可,提高了修復(fù)效率。