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