肖和鋒,李文華,雷佳千,詹煒
(長江大學(xué) 計算機(jī)科學(xué)學(xué)院,湖北 荊州 434000)
隨著物聯(lián)網(wǎng)技術(shù)的不斷發(fā)展和相關(guān)產(chǎn)業(yè)的不斷成熟,人們對物聯(lián)網(wǎng)設(shè)備的實時監(jiān)測的需求與日俱增[1]。長江上下游的地勢起伏變化是比較大的,一般來說,船道的彎、窄、淺、險,導(dǎo)致航行困難,又因較多礁石分布在其中,所以安全航行對航標(biāo)有著較高的依賴性[2]。航標(biāo)是船舶的眼睛,航標(biāo)的技術(shù)狀態(tài)直接關(guān)系到船舶的航行安全,所以航標(biāo)的技術(shù)狀態(tài)牽系航道上每一艘船舶的安全[3]。有效監(jiān)控航標(biāo)的實時狀態(tài),對船舶的安全通行至關(guān)重要。在航道交通業(yè)中應(yīng)用物聯(lián)網(wǎng)技術(shù)是實現(xiàn)水上交通業(yè)數(shù)字化和智能化的重要手段,也是未來的發(fā)展趨勢[4]。要想更好地管理物聯(lián)網(wǎng)設(shè)備,勢必要打造一個健全的物聯(lián)網(wǎng)系統(tǒng),于是基于Web開發(fā)物聯(lián)網(wǎng)應(yīng)用系統(tǒng)的現(xiàn)實需求,以航標(biāo)遙測遙控系統(tǒng)為例介紹物聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)的框架和方法。通用的物聯(lián)網(wǎng)系統(tǒng)由三部分構(gòu)成,感知層、網(wǎng)絡(luò)層和應(yīng)用層。本系統(tǒng)的感知層:為了實時監(jiān)控航標(biāo)燈的狀態(tài),給航標(biāo)安置有RTU 終端設(shè)備,采用自主可控的北斗定位技術(shù)實時定位航標(biāo)位置;網(wǎng)絡(luò)層:使用Go 語言實現(xiàn)自主通信協(xié)議的通信服務(wù);應(yīng)用層:采用Go、Gin 等技術(shù)作為后端API 服務(wù),采用Vue.js、Element-plus 等技術(shù)設(shè)計了前端,可通過Web 界面實時監(jiān)測航標(biāo)的實時狀態(tài)和對歷史狀態(tài)進(jìn)行查詢、展示和管理,并支持?jǐn)?shù)據(jù)的下載和航標(biāo)報警及維護(hù)。系統(tǒng)編碼摒棄了集中式代碼復(fù)制粘貼式管理,而是采用git分布式代碼管理工具和CODING DevOps 代碼管理平臺管理代碼。本系統(tǒng)和大多數(shù)前后端分離系統(tǒng)不同的是,采用Go語言輕量化實現(xiàn)多平臺支持,實現(xiàn)了真正的跨平臺,而非Java語言借助龐大的虛擬機(jī)。
航標(biāo)遙測遙控系統(tǒng)是依靠瀏覽器展現(xiàn)整個系統(tǒng),數(shù)據(jù)由后端API服務(wù)提供支持,界面與通信服務(wù)實時保持通信,實時監(jiān)控航標(biāo)狀態(tài)。為滿足不同角色的航道管理部門人員對系統(tǒng)的使用,整個系統(tǒng)應(yīng)具備完整、健全的分用戶航標(biāo)監(jiān)管和維護(hù)功能。
系統(tǒng)從使用者角度來看,可分為兩大類:一類是系統(tǒng)管理員,一類是系統(tǒng)使用員:局領(lǐng)導(dǎo)、監(jiān)控值班員、航道處負(fù)責(zé)人、航道處航標(biāo)員。系統(tǒng)管理員主要是管理整個系統(tǒng)的正常使用,如部門管理、菜單管理、用戶管理、海圖管理、字典管理、參數(shù)設(shè)置、通知公告和日志管理等。
系統(tǒng)使用人員,即是航道部門工作人員。從這些系統(tǒng)使用者可以看出,每個人對系統(tǒng)的關(guān)注點都不一樣。對于局領(lǐng)導(dǎo),他主要是查看航標(biāo)系統(tǒng)監(jiān)控的大體情況,需要了解某航處或全航處的航標(biāo)的運行統(tǒng)計信息,對全局的把控。從監(jiān)控值班員來看,他需要定時動態(tài)監(jiān)測某處航標(biāo)的實時狀態(tài)信息,關(guān)注的是具體某處某個航標(biāo),根據(jù)航標(biāo)報警狀況提交航標(biāo)報警信息,交由后續(xù)的航標(biāo)員處理。航道管理處負(fù)責(zé)人是某處航道的小隊長,負(fù)責(zé)管理他所管轄的航標(biāo)并分配給具體的航標(biāo)處置人員(航道處航標(biāo)員),小隊長主要是看他管轄的航標(biāo)信息和航標(biāo)狀態(tài),以及航標(biāo)報警情況和航標(biāo)維護(hù)完成度,此外還有該航處的航標(biāo)統(tǒng)計相關(guān)數(shù)據(jù)。航標(biāo)員,主要處理航標(biāo)失常,根據(jù)系統(tǒng)上航標(biāo)報警信息去處置航標(biāo);存在航標(biāo)維護(hù)任務(wù)時,接收任務(wù)后參與現(xiàn)場維護(hù)工作,在系統(tǒng)上提交完成維護(hù)任務(wù)。
1.2.1 Go和Gin相關(guān)技術(shù)
Go 語言、Gin 框架、GORM、go-cache 和viper 等技術(shù),Go語言是一門原生支持并發(fā)操作的跨平臺的輕量級語言,常被稱為“現(xiàn)代版C 語言”[5]。Gin 是輕量級、內(nèi)存占用少、可擴(kuò)展、路由組等功能于一身的Web 框架。GORM是一個對象映射框架,支持操作對象的模式CRUD操作MySQL數(shù)據(jù)庫,以及對象關(guān)聯(lián)模式和事務(wù)等支持。go-cache 是一個輕量級的內(nèi)存緩存組件,進(jìn)程內(nèi)的緩存使用。viper是一個配置文件讀取組件,項目中使用yaml格式文件。
1.2.2 Vue和WebSocket相關(guān)技術(shù)
Vue 是一個易學(xué)易用、性能出色和適用場景豐富的Web 前端框架。Vue 結(jié)合Vue-Router、Axios、Element-plus、Pinia、Mitt、WebSocket和OL等技術(shù)構(gòu)建強(qiáng)大的前端頁面。Vue-Router 屬于Vue 生態(tài)體系中的路由組件,用于創(chuàng)建單頁面應(yīng)用。Axios 則是一個異步請求框架,用于和后端http 異步通信。Elementplus 是一個餓了么團(tuán)隊提供的UI 框架,簡潔而美觀。Pinia 是一個前端存儲組件,用于存儲應(yīng)用信息。Mitt是一個事件總線庫,用于Vue 中不同頁面之間的通信。WebSocket是一個不同于HTTP的應(yīng)用層協(xié)議,用于和通信服務(wù)實時通信。OL庫則是OpenLayers,用于地圖顯示。
航標(biāo)遙測遙控系統(tǒng)可由5 個部分組成,如圖1 所示,通信服務(wù)、Web前端服務(wù)和后端API 服務(wù),此外系統(tǒng)地有效正確運行還離不開航標(biāo)設(shè)備和數(shù)據(jù)庫。由航標(biāo)設(shè)備上的終端設(shè)備發(fā)送航標(biāo)實時狀態(tài)數(shù)據(jù)給通信服務(wù)程序,通信服務(wù)程序?qū)⒑綐?biāo)狀態(tài)實時信息寫入數(shù)據(jù)庫,并按需通知Web 前端頁面,Web 前端頁面從后端API服務(wù)中獲取航標(biāo)數(shù)據(jù)。
圖1 系統(tǒng)結(jié)構(gòu)圖
航標(biāo)遙測遙控系統(tǒng)的功能主要涉及七大模塊,如圖2所示?,F(xiàn)在簡單介紹如下:
圖2 系統(tǒng)功能結(jié)構(gòu)圖
數(shù)據(jù)大屏主要是美觀展示,以圖表展示當(dāng)前系統(tǒng)中航標(biāo)的總量、航標(biāo)工作狀態(tài)、航標(biāo)失常、航標(biāo)維護(hù)和航標(biāo)年度失常統(tǒng)計,以列表流動式展示各航道處航標(biāo)失常和航標(biāo)維護(hù)信息條目等。
動態(tài)監(jiān)測是本系統(tǒng)最為復(fù)雜的一塊,集成了其他模塊的功能。這一塊以地圖為載體顯示航道上的航標(biāo),航道上的每一處航標(biāo)都清晰可見,可以點擊查看航標(biāo)的實時狀態(tài)和航標(biāo)信息,支持定位搜索航標(biāo)等功能。
航標(biāo)管理包括四個子模塊,分別是:實時狀態(tài)、歷史狀態(tài)、航標(biāo)定義和終端列表。實時狀態(tài),可以按航標(biāo)處、航標(biāo)類型等參數(shù)搜索航標(biāo)的實時狀態(tài)信息。歷史狀態(tài),根據(jù)歷史時間范圍查看某個航標(biāo)的狀態(tài)信息。航標(biāo)定義、添加、刪除和修改航標(biāo)基本數(shù)據(jù)。終端列表,查看所有在用終端設(shè)備的情況,以及終端歷史狀況等。
航標(biāo)報警包括當(dāng)前報警、未處置報警和報警歷史三個模塊。當(dāng)前報警,由監(jiān)測人員上報報警后,方可在此處按航標(biāo)處、航標(biāo)名稱等條件搜索到各個航標(biāo)的報警情況。未處置報警,單獨成立一塊,方便查找待處理的航標(biāo),并及時對報警航標(biāo)做出處置。報警歷史,查看航標(biāo)歷史報警信息等。
航標(biāo)維護(hù)包括三個子模塊,分別是接收任務(wù)、完成任務(wù)和維護(hù)歷史。航標(biāo)員在接收任務(wù)頁面接收待維修航標(biāo)的任務(wù),待現(xiàn)場維修任務(wù)完成后,再在完成任務(wù)頁面上報任務(wù)完成情況,涉及上傳視頻或圖片等信息。航標(biāo)員可以按時間范圍查看維護(hù)歷史信息等。
分析統(tǒng)計,就是各種信息的統(tǒng)計報表輸出,包括:航標(biāo)基本信息、航標(biāo)失常、同期間航標(biāo)失常對比、航標(biāo)失常周期環(huán)比、航標(biāo)維護(hù)、同期間航標(biāo)維護(hù)對比和航標(biāo)維護(hù)周期環(huán)比等。
系統(tǒng)管理主要輔助系統(tǒng)運行的,包括部門管理、菜單管理、用戶管理、海圖管理、字典管理、參數(shù)設(shè)置、通知公告和日志管理等。
由于系統(tǒng)功能模塊較多,受篇幅限制,這里僅對部分模塊簡單描述。
如圖3所示,項目開發(fā)時,使用git初始化項目,默認(rèn)存在一個主分支(master) ,表示項目的最終產(chǎn)品。根據(jù)開發(fā)的需要,需要創(chuàng)建更多的分支。從上到下,由三部分組成:主分支、開發(fā)分支和功能分支,它們就像是三條流水線。在主分支的基礎(chǔ)上,建立出開發(fā)分支,項目開發(fā)完成后,將開發(fā)分支合并到主分支上。當(dāng)出現(xiàn)新的功能需求時,在開發(fā)分支上建立功能分支,功能分支上的功能完成后合并到開發(fā)分支,最后一起合并到主分支。
圖3 git工作流圖
如圖4 所示,用戶進(jìn)入系統(tǒng),先選擇航標(biāo)管理菜單,再選擇實時狀態(tài)子項。在此頁面,用戶可以按航標(biāo)處、航標(biāo)名稱、航標(biāo)類型為搜索條件查詢航標(biāo)實時狀態(tài)數(shù)據(jù)和導(dǎo)出航標(biāo)實時狀態(tài)數(shù)據(jù),實時狀態(tài)數(shù)據(jù)包括:航標(biāo)號、航標(biāo)名稱、航標(biāo)類型、工作狀態(tài)、燈光狀態(tài)等。此外,頁面還展示了航標(biāo)狀態(tài)統(tǒng)計信息,包括目前在用航標(biāo)總數(shù),航標(biāo)在線、通信失常、燈光失常、標(biāo)志失常、標(biāo)位失常和參數(shù)失常數(shù)量。表格中的每一行數(shù)據(jù)都支持查看航標(biāo)的明細(xì)狀態(tài)信息以及歷史航標(biāo)狀態(tài)信息,以及通過控制可以實時操控航標(biāo)。當(dāng)頁面收到來自通信服務(wù)發(fā)送的航標(biāo)狀態(tài)更新時,自動更新頁面數(shù)據(jù)。
圖4 實時狀態(tài)圖
如圖5所示,系統(tǒng)部署階段,建立了一個私有云環(huán)境,將系統(tǒng)的不同組成部分放置在這個網(wǎng)絡(luò)中的不同主機(jī)上,用戶通過開放的一個節(jié)點固定訪問系統(tǒng)內(nèi)的資源。
圖5 系統(tǒng)部署圖
本文提出了一種開發(fā)物聯(lián)網(wǎng)系統(tǒng)的解決方案,采用了Go 1.18作為后端開發(fā)語言,使用MySQL 8.0作為數(shù)據(jù)庫和Vue 3 作為前端,根據(jù)航道相關(guān)部門對航標(biāo)遙測遙控管理的實際情況,結(jié)合業(yè)務(wù)流程,確定了前后端分離的系統(tǒng)框架,對功能模塊、數(shù)據(jù)庫進(jìn)行了深入分析與研究,切實完成了系統(tǒng)設(shè)計、代碼編寫、測試和部署,使用現(xiàn)代主流的git 分布式代碼托管方式,與項目組分工完成系統(tǒng)實現(xiàn)。