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