譚俊偉,譚瑞鑫,黃紅橋,陳明
(1.冷水灘區(qū)財政局,湖南永州 425000;2.國網(wǎng)湖南電力有限公司,湖南長沙 410000)
隨著中國國產(chǎn)化芯片及操作系統(tǒng)的進一步推進,越來越多的國產(chǎn)物聯(lián)網(wǎng)設備出現(xiàn)在了當下,給未來國內物聯(lián)網(wǎng)發(fā)展帶來了無限可能。而隨著這些嵌入式設備的不斷增多,如何對其進行有效的集中化的監(jiān)控與管理成為擺在時代面前的一大難題。例如在國網(wǎng)湖南電力公司永州分公司,有許多電表計量的嵌入式設備及為無人機提供算力平臺的算力服務器需要遠程控制及維護,但因缺乏有效的監(jiān)控與管理平臺,這往往成為職工們比較頭疼的問題。這是由于現(xiàn)如今普通電腦一般使用的為Windows 操作系統(tǒng)及X86 或X64平臺,與嵌入式設備及提供算力的服務器一樣既跨越了操作系統(tǒng),亦跨越了架構體系,要直接對其核心數(shù)據(jù)進行監(jiān)控以及對其管理十分不便。因此本文探索并研究了一種較為高效的管理方式,即基于Web開發(fā)的智能化設備監(jiān)控管理平臺。該平臺前端使用多個H5新特性以及Vue框架開發(fā),界面美觀,性能優(yōu)越,交互體驗優(yōu)良。服務端采用跨平臺編程語言Golang[1]進行開發(fā),Web 接口遵循RESTFUL API 形式,性能優(yōu)越且在不同指令集的計算機上,如LoongArch(龍芯)、MIPS(龍芯)、ARM 系列(飛騰、英偉達等)、X86(Intel)等,且搭載不同的國產(chǎn)操作系統(tǒng),如:銀河麒麟、中標麒麟[2]、UOS 等均可運行。該平臺的最大優(yōu)勢是在不同操作系統(tǒng)上,僅須通過瀏覽器即可訪問到數(shù)據(jù)管理平臺,并對企業(yè)內網(wǎng)中所有Linux 類計算機設備進行監(jiān)控與管理,無須在客戶端搭建復雜的環(huán)境。將環(huán)境搭建工作交于服務端,而服務端在批量化生產(chǎn)時使用硬盤母盤便可實現(xiàn)批量化生產(chǎn)。從而客戶端無須搭建復雜的環(huán)境,從而最大程度方便用戶直接使用本平臺。即便是用戶臨時需要更換電腦進行操作,只須將已存儲的數(shù)據(jù)以文本格式導出后再在新客戶端中導入即可,大大降低了客戶端的程序依賴。
本系統(tǒng)客戶端設計核心是希望拋棄一切環(huán)境搭建,僅須使用Chrome類內核瀏覽器便能訪問到設備監(jiān)控平臺并對所有設備進行可視化的監(jiān)控及遠程管理?;诖?,本文在技術架構上應用采用B/S 架構進行開發(fā),客戶端部署在用戶瀏覽器,數(shù)據(jù)庫亦存儲在B 端中,直接使用html5新特性[3]中的localstorage 存儲到本地瀏覽器,且加入一鍵導入與導出功能。每一臺被管控的設備作為服務端,這樣一來客戶端的運行環(huán)境將不需要被搭建,而服務端在大多數(shù)情況下亦只需要搭建一次環(huán)境。軟件以及Web terminal終端服務中間件可部署在中間服務器上,供多個客戶端同時使用。本文中所有服務端應用均使用Golang語言開發(fā)、編譯,得益于Golang語言優(yōu)越的跨平臺性,編譯時便可指定平臺與指令集,可直接編譯為對應平臺、指令集的二進制文件,且無須搭建對應系統(tǒng)環(huán)境。經(jīng)測試,在部署到國產(chǎn)操作系統(tǒng)過程中,無須額外搭建環(huán)境,即可直接運行可執(zhí)行二進制程序,總架構圖如圖1所示。
圖1 總框架圖
使用Webterminal技術可實現(xiàn)網(wǎng)頁端執(zhí)行SSH,網(wǎng)頁輸入命令后通過WebSocket 技術傳輸?shù)絫erminal 服務端并通過中間服務端將對應SSH 指令轉發(fā)到對應的服務器以實現(xiàn)WebSSH以方便用戶在客戶端使用。
使用Websockify 將Linux VNC 服務端口(通常為5900 或5901)轉發(fā)到Web 開源框架noVNC 上,noVNC框架內部通過WebSocket 與VNCServer 建立通信。從而實現(xiàn)用戶在瀏覽器中即可使用VNC,大大提高了用戶使用效率。
客戶Web 端使用前后端分離開發(fā)思想,采用Vue3框架進行開發(fā),使用Element UI作為視覺設計框架,使用百度Echarts繪圖插件進行繪圖并實現(xiàn)數(shù)據(jù)儀表可視化。因服務端數(shù)據(jù)庫環(huán)境不一定可以確保搭建,因此數(shù)據(jù)持久化存儲的工作交由Web 端完成,本文研究中Web端使用H5新特性中的localstorage 技術將數(shù)據(jù)持久化存儲到瀏覽器內部。而考慮到用戶可能會定期清除瀏覽器緩存以及可能需要將這些設備交由其他同事進行后續(xù)管理等難題,設計了一套可以將數(shù)據(jù)導出的方案,具體方法是數(shù)據(jù)導出過程中使用JSON 作為標準格式導出為文本,當用戶需要再次將數(shù)據(jù)導入時,將文件上傳到Web 端后會通過JSON 解析器將數(shù)據(jù)還原并再次存儲至瀏覽器localstorage 中,其后瀏覽器自動刷新并渲染界面。
在Web 端中,為提高URL 路徑的可讀性,引入了Vue-router 插件,并使用H5 history 作為路由模式,配合Nginx偽靜態(tài)規(guī)則生效。其URL美觀且響應速度優(yōu)越。在與后端通信方面,本文研究中高度封裝了fetch庫,通過異步請求與Golang服務端進行通信。Web端架構圖如圖2所示,其中高度封裝fetch 直接與Golang服務端通過RESTFUL API約定格式進行通信,常見請求方式包括GET/POST/DELETE/PUT 等。如向被控端上傳文件通過POST 方式請求進行,使用GET 請求獲取設備當前狀態(tài)信息、內存信息等。
圖2 Web端架構圖
被控設備服務端采用跨平臺編譯型語言Golang進行開發(fā),選用Golang的主要原因在于其跨平臺性好且編譯后性能優(yōu)越,無須依賴其他運行環(huán)境,同時編譯后占用資源小,對計算平臺及嵌入式設備影響略微,同時相對于C、C++不需要將代碼移植到對應平臺再次編譯,只需要將本機編譯到對應平臺即可,極大地提升了開發(fā)效率以及降低了移植、開發(fā)成本。且Golang 擁有多個高度封裝的HTTP 庫,數(shù)據(jù)庫處理方面有多個ORM操作模型,極其適用于Web后端開發(fā)。本文研究中采用Gin 框架部署HTTP 框架服務,通過命令行參數(shù)綁定端口,出廠時可以通過寫開機啟動命令啟動程序,通過配置文件即可直接修改部署端口等信息,大大提高了程序的靈活配置性。
由于本文所研究的設備管理主要為嵌入式設備,一般都搭載類Linux系統(tǒng),如國產(chǎn)銀河麒麟、中標麒麟、UOS等。因此被控設備端中,Golang 開發(fā)的程序通過Linux系統(tǒng)調用獲取諸如CPU、內存、磁盤等信息,同時通過Gin框架監(jiān)聽HTTP 80端口并對外暴露,將信息暴露到接口的同時監(jiān)聽開、關機等常規(guī)管理類操作。為了提高并發(fā)量,避免多個設備同時請求造成資源占用率過高,所有設備信息相關數(shù)據(jù)并不是請求接口時進行更新,而是創(chuàng)建一個線程在一個周期事件內進行更新,如本文中所研究的應用周期更新時間為10秒,當訪問接口時,僅需要讀取存在內存中的信息返回即可。為了保證數(shù)據(jù)的一致性,本文采用線程鎖保證數(shù)據(jù)可以同步被修改,保證不會出現(xiàn)上一次獲取的CPU數(shù)據(jù)可能與本次獲取的內存信息同時返回給Web端。
嵌入式服務端具體工作流程圖如圖3所示。
圖3 嵌入式服務端流程圖
代理VNC[4]程序基于開源方案——noVNC進行搭建,noVNC項目的目的是取消VNC client,直接通過瀏覽器訪問VNC。其工作原理是通過由Websockify 來代理訪問(基于Websocket)VNC server來達到client的Web 化,而Web 端與Websockify 的通信則采用Web-Socket 來實現(xiàn)。VNC server 配置仍需保留,并沒有修改。大多數(shù)國產(chǎn)化操作系統(tǒng)已包含VNC服務端,如果沒有VNC 客戶端可以在母盤中安裝一個類似于x11vnc 的工具便可實現(xiàn)遠程化管理。代理VNC 處理的始終是TCP流量,因此只需在被控服務端額外運行一個Websockify即可。
但noVNC 原版方案提供的Websockify 由nodejs或Python 進行開發(fā),均為解釋型語言,需要搭建對應的編程語言環(huán)境才能得以運行,而由于直接需要對系統(tǒng)本機進行控制,因此不適用于采用docker解決該問題,那么如需搭建環(huán)境則要安裝Python 或者nodejs 的開發(fā)環(huán)境。若被控端不能連接互聯(lián)網(wǎng),由于nodejs 與Python離線安裝庫非常煩瑣,因此這一流程將十分不便利,不利于程序的快速部署,因此與本文基本設計理念相悖。由此,本文研究并開發(fā)了一套基于Golang版本的Websockify。該版本W(wǎng)ebsockify的特點是可靜態(tài)編譯為Windows、Mac 以及Linux 版本,并且支持多種CPU 架構的運行,以便于程序的部署,而無須額外搭建對應編程語言的環(huán)境,大大減少工作量并減少程序的不適應性。同時,Golang 支持多線程,從而使程序可以同時支持收與發(fā),且語法簡單,性能優(yōu)良。本文所研究基于Golang 開發(fā)的跨平臺型Websockify 核心代碼如圖4所示。
圖4 Websockify核心代碼
Web terminal的作用是用戶使用Web端即可直接連接到被控設備端SSH[5],主要用于通過SSH管理被控端??蛻舳送ㄟ^采用Vue 框架進行單頁開發(fā)。使用Websocket 將用戶在Web 交互端輸入指令發(fā)送至Golang開發(fā)的SSH服務端,其服務端既部署于中間服務端抑或是目標機器(需Linux內核類操作系統(tǒng)),至于部署在何處取決于內部網(wǎng)絡架構的規(guī)劃。Web terminal服務端程序獲取到Web用戶傳輸來的SSH指令后通過系統(tǒng)調用的方式轉發(fā)至服務端所部署的服務器終端,終端使用SSH 與目標主機相連通。連接成功后通過WebSocket實時監(jiān)聽客戶端輸入信息與被控端反饋信息(通過服務端SSH轉發(fā)),并實時進行轉發(fā)操作和獲取SSH運行結果。最后其結果再通過WebSocket將數(shù)據(jù)信息返回至Web客戶端。從而實現(xiàn)客戶端無須依賴本地環(huán)境便可連接被控端的終端服務,并可實現(xiàn)操作。Web terminal數(shù)據(jù)流轉示意圖如圖5所示。
圖5 Web terminal數(shù)據(jù)流轉圖
在Web 客戶端界面,如果已添加過主機,多臺主機的數(shù)據(jù)匯總報表會展示在儀表中心,該界面可通過圖表的方式直觀化地看見之前所有已添加的主機。該圖表系統(tǒng)會在后臺依次請求被添加的計算機從而統(tǒng)計所有在線主機的CPU、內存等信息,同時求出總的CPU使用率、內存使用率信息并通過計算后最終繪制成如圖6所示的圖表,直觀且較為美觀。
圖6 儀表中心界面
客戶端網(wǎng)頁對每一個服務器的單獨添加、刪除以及單獨控制方式如圖7所示。同時該界面可將所有服務器的連接數(shù)據(jù)進行導出與導入,其導出流程如圖8所示,導入流程如圖9所示。導入過程中需要上傳之前導出的數(shù)據(jù),上傳磁盤上的數(shù)據(jù)后前端JS將會將數(shù)據(jù)從文本格式解析為JSON 格式,從而提取其中數(shù)組并覆蓋存儲至localstorage,因此會刪除之前已有數(shù)據(jù)。導出過程則會將localstorage 中的數(shù)據(jù)以JSON 格式轉化為文本格式,并以字符串的形式寫入DOM 文本標簽中,最后通過js觸發(fā)瀏覽器下載文本文件至用戶本地磁盤。
圖7 添加、刪除被控端界面
圖8 導出流程
圖9 導入剛剛導出的list.txt
在被控服務端安裝VNCserver 后(本文中VNC server 使用x11vnc 作為演示),通過noVNC Web 端連接到被控服務端如圖10所示(基于國產(chǎn)優(yōu)麒麟操作系統(tǒng)),可流暢操作所有界面,且沒有出現(xiàn)卡頓現(xiàn)象。并且在客戶端無須安裝任何額外環(huán)境,用戶無須搭建額外的管理環(huán)境便可直接對所有嵌入式設備進行管理。不過值得注意的是,在同一時間段內,僅允許一個用戶連接到VNC,這樣的目的是保證不被多個用戶同時操作導致出現(xiàn)不同步的情況。連接密碼為VNC server所設定的密碼,而非被控端自身賬號密碼。x11vnc 初始密碼默認為空,因此無須輸入密碼,但是為了保證安全性,建議被控設備出廠時統(tǒng)一設定密碼。
圖10 通過noVNC連接到被控服務端遠程桌面
被控設備端僅需一條命令即可啟動:./可執(zhí)行文件名,如圖11所示,通過編譯為二進制方式執(zhí)行,啟動方式極其簡潔且不需安裝額外環(huán)境。本圖中啟動過程通過命令行參數(shù)指定了監(jiān)聽的端口為80,由于80端口的特殊性,需要提權到root 執(zhí)行程序以避免執(zhí)行權限不足的情況。
圖11 被控設備端的啟動
考慮到被控設備端一般為嵌入式設備批量部署并應用,因此可將本程序放置母盤指定位置,并在/etc/rc.d/rc.local 路徑將程序與命令行參數(shù)寫入從而實現(xiàn)被控服務端程序的自啟動流程,同時可通過系統(tǒng)磁盤母盤將應用與開機啟動配置文件批量寫入與部署。
總的來說,本文設計的智能化設備監(jiān)控管理平臺通過使用母盤在嵌入式設備出廠時將程序刷入服務端的做法,減輕了服務端部署環(huán)境的工作量,同時客戶端也僅需使用瀏覽器即可監(jiān)控與管理被控嵌入式設備。得益于瀏覽器H5的local storage特性將數(shù)據(jù)可持久化存儲至用戶設備中,并提供下載成文件的功能方便用戶導入與導出,大大提高了用戶管理的便利性與管理效率。同時通過Golang 作為服務端遠程轉發(fā)來自瀏覽器與其建立的WebSocket 中的SSH 信息,可在瀏覽器中直接使用SSH 命令行。除此之外,通過noVNC框架思想實現(xiàn)了在瀏覽器中可通過vnc遠程控制被控端設備,極大地提高了客戶端對被控端的管理能力??偟膩碚f該系統(tǒng)的設計與應用為未來嵌入式設備的批量監(jiān)控與管理提供了一個優(yōu)秀的思路與開發(fā)設計理念。