本發(fā)明屬于實(shí)時(shí)通信和民航飛機(jī)安全運(yùn)行監(jiān)測(cè)技術(shù)領(lǐng)域,具體涉及一種基于signalr的民用飛機(jī)安全運(yùn)行實(shí)時(shí)監(jiān)測(cè)方法。
背景技術(shù):
傳統(tǒng)的民航飛機(jī)運(yùn)行實(shí)時(shí)監(jiān)測(cè)采用ajax長(zhǎng)輪詢(longpolling)技術(shù),由客戶端按照固定間隔不斷向服務(wù)器請(qǐng)求數(shù)據(jù)來達(dá)到偽實(shí)時(shí)通信效果,無法做到服務(wù)器直接向客戶端推送數(shù)據(jù),消耗cpu和網(wǎng)絡(luò)資源大。signalr是一種高效便捷的全雙工(full-duplex)通信框架,能夠建立基于websocket的異步、永久連接,適合航空安全運(yùn)行實(shí)時(shí)監(jiān)測(cè)。然而signalr進(jìn)行高頻實(shí)時(shí)通信時(shí)有以下缺點(diǎn):
signalr使用集線器類(hub)api來處理服務(wù)器到客戶端的交互。由于每一次連接都會(huì)新建一個(gè)hub實(shí)例,因此數(shù)據(jù)存儲(chǔ)、轉(zhuǎn)發(fā)、廣播等更新機(jī)制的實(shí)現(xiàn)需要放在另一個(gè)單例化、全局性的上下文中,否則在高并發(fā)訪問下內(nèi)存中會(huì)有大量冗余hub實(shí)例存在,影響系統(tǒng)性能。
signalr的推送消息是基于連接(connection)的,signalr會(huì)為每個(gè)會(huì)話自動(dòng)生成一個(gè)隨機(jī)新建的connectionid,當(dāng)客戶端刷新之后connectionid也隨之刷新。但是運(yùn)行監(jiān)控系統(tǒng)的消息推送是基于用戶的(權(quán)限體系),也就是只有登錄之后才注冊(cè)到此hub,因此需要對(duì)signalr的連接方式進(jìn)行擴(kuò)展,使之可以進(jìn)行基于用戶的數(shù)據(jù)推送。
signalr為客戶端-服務(wù)器模式,當(dāng)同時(shí)維護(hù)的連接數(shù)較多時(shí),服務(wù)器性能會(huì)顯著下降,需要進(jìn)行分布式運(yùn)算和負(fù)載均衡,使得系統(tǒng)能夠支持大量用戶并發(fā)操作。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明為了解決現(xiàn)有技術(shù)中存在的問題,提供一種基于signalr的民用飛機(jī)安全運(yùn)行實(shí)時(shí)監(jiān)測(cè)系統(tǒng)及監(jiān)測(cè)方法,通過使用signalr技術(shù)進(jìn)行飛機(jī)運(yùn)行的實(shí)時(shí)監(jiān)控。
所述的監(jiān)測(cè)系統(tǒng)包括ads-b地面站、signalr服務(wù)器和客戶端三部分。其中ads-b地面站主要負(fù)責(zé)獲取飛機(jī)實(shí)時(shí)飛行數(shù)據(jù),并通過httppost方式單向發(fā)送到signalr服務(wù)器;signalr服務(wù)器與客戶端直接通過websocket建立全雙工通信連接,當(dāng)飛機(jī)實(shí)時(shí)運(yùn)行數(shù)據(jù)更新時(shí)直接推送至客戶端,同時(shí)客戶端也可以根據(jù)需要對(duì)signalr服務(wù)器主動(dòng)發(fā)起數(shù)據(jù)請(qǐng)求(如用戶登錄、按照特定條件請(qǐng)求數(shù)據(jù)等);客戶端負(fù)責(zé)以webgis技術(shù)將飛機(jī)實(shí)時(shí)信息呈現(xiàn)出來。
所述的監(jiān)測(cè)方法包括如下步驟:
第一步,ads-b地面站獲取飛機(jī)實(shí)時(shí)飛行數(shù)據(jù);
第二步,實(shí)時(shí)數(shù)據(jù)通信;
第三步,webgisgis呈現(xiàn)。
本發(fā)明的優(yōu)點(diǎn)在于:
(1)使用signalrsignalr框架進(jìn)行實(shí)時(shí)通信,相比于民航傳統(tǒng)的ajax長(zhǎng)輪詢(longpolling)技術(shù),消耗的cpu和網(wǎng)絡(luò)資源大幅度減小。
(2)通過對(duì)signalr進(jìn)行全局單例化,大幅度減小服務(wù)器內(nèi)存占用。
(3)通過對(duì)iuseridprovider進(jìn)行擴(kuò)展并注入會(huì)話,解除signalr連接對(duì)connectionid的依賴,使得連接可以直接關(guān)聯(lián)用戶信息。
(4)通過分布式運(yùn)算和負(fù)載均衡優(yōu)化服務(wù)性能,使得系統(tǒng)能夠支持大量用戶并發(fā)操作。
(5)通過webgis加載實(shí)時(shí)飛行數(shù)據(jù)進(jìn)行直觀的可視化顯示。
附圖說明
圖1是本發(fā)明的基于signalr的民用飛機(jī)安全運(yùn)行實(shí)時(shí)監(jiān)測(cè)系統(tǒng)架構(gòu)圖;
圖2是本發(fā)明的基于signalr的民用飛機(jī)安全運(yùn)行實(shí)時(shí)監(jiān)測(cè)方法流程圖;
圖3是signalr全局單例化實(shí)現(xiàn)示意圖;
圖4是redis負(fù)載均衡示意圖。
具體實(shí)施方式
下面將結(jié)合附圖和實(shí)施例對(duì)本發(fā)明作進(jìn)一步的詳細(xì)說明。
本發(fā)明提供一種基于signalr的民用飛機(jī)安全運(yùn)行實(shí)時(shí)監(jiān)測(cè)方法,所述的方法通過如下的基于signalr的民用飛機(jī)安全運(yùn)行實(shí)時(shí)監(jiān)測(cè)系統(tǒng)實(shí)現(xiàn)。如圖1所示,所述的系統(tǒng)包括ads-b地面站、signalr服務(wù)器和客戶端三部分,。其中ads-b地面站主要負(fù)責(zé)獲取飛機(jī)實(shí)時(shí)飛行數(shù)據(jù),并通過httppost方式單向發(fā)送到signalr服務(wù)器;signalr服務(wù)器與客戶端直接通過websocket建立全雙工通信連接,當(dāng)飛機(jī)實(shí)時(shí)運(yùn)行數(shù)據(jù)更新時(shí)直接推送至客戶端,同時(shí)客戶端也可以根據(jù)需要對(duì)signalr服務(wù)器主動(dòng)發(fā)起數(shù)據(jù)請(qǐng)求(如用戶登錄、按照特定條件請(qǐng)求數(shù)據(jù)等);客戶端負(fù)責(zé)以webgis技術(shù)將飛機(jī)實(shí)時(shí)信息呈現(xiàn)出來。
結(jié)合圖2所示流程圖,所述的基于signalr的民用飛機(jī)安全運(yùn)行實(shí)時(shí)監(jiān)測(cè)方法包括如下步驟:
第一步,ads-b地面站獲取飛機(jī)實(shí)時(shí)飛行數(shù)據(jù);
ads-b的信息處理與顯示主要包括位置信息和其它附加信息的分析提取,然后通過httppost請(qǐng)求發(fā)送到signalr服務(wù)器。
第二步,實(shí)時(shí)數(shù)據(jù)通信;
(2.1)signalr全局、單例化實(shí)現(xiàn)。
如圖3所示,首先創(chuàng)建servertickerhub類繼承hub類(集線器),用以重寫hub類的連接建立、連接斷開等基本事件。然后創(chuàng)建serverticker類承擔(dān)數(shù)據(jù)更新邏輯,同時(shí)采用單例模式創(chuàng)建serverticker實(shí)例確保內(nèi)存中只有一個(gè)serverticker實(shí)例存在,再?gòu)拿總€(gè)servertickerhub類中添加對(duì)serverticker單一實(shí)例的引用,最后為serverticker類添加signalr全局集線器連接上下文對(duì)象的引用,使得serverticker能夠?qū)蛻舳?~n進(jìn)行廣播。
(2.2)擴(kuò)展signalriuseridprovider并注入會(huì)話。
創(chuàng)建一個(gè)myuserfactory類,繼承自iuseridprovider,實(shí)現(xiàn)iuseridprovider的抽象方法getuserid,并從瀏覽器cookies中獲取用戶id。在starup.cs文件中,將自定義的myuserfactory類注入到會(huì)話設(shè)置中,解除signalr連接對(duì)connectionid的依賴,使得每一個(gè)連接直接與當(dāng)前登錄的用戶關(guān)聯(lián)。
(2.3)基于redis的signalr分布式服務(wù)及負(fù)載均衡。
如圖4所示,通過對(duì)redis建立緩沖集群,并對(duì)緩沖集群進(jìn)行合理設(shè)計(jì)實(shí)現(xiàn)分布式服務(wù)負(fù)載均衡,具體包括:
(a)緩存集群基礎(chǔ)配置:確保系統(tǒng)能夠隨機(jī)訪問緩存集群中的任意正常redis節(jié)點(diǎn),在某redis節(jié)點(diǎn)發(fā)生故障時(shí),能夠自動(dòng)撤銷該redis節(jié)點(diǎn);redis節(jié)點(diǎn)恢復(fù)后,能夠自動(dòng)添加該redis節(jié)點(diǎn)。
(b)節(jié)點(diǎn)信息表維護(hù):通過二維表記錄集群中每個(gè)節(jié)點(diǎn)的運(yùn)行參數(shù)、訪問量,確保同一集群中權(quán)重之和等于100。當(dāng)緩存節(jié)點(diǎn)變化,或者節(jié)點(diǎn)的訪問權(quán)重發(fā)生變化,各應(yīng)用服務(wù)器需要重啟。
(c)定時(shí)器運(yùn)行:定時(shí)器每段時(shí)間運(yùn)行一次,運(yùn)行時(shí)的工作主要是記錄運(yùn)行參數(shù),包括集群中每個(gè)節(jié)點(diǎn)當(dāng)前的有效標(biāo)記、訪問區(qū)間、累計(jì)訪問次數(shù)等參數(shù),同時(shí)對(duì)節(jié)點(diǎn)信息表進(jìn)行主動(dòng)維護(hù);其次是對(duì)訪問次數(shù)進(jìn)行動(dòng)態(tài)調(diào)整,例如當(dāng)某一節(jié)點(diǎn)累計(jì)訪問次數(shù)達(dá)到預(yù)設(shè)最大值時(shí),所有節(jié)點(diǎn)訪問次數(shù)都設(shè)為預(yù)設(shè)最小值。
(d)緩存數(shù)據(jù)持久化:配置redis緩存數(shù)據(jù)持久化參數(shù),將緩存數(shù)據(jù)存入數(shù)據(jù)庫(kù)。
第三步,webgis呈現(xiàn)。
客戶端以openlayers3為gis框架進(jìn)行飛機(jī)實(shí)時(shí)狀態(tài)呈現(xiàn),將飛機(jī)作為點(diǎn)狀要素展在遙感影像底圖上。當(dāng)客戶端接收到飛機(jī)實(shí)時(shí)飛行數(shù)據(jù)后,將新的實(shí)時(shí)信息和坐標(biāo)賦予飛機(jī)要素,同時(shí)調(diào)用postcompose函數(shù)進(jìn)行地圖重繪并刷新飛機(jī)要素的位置和信息,實(shí)現(xiàn)流暢的飛行動(dòng)畫和實(shí)時(shí)信息查詢。