彭 飛,趙清揚
(1.四川省德陽市氣象局,四川 德陽 618000;2.四川省氣象服務(wù)中心,四川 成都 610072)
目前,我國的氣象服務(wù)體系由決策氣象服務(wù)、公眾氣象服務(wù)、專業(yè)專項氣象服務(wù)和氣象科技服務(wù)構(gòu)成[1-3]。專業(yè)氣象服務(wù)[4-8]是公共氣象服務(wù)的重要組成部分,是對一些行業(yè)用戶提供專業(yè)的氣象服務(wù),是根據(jù)用戶的需求而制作相應(yīng)的預(yù)報服務(wù)。由于專業(yè)用戶所在行業(yè)不同,對氣象服務(wù)的需求也各不相同,這給從事專業(yè)氣象服務(wù)的工作人員提出了新的課題:如何才能快速應(yīng)對各行業(yè)用戶多樣化的業(yè)務(wù)需求。
通過梳理各種專業(yè)氣象服務(wù)的需求不難發(fā)現(xiàn),其核心就是天氣預(yù)報服務(wù)。精細化格點要素預(yù)報是目前中國氣象局的主推業(yè)務(wù)和未來天氣預(yù)報的發(fā)展方向[9-11]。在2017年底前,我國氣象預(yù)報服務(wù)統(tǒng)一數(shù)據(jù)源的“一張網(wǎng)”網(wǎng)格預(yù)報業(yè)務(wù)已經(jīng)開始正式運行。位于國家氣象中心天氣業(yè)務(wù)內(nèi)網(wǎng)中的智能網(wǎng)格預(yù)報[12-17]應(yīng)用分析平臺網(wǎng)站提供了基于位置的精細化氣象服務(wù),實現(xiàn)了天氣預(yù)報從傳統(tǒng)站點預(yù)報向格點預(yù)報的轉(zhuǎn)變。在該網(wǎng)站的前端頁面上,提供了根據(jù)某點經(jīng)緯度信息來獲得該點未來10 d天氣預(yù)報數(shù)據(jù)的功能,相應(yīng)的預(yù)報數(shù)據(jù)可以從頁面上下載并導(dǎo)出到Excel格式的文檔中。從前端頁面經(jīng)緯度數(shù)據(jù)的準備和提交,到下載服務(wù)器返回的數(shù)據(jù)到本地,再對數(shù)據(jù)進行分析處理,最終形成氣象服務(wù)產(chǎn)品和文檔,都需要手工操作,流程繁瑣、效率低下,還容易出錯。用軟件來實現(xiàn)以上過程將極大地提高工作效率。
下文,以開發(fā)德陽市高速公路智能網(wǎng)格預(yù)報服務(wù)軟件為例,介紹利用Fiddler抓包工具軟件和Aspose.Words for .NET[18-20]類庫相結(jié)合,一鍵實現(xiàn)客戶端向服務(wù)器發(fā)出請求、從服務(wù)器返回的信息中解析出需要的預(yù)報數(shù)據(jù)、并將數(shù)據(jù)寫入Word模板中,自動地生成德陽市高速公路專業(yè)氣象服務(wù)產(chǎn)品文檔的全部功能。
用軟件來模擬瀏覽器向服務(wù)器請求數(shù)據(jù)時,要明確客戶端需要向服務(wù)器發(fā)送什么樣的參數(shù),從服務(wù)器返回的信息中哪些數(shù)據(jù)是有用的預(yù)報數(shù)據(jù)。這就需要Fiddler等抓包工具軟件在瀏覽器向服務(wù)器請求數(shù)據(jù)的過程中,對請求的各種參數(shù)和返回的信息進行偵測。當獲取到預(yù)報數(shù)據(jù)后,再結(jié)合Aspose.Words for .NET類庫自動生成Word格式的氣象服務(wù)產(chǎn)品文檔。
Fiddler是強大的HTTP調(diào)試抓包工具,可以用其檢測網(wǎng)頁和服務(wù)器的交互情況,其原理是以Web代理服務(wù)器的形式進行工作的,它能記錄客戶端和服務(wù)器之間的http和https所有通訊,查看所有的“進出”Fiddler的數(shù)據(jù)。
Aspose.Words for .NET是.NET環(huán)境下功能強大的Word文檔處理類庫,它支持DOC、PDF、RTF、OOXML、HTML、OpenDocument、EPUB、XPS等格式。通過Aspose.Words for .NET類庫和.NET平臺下的編程語言相結(jié)合,在沒有安裝Microsoft Word軟件的環(huán)境中,也可以生成Word格式的文檔,并能對文檔進行查看、修改、渲染、格式轉(zhuǎn)換以及打印等操作,也無需考慮Microsoft Office軟件的版本兼容性問題,靈活地實現(xiàn)辦公文檔的自動化。
首先,運行Fiddler軟件,確保軟件的Capture Traffic是開啟的。用瀏覽器訪問智能網(wǎng)格預(yù)報應(yīng)用分析平臺網(wǎng)站,在網(wǎng)頁的文本框中輸入某站點的經(jīng)緯度數(shù)據(jù),并把數(shù)據(jù)向網(wǎng)站服務(wù)器提交。服務(wù)器在接收到瀏覽器的請求后,向前端頁面返回該站點連續(xù)10 d的天氣預(yù)報,返回的氣象要素包括:降水量、氣溫、風(fēng)速、相對濕度和云量。Fiddler詳細而完整地記錄了從提交請求到返回數(shù)據(jù)這一過程。
在Fiddler軟件的數(shù)據(jù)包列表窗口中,點擊和智能網(wǎng)格預(yù)報應(yīng)用分析平臺網(wǎng)站(Ip地址為10.1.64.146)相關(guān)的數(shù)據(jù)包,在右側(cè)請求(即客戶端發(fā)出的數(shù)據(jù))窗口中的Headers標簽頁顯示的數(shù)據(jù)就是客戶端向服務(wù)器請求數(shù)據(jù)時需要的各個參數(shù),包括請求方式、協(xié)議、Client頭域、主機名或域名等。在響應(yīng)(服務(wù)器返回的數(shù)據(jù))窗口中的TextView標簽頁顯示的是從服務(wù)器返回給客戶端的數(shù)據(jù),這些數(shù)據(jù)是以JSON對象的方式呈現(xiàn)的,其中包括以“category”、“data”和“publishDate”為鍵名的鍵值對。通過分析可知,“category”鍵對應(yīng)的值是氣象要素的預(yù)報時間,“data”鍵對應(yīng)的值是氣象要素的預(yù)報值,“publishDate”鍵對應(yīng)的值是智能網(wǎng)格預(yù)報發(fā)布的時間。如圖1所示。
首先,在Visual Studio IDE(Integrated Development Environment:集成開發(fā)環(huán)境)中建立一個WinForm項目,在工程中添加對Aspose.Words.dll和Newtonsoft.Json.dll文件的引用,并引入命名空間:
using Aspose.Words;
using Newtonsoft.Json.Linq;
模擬瀏覽器向服務(wù)器發(fā)起請求的主要代碼如下:
string longitude = longitudeAndLatitude.Split(',')[0];//經(jīng)度
string latitude = longitudeAndLatitude.Split(',')[1];//緯度
if(element.ToLower() == "rain")//降水
{
strURL = "http://10.1.64.146/WebHandler/MeteoHandler?method=getmeteodat
ablockfeatureinfo&type=grid&relativePath=/forecast/QPF_V2/gridrain03&format=grid03_{yyyyMMddHH}.{XXX}&publishDate=" + publishDate +"&lat=" + latitude + "&lng=" + longitude + "&day=10";
}
……(向服務(wù)器請求氣溫、風(fēng)速和云量的代碼與降水相似,此處略去。)
圖1 Fiddler偵測瀏覽器和服務(wù)器之間的通訊Fig.1 Fiddler detects communication between the browser and the server
然后,解析從服務(wù)器返回的JSON格式的數(shù)據(jù),主要代碼如下:
var responseStr = HttpGet(url);//用各個URL和對應(yīng)的參數(shù)查詢
JObject jObj = JObject.Parse(responseStr);//反序列化Json數(shù)據(jù)
//存放日期時間的數(shù)組
JArray dataArrayDatetime = JArray.Parse(jObj["category"].ToString());
JArray dataArray = JArray.Parse(jObj["data"].ToString());//存放元素值的數(shù)組
int intCountOfData = dataArrayDatetime.Count;
//字典,用于存儲全部的日期時間及其對應(yīng)的數(shù)據(jù)(氣溫、降水、風(fēng)速、云量)
Dictionary
//每次請求URL時返回的時間和元素值對應(yīng)(個數(shù)相等)
for(int i = 0; i < intCountOfData; i++)
dict.Add(dataArrayDatetime[i].ToString(), dataArray[i].ToString());
……
最后,把預(yù)報數(shù)據(jù)寫入事先準備好的Word模板中,以便生成服務(wù)產(chǎn)品文檔。關(guān)鍵代碼如下:
Aspose.Words.Document doc = new Aspose.Words.Document(strDocPath);
Aspose.Words.Bookmarkdatetime_header = doc.Range.Bookmarks["datetime_header"]; //當前書簽 datetime_header
SetBookmarkValue(datetime_header, strYMD_bookmark);//給當前書簽的文本賦值
……
bookmark = doc.Range.Bookmarks[tq_bookmark]; //當前書簽(天氣現(xiàn)象)
SetBookmarkValue(bookmark, tq_dic[curDT]);//給當前書簽的文本賦值
……
sfd.FileName = strYMD_file + ".docx";//要保存的文件名(word格式)
doc.Save(sfd.FileName);//保存文檔
……
軟件最終生成的德陽市高速公路專業(yè)氣象服務(wù)產(chǎn)品文檔截圖(部分)如圖2所示。
圖2 高速公路專業(yè)氣象服務(wù)產(chǎn)品Fig.2 Documentation of Expressway Meteorological Service Products
通過利用抓包軟件監(jiān)視瀏覽器和智能網(wǎng)格預(yù)報網(wǎng)站服務(wù)器之間的通訊,可以詳細地掌握客戶端向服務(wù)器請求數(shù)據(jù)時需要提供的參數(shù)和從服務(wù)器向客戶端返回的數(shù)據(jù),從而為開發(fā)軟件來模擬瀏覽器向服務(wù)器請求數(shù)據(jù)提供了依據(jù)。再配合功能強大的Aspose.Words for .NET第三方類庫,可以非常高效地實現(xiàn)智能網(wǎng)格預(yù)報專業(yè)氣象服務(wù)產(chǎn)品文檔的一鍵生成,極大地提高了工作效率。