陸軍 邵旭明
摘 要:突發(fā)天氣對地鐵運營會造成較大危害與財產損失。通過人工巡查天氣預警信息的方式存在效率低下問題。
為解決該問題,從實際需求出發(fā),設計了基于Node.js的天氣監(jiān)測告警系統(tǒng)。該系統(tǒng)可實時監(jiān)測關注城市的突發(fā)天氣預警信息。系統(tǒng)基于B/S微服務架構,采用Node.js全棧技術,數(shù)據(jù)庫使用Sqlite。該系統(tǒng)可顯著提升地鐵運營人員獲取突發(fā)天氣預警信息的效率,提早做好應對行動,最大程度地降低突發(fā)天氣帶給地鐵運營的損失。
關鍵詞:Nodejs;Sqlite;B/S
引言
當前,國內的地鐵建設正處于大規(guī)模發(fā)展階段,地鐵線路越來越多地采用高架與地面形式,同時氣象對地鐵的影響也是日趨顯著。氣象災害防范已是地鐵運營急需關注的問題[1]。地鐵運營公司一般由控制中心(以下簡稱OCC)接收到突發(fā)天氣預警信息后,向各個部門或中心發(fā)布突發(fā)天氣預警信息,現(xiàn)場各崗位按照突發(fā)天氣下的相關作業(yè)標準和要求執(zhí)行。目前,無錫地鐵的OCC是通過江蘇省氣象局網(wǎng)站來獲取突發(fā)天氣預警信息,這一環(huán)節(jié)需要依靠人員不斷地通過手動刷新與肉眼觀察的手段來監(jiān)測氣象局網(wǎng)站的動態(tài)信息。這樣的方式不僅效率低下,大量浪費人員的精力,而且容易發(fā)生信息遺漏的問題。為解決這個問題,本文設計了一種基于Node.js技術的天氣監(jiān)測告警系統(tǒng)的解決方案。該系統(tǒng)通過后臺以固定的時間間隔來循環(huán)讀取氣象局網(wǎng)站指定地址的信息,并將信息過濾,只留下有價值的關注城市與關注時間的突發(fā)天氣預警信息。系統(tǒng)將突發(fā)天氣預警信息寫入數(shù)據(jù)庫,同時瀏覽器自動打開并指向天氣監(jiān)測告警系統(tǒng),天氣監(jiān)測告警系統(tǒng)的前端界面發(fā)出語音圖文提示,提醒系統(tǒng)用戶及時關注突發(fā)天氣預警信息。
1 系統(tǒng)架構
系統(tǒng)架構采用當下流行的B/S架構與Node.js全棧技術。用戶通過使用Webkit為核心的瀏覽器使用軟件系統(tǒng)。同時采用微服務架構的理念,根據(jù)實際需求,將業(yè)務劃分為獨立數(shù)據(jù)共享型的自治服務,可以融合不同種類與不同時期的技術。B/S架構相對于C/S架構的優(yōu)勢是不需要對所有客戶端單獨進行部署與升級,它的部署與升級都集中在服務端。B/S架構可顯著降低系統(tǒng)維護的人力與時間成本。
2 相關技術
2.1 框架技術Node.js
Node.js是一個基于 Chrome V8 引擎的 JavaScript 運行環(huán)境。Node.js使用了一個事件驅動、非阻塞式 I/O 的模型,使其輕量又高效。Node.js的包管理器 npm,是全球最大的開源庫生態(tài)系統(tǒng)[1]。
2.2數(shù)據(jù)庫技術Sqlite
SQLite 是輕型的嵌入式數(shù)據(jù)庫。它是一款自給自足的、無服務器的、零配置的、事務性的SQL數(shù)據(jù)庫引擎。它的優(yōu)勢是資源占用少、性能良好和零管理成本。目前SQLite是在世界上最廣泛部署的SQL數(shù)據(jù)庫引擎 [4]。
2.3響應式Web設計Bootstrap
Bootstrap由Twitter的設計師Mark Otto和Jacob Thornton合作開發(fā),是目前最流行的前端框架之一。Bootstrap是基于 HTML、CSS、JavaScript設計,簡潔靈活的特點可以使 Web開發(fā)更加快捷[4]。
3 系統(tǒng)設計
3.1 系統(tǒng)流程設計
預警信息可分為三類,正在預警中數(shù)目,有效預警與已解除預警。正在預警中數(shù)目代表有效預警的實時數(shù)目。有效預警是預警記錄的實時清單,清單中的預警記錄處于有效狀態(tài)。一旦預警無效,則從有效預警的清單中撤出,并放入已解除預警的清單。已解除預警是已解除狀態(tài)預警記錄的清單。
在Node.js系統(tǒng)服務端啟動后,首先執(zhí)行初始模塊。初始模塊會第一次讀取正在預警中數(shù)目、有效預警與已解除預警這三類信息。接下來執(zhí)行循環(huán)模塊,循環(huán)模塊會以固定的周期讀取正在預警中數(shù)目。如果該數(shù)目沒有變化,則不做任何操作。如果該數(shù)目發(fā)生變化,則讀取有效預警與已解除預警的清單,然后從清單中對城市與時間進行過濾,將過濾后的信息寫入數(shù)據(jù)庫。同時執(zhí)行Http模塊,瀏覽器將自動指向天氣監(jiān)測告警系統(tǒng)的前端頁面。前端頁面通過語音圖文來提醒系統(tǒng)用戶關注突發(fā)天氣預警信息。
3.2 系統(tǒng)功能模塊
系統(tǒng)功能模塊可分為三個,初始模塊、循環(huán)模塊、Http模塊、日志模塊與數(shù)據(jù)庫模塊。系統(tǒng)功能的模塊結構圖如圖1所示。
圖1 模塊結構圖
3.2.1 初始模塊
初始模塊在系統(tǒng)服務端啟動后執(zhí)行一次。初始模塊使用cheerio類庫加載指定三個URL地址的HTML字符串,URL地址分別指向正在預警中數(shù)目、有效預警與已解除預警的頁面。其中正在預警中數(shù)目可直接獲取。有效預警需設定關注城市,只獲取關注城市的預警信息。已解除預警需設定關注城市與當下時刻,只獲取關注城市與當下時刻的預警信息,其中當下時刻精確到分鐘。初始模塊取得這三類預警信息后將其存放至全局變量,以供循環(huán)模塊比對。同時通過日志模塊將信息存儲到日志中。
3.2.2 循環(huán)模塊
初始模塊執(zhí)行完畢后,開始執(zhí)行循環(huán)模塊。循環(huán)模塊以固定的周期間隔讀取正在預警中數(shù)目,同時將當前讀取的數(shù)目與上一次讀取的數(shù)目進行比對,判斷是否一致。如果數(shù)目無變化,則只通過日志模塊寫入日志,不做其他任何操作。如果前后數(shù)目不一致,則讀取有效預警與已解除預警的HTML字符串。根據(jù)設定的關注城市與當下時刻的條件進行過濾,過濾后的信息是我們想要得到的預警信息。通過日志模塊與數(shù)據(jù)庫模塊將其分別寫入日志與數(shù)據(jù)庫Sqlite。數(shù)目不一致的情況也將觸發(fā)Http模塊。
3.2.3 Http模塊
Http模塊使用RESTful的架構風格,通過不同的GET或者POST請求方法,將請求引導至對應的頁面并渲染其內容。如果請求是index,則引導并渲染頁面index.html。如果請求是warnlist,則引導并渲染頁面warnlist.html。Http模塊的前端使用Bootstrap技術,其主要包含兩種功能,控制面板與預警記錄??刂泼姘灏俗钚乱淮晤A警的時間、數(shù)量、語音、有效預警與已解除預警的清單。預警記錄包含了所有預警記錄,并可以快捷搜索。Http模塊可以通過兩種方式觸發(fā)執(zhí)行。這兩種方式是循環(huán)模塊判斷數(shù)目不一致與用戶通過瀏覽器主動訪問Http模塊。
3.2.4 日志模塊
日志模塊將預警記錄信息寫入日志中,日志文件以擴展名log結尾,一個月對應一個日志文件,下一個月的月初建立并使用新的日志文件。日志文件記錄了歷史信息,可方便追溯過往發(fā)生的信息,也可以同數(shù)據(jù)庫互為參考依據(jù)。一般情況下日志模塊被初始模塊與循環(huán)模塊所調用。
3.2.5 數(shù)據(jù)庫模塊
數(shù)據(jù)庫模塊將預警信息寫入輕型嵌入式數(shù)據(jù)庫Sqlite。預警信息的字段主要是時間、數(shù)量、有效預警與已解除預警。由于有效預警與已解除預警所包含的信息可能一次包含兩個城市或兩個城市以上的預警信息,所以這兩個字段最適合使用數(shù)據(jù)庫的JSON技術。使用Sqlite的函數(shù)方法JSON_OBJECT將鍵值字符串轉換JSON對象,使用Sqlite的函數(shù)方法JSON_ARRAY將多個JSON對象轉換為JSON數(shù)組。一般情況下數(shù)據(jù)庫模塊被循環(huán)模塊所調用。
4 結論
突發(fā)天氣諸如臺風、暴雨、雷電、大霧、冰雹等都可能會對地鐵運營的設備與人員造成危害。通過天氣監(jiān)測告警系統(tǒng),可實現(xiàn)全自動地監(jiān)測地鐵運營公司所在城市的突發(fā)天氣預警信息。該系統(tǒng)幫助地鐵運營人員更早地獲取預警信息,更快地做出應對突發(fā)天氣的方案與行動。自動化的監(jiān)測系統(tǒng)不僅顯著提升地鐵運營人員的獲取突發(fā)天氣預警信息的效率,而且可以最大程度地降低突發(fā)天氣對地鐵運營產生的損失。同時它也可以成為當下地鐵智慧運營理念的有機組成部分。
參考文獻
[1]李毅雄. 香港地鐵氣象災害防范技術[J]. 中國安全生產科學技術, 2007, 3(2).
[2]Node.js Foundation. Nodejs Documentation [EB/OL]. [2019-08-05]. https://nodejs.org/en/docs.
[3]SQLite Consortium. SQLite Documentation [EB/OL]. [2019-08-05]. https://sqlite.org/about.html.
[4]Mark Otto. Bootstrap Documentation [EB/OL]. [2019-08-05]. https://getbootstrap.com/docs/4.3/getting-started/introduction.