徐浩彬,趙 亮,徐碧裕,葉朗明
(1.江門市新會區氣象局,廣東新會 529100;2.隴縣氣象局,陜西隴縣 721200;3.江門市氣象局,廣東江門 529000)
隨著氣象事業的發展,縣級氣象探測儀器設備數量及種類日趨增加,確保探測設備正常高效運行,是提供優質氣象服務的前提和保證。但與日俱增的探測儀器使設備維護人員的監控及維護壓力倍增,人工監控儀器設備的運行狀態任務更加繁重。為了及時準確地監控氣象區域站數據,緩解監控人員的工作壓力,李峰等[1]對綜合氣象觀測運行監控業務現狀的分析,提出了運行監控業務的發展設想。孟珍等[2]以"三級管理"的組織結構建立了氣象探測設備運行監控與評估體系。張潔等[3]開始探索云計算環境下氣象大數據服務的應用研究,以期通過云計算環境提升整體氣象業務服務水平。龍亞星等[4]構建了由觀測資料指標等組成的自動氣象站網監控指標體系并給出了目標值。李源鴻及江崟等[5-6]在省級及市級層面探索并設計了氣象監測綜合業務平臺。齊軍岐[7]根據陜西省大探中心提供的128例自動站設備故障案例,將故障發生原因分為6類。王麗玫等[8]基于省級氣象寬帶網,建設開發集約型信息網絡運行管理監控業務系統。王建莊、鐘少君等[9-10]運用不同的技術路線完成了氣象自動站數據監控平臺的設計開發工作。邸永強等[11]基于GSM短信技術路線開發了自動氣象站資料傳輸監控平臺,提高了業務可用性。林月蘭等[12]應用氣象數據監控系統,有效減少氣象數據缺測。
為了嘗試提高臺站設備維護及時率及緩解人工監控區域站運行狀態的壓力,本文根據縣級臺站實際需要,提出了一種便于實現、穩定可靠的區域站實時監控解決方案。該系統應用PHP程序,采用定時任務執行方式,調取廣東省氣象探測數據中心區域站數據,根據各站數據到報情況將缺報站點進行記錄,通過郵件通知臺站維護人員,以期達到縮短響應時間和及時處理故障的目的。
新會區氣象局通過對臺站現有人員和業務計算資源的分析,在不增加人員運維壓力及業務系統便于使用的條件下,形成了一套應用云平臺的區域站實時監控系統。系統由3大功能模塊構成:區域站數據的定時下載及推送、氣象數據的實時監控、通知消息提示告警服務。數據按順序流轉至各功能模塊,實現了對區域站數據來報情況的實時監控。基于上述業務需求,新會區氣象局選用了新浪云平臺以搭建氣象數據實時監控系統。
新浪云應用:新浪云是基于PaaS(Platform-as-a-Service)模式的分布式Web應用/業務開發托管、運行平臺,其提供了包括數據庫、存儲與CDN、應用程序、網絡與安全、通訊等一整套服務產品。因其具有所見即所得的程序開發及部署環境,可以快速實現核心業務上線運行,同時無需過多考慮服務器運維管理,可大幅縮減運行維護的人力物力資源,運維成本低,架構精簡輕量,便于臺站自行搭建和廣泛應用,適合縣級氣象部門業務系統的部署應用。
KVDB存儲:KVDB是新浪云開發的分布式key-value數據存儲服務,用來支持公有云平臺上的海量key-value存儲。KVDB支持100GB的存儲空間,可支持1 000 000 000條記錄,高性能高可靠存儲,采用無狀態對等的分布式架構,在任一節點發生故障時,仍可保持正常運行。由于其具有穩定高性能的存儲能力,適合氣象等行業的數據應用。
系統由三個模塊組成:一是原始實況數據下載及推送;二是數據的實時監控;三是通知消息提示告警服務。其架構如圖1所示。
總體設計思路由以下三個部分組成。
(1)原始數據下載及推送由本地計算機執行,通過Windows計劃任務,每五分鐘執行預編寫的腳本程序進行下載,已獲取的數據文件通過FTP方式傳輸至外網服務器。傳送至外網服務器的區域站數據文件以JSON格式保存成文本文件,且每五分鐘覆蓋重寫生成最新數據文件。由于直接調取區域站的實況數據,新增站點可以便捷納入監控范圍。
(2)區域站數據監控是整個系統的核心,該程序部署在新浪云平臺。通過調用新浪云計劃任務,執行區域站數據檢查程序。如區域站數據文件中有站點缺測,則將該站點標記為數據缺測1次,且在新浪云KVDB存儲器中保存(僅保存缺測次數,不保存站點原始氣象數據)。當KVDB存儲器中對應站點的缺測標記為5時,表明數據已缺測20分鐘,同時達到監控閾值,該站點缺測標記將流轉至信息告警服務程序。
(3)當數據缺測達到監控閾值時,將啟用通知消息提示告警服務,通過郵件方式將該站點的缺測情況發送至預設郵箱,以提醒值班人員查看站點故障情況。為了避免重復多次發送提醒郵件,當缺測標記大于閾值時即關閉該站點的提醒發送功能;若該站點恢復正常,缺測標記將被清零,檢查程序將進入新的循環,繼續監控數據來報情況。

圖1 氣象數據監控服務架構圖
數據下載程序使用PHP: Hypertext Preprocessor語言5.3版本進行服務程序開發,每五分鐘調用廣東省氣象探測數據中心區域站數據接口獲取相關數據,并以JSON格式保存。
核心代碼如下:
$station =array("XXXXX",……,"XXXXX");
for($i=0;$i<=41;$i++){
$url = "http://172.22.1.175/di/http.action?userId=******&pwd=******&interfaceId=getAwst5MRain4Iiiii&dataFormat=json&iiiii=".$station[$i]."&ymdhms=".$data_time."00";
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$data_temp = curl_exec($curl);
if ($data_temp != '{"ROWCOUNT":"0","DATA":[]}'){
$data_decode = json_decode($data_temp,true);//解碼json格式
$data_area[$i]['STATION'] = $data_decode['DATA'][0]['V01301'];
$data_area[$i]['TIME'] = $data_decode['DATA'][0]['DDATETIME'];
$data_area[$i]['V13023_24'] = $data_decode['DATA'][0]['V13023'];
……
}else{
$data_area[$i]['STATION'] = '';
$data_area[$i]['TIME'] ='';
$data_area[$i]['V13023_24'] = '';
……}
}
$data_encode_area = json_encode($data_area);//重新轉換成json數據
$myfile = fopen("D:/area.js" , "w") or die("Unable to open file!");//寫入文件
fwrite($myfile, $data_encode_area);
fclose($myfile);
推送功能使用FlashFXP軟件,通過設置計劃任務的方式,每5 min將生成的數據文件以FTP方式向外網服務器傳輸數據。
監控模塊是整個服務的核心。部署于新浪云的監控檢查程序每五分鐘讀取原始數據的狀態,并分站號給予標記。數據正常來報的站點,標記為0,并將標記值存儲于新浪云KVDB存儲器中;未正常來報的站點,標記為1,標記值將疊加到上述存儲器中。同時,檢查程序每5 min檢測各站點的標記值,若有站點標記值累計達到5,達到監控閾值,觸發郵件發送模塊。另外,站點缺測標記達6及以上,檢查程序將自動關閉該站點的郵件發送功能,避免重復提醒。站點數據恢復正常后,標記值將清零,監控服務進入新一次循環。區域站通過通信網絡進行數據傳輸,容易發生間歇性短時次通訊信號丟失,從而導致該時次數據缺測。因此,為合理監控和避免同一問題多次報警,設定監控標記參數設定為累計達到5后觸發郵件發送模塊。系統業務運行時,可根據實際情況對缺測標記參數進行增減調整,以適應實際監控需求。
相關實現代碼如下:
$kv = new SaeKV();//初始化KVClient對象
$ret = $kv->init('KVDB存儲器編號');//加載KVDB存儲器
$infomation = $kv->get('infomation');
$url = "http://www.jmqx.gov.cn/xinhui/upload/area.js";//讀取數據文件
$curl =curl_init();
$data =curl_exec($curl);
curl_close($curl);
$data_decode = json_decode($data,true);
for($i=0;$i<=41;$i++){
$time[$i] = strtotime($data_decode[$i]['DDATETIME']);
if(empty($time[$i])){
$infomation[$i] = $infomation[$i] + 1; }//對每個站點數據到報情況進行標記
else{
$infomation[$i] = 0;}
//判斷每個站是否存在數據,缺數據5次即發出提醒
if($infomation[$i] < 6 and $infomation[$i] > 4){
switch ($i){
case 0:
$station[$i] = "*****";
break;
……
case 41:
$station[$i] = "*****";
break;}
$maildata[$i] = $station[$i].'缺'.$infomation[$i].'次數據';}}
$ret = $kv->set('infomation',$infomation);//更新key-value
若區域站缺測標為5時,觸發郵件提醒功能,系統將缺測站點告警信息發送至值班人員。通知消息告警功能使用新浪云平臺郵件服務,服務基于SMTP郵件傳輸協議,對支持SMTP服務的郵箱進行配置,并完成郵箱地址、用戶賬號及密碼等參數設置即可實現郵件消息發送。
郵件發送核心代碼如下:
$mail = newPHPMailer();
$mail->IsSMTP();
$mail->SMTPDebug = 2;
$mail->Host = "smtp.126.com";
$mail->Port = "25";
$mail->SMTPAuth = true;
$mail->CharSet = "utf-8";
$mail->Username = "******@126.com";
$mail->Password = "******";
$mail->AddAddress("******@qq.com");//接收提醒信息的用戶郵箱,可添加多個
$mail->SetFrom("******@126.com", "新會區區域站監控程序");//設置發送郵件的郵箱
$mail->IsHTML(false);
$mail->Subject = "區域站缺測提醒";//郵件主題
$mail->MsgHTML("郵件正文");//缺測信息正文
if(!$mail->Send()){
echo "發送失敗: " . $mail->ErrorInfo;//輸出錯誤信息}
else{
echo "發送成功";}
目前廣東省氣象局運行的區域站監控系統,通過短信方式提醒縣級運維人員設備運行狀態。本文通過固定時段測試,對本系統以及省局監控系統的縣級應用層面(下簡稱“對比系統”)進行對比檢驗測試。
選取2018年9月16日強臺風“山竹”影響期間為測試時間段,區域范圍選取廣東新會,合共42個區域自動站,匯總統計了本系統及對比系統的監控表達能力,兩系統性能如圖3所示。
同時,為定量描述監控系統對數據缺測的監控能力,定義測試時段內成功捕捉到的缺測站數占總缺測站數的百分比為監控成功率。查驗9月16日16時新會區域站數據來報情況,實際出現缺測的站數為12個。由圖2系統性能對比情況可見,本系統捕捉到11站的缺測狀態,并發出提醒,監控成功率達91%;而對比系統發送提醒8站,監控成功率67%。可見該測試中,本系統監控成功率優于對比系統。分析具體站點表明,對比系統沒有發出監控提醒的3個站點,全部為近年新布設站點。由于本系統架構輕量,易于維護和擴展,因此站點的增減變化能夠迅速由臺站人員進行修改,站點覆蓋率更高,從而使監控成功率占優。從平均反應時間來看,本系統反應時間為50 min,對比系統為26 min,對比系統反應時間明顯短于本系統的反應時間。分析造成該結果的原因,對比系統直接讀取站點的數據狀態,根據數據狀態直接反饋缺測提醒,效率更高;本系統通過累積計算5個時次的數據缺測狀態,同時經過多流程的信息傳輸,數據信息由內部網傳輸至互聯網,因此響應時間更長;如需縮短響應時間,可通過調整本系統缺測標記參數,以及優化數據流傳輸,以提高響應速度。

圖2 雙軌運行試驗系統性能對比圖
(1)基于新浪云平臺搭建縣級氣象數據監控服務可實現以下三大功能:氣象數據下載、監控信息獲取和云存儲、主動提示告警服務。
(2)本系統架構方案具有運維成本低、可推廣性強、覆蓋站點范圍廣、新布設站點納入監控速度快、監控成功率高等優點;雙軌運行試驗顯示,本系統平均響應時間為50 min,監控成功率達91%。
(3)本系統存在一些不足,數據傳輸流程較復雜,平均反應時間較長,與省級系統對比時效性較差,后續本系統的升級將重點整合和利用省級監控資源,作為省級監控的有效補充。同時將進一步改進傳輸流程,縮短耗時,提高監控提醒的時效性。另外,在監控各氣象要素基礎上,可進一步開發判別災害性天氣的監控服務,以拓展該服務的應用功能。