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