賈蘇+陳永康+王春明+袁鴻燕
摘要:為了處理實時顯示和處理物聯(lián)網(wǎng)中收集來的大量有用數(shù)據(jù),利用.NET平臺下的ZedGraph控件以直觀的形式展現(xiàn)實時觀測的事物狀態(tài),實現(xiàn)管理,監(jiān)控的科學化、自動化。ZedGraph是一種較為常用的表達數(shù)據(jù)的控件,簡單易用,面對大量數(shù)據(jù)也有不錯的性能。
關(guān)鍵詞:物聯(lián)網(wǎng);ZedGraph;實時分析
中圖分類號:TP393 文獻標識碼:A 文章編號:1009-3044(2016)15-0278-03
Abstract: In order to process enormous valuable data from the Internet of things,using the .NET platforms open-source library ZedGraph to make real-time data report,present the situation of things what we watch in various form,realize the science, automation of management and monitoring.ZedGraph is a more commonly used expression data control, and easy to use, in the face of a large number of data also has a good performance.
Key words: the Internet of things; ZedGraph; real time analysis
近年來,我國經(jīng)濟飛速發(fā)展,人們對于環(huán)境污染的日益嚴重頗為擔心,對環(huán)境監(jiān)測的重視程度越來越高。傳統(tǒng)的以人工為主的方式效率較低,且無法實現(xiàn)遠程監(jiān)控,不適合現(xiàn)代發(fā)展的需求。隨著科技的發(fā)展,物聯(lián)網(wǎng)技術(shù)將逐步取代人工監(jiān)控,大大提高了環(huán)境監(jiān)測的效率,為更科學優(yōu)化的監(jiān)測環(huán)境參數(shù)拓寬了思路與方式。
物聯(lián)網(wǎng)技術(shù)是信息化技術(shù)的一個極其重要的產(chǎn)物,是環(huán)境監(jiān)測的重要手段。物聯(lián)網(wǎng)強調(diào)的是“物—物”以無線的方式相互連接,達到“物—物”通信的目的。物聯(lián)網(wǎng)產(chǎn)生的大量數(shù)據(jù)是研究管理人員評估審查的重要指標,這些數(shù)據(jù)對環(huán)境的監(jiān)管、污染源的發(fā)現(xiàn)以及環(huán)境問題的反饋與處理方面發(fā)揮了極大的作用,那么,在環(huán)境監(jiān)測系統(tǒng)中,如何科學的呈現(xiàn)這些數(shù)據(jù)就成了研究的主要課題。
圖表是對數(shù)據(jù)進行分析評估的有效工具,也是最直觀表示數(shù)據(jù)的方式。本文就是在已通過傳感器獲得物聯(lián)網(wǎng)數(shù)據(jù)的基礎(chǔ)上,利用ZedGraph圖表制作工具來實時顯示數(shù)據(jù),使數(shù)據(jù)更富有生命,科學而直觀的動態(tài)實時展示。
1 ZedGraph的介紹
ZedGraph控件使用 C# 語言實現(xiàn)的,是 .NET 平臺上一個開源和非交互式圖表的制作類庫。ZedGraph支持多種2D圖表類型的圖表,可以利用任意的數(shù)據(jù)集合創(chuàng)建2D的線性圖表和柱形圖表,ZedGraph支持Windows Form和ASP.NET Web Form開發(fā),還能夠?qū)崿F(xiàn)各種二維表,如Line、Bar、Pie、Area等,因此是一種理想的顯示數(shù)據(jù)的控件。
ZedGraph控件是面向?qū)ο蟮模丛谑褂弥芯哂泻芨叩撵`活性。圖表的每個層面都可以被用戶修改,所有的圖表屬性都提供了缺省值,ZedGraph類庫中源代碼可被進行修改,重新生成,包括圖表顯示特性的若干默認值,如數(shù)值單位、數(shù)值范圍、步長、尺寸等。ZedGraph控件繼承了Framework中的UserControl接口,允許用戶在VS 的IDE 環(huán)境中進行拖放操作,對其他語言同時提供了相應的接口。
當上位機通過選擇指定節(jié)點和需要顯示的數(shù)據(jù)后,依從業(yè)務(wù)邏輯的需求,從某種數(shù)據(jù)接口中獲取相關(guān)數(shù)據(jù),在上位機端經(jīng)過數(shù)據(jù)整理后,構(gòu)造圖表所需的數(shù)據(jù)集,再由ZedGraph控件加載此數(shù)據(jù)集,最終,在上位機端生成圖表,通過定時器的時鐘控制,定期更新圖表信息的顯示。
ZedGraph可在運行時期創(chuàng)建實例對象,此處使用的是版本5.0.10的類庫,對應于VS2012開發(fā)平臺,一般開發(fā)步驟如下:
(1)打開Visual Studio 2012中文版。
(2)在菜單中選擇“文件”—>“新建”—>“項目…”。
(3)選擇“Windows應用程序”,取名為“ZedGraphDEMO”。
(4)在解決方案瀏覽窗口,右鍵點擊“引用”,選擇“添加引用…”。
(5)選擇“瀏覽”,導航到ZedGraph.dll,單擊“確定”,在項目引用中會增加ZedGraph。
(6)在菜單項“視圖”中選擇“工具箱”,查看“常規(guī)”選項卡的內(nèi)容。
(7)如“ZedGraphControl”選項不存在,右鍵點擊“常規(guī)”選項卡,并選“選擇項…”。
(8)在“.NetFramework組件”標簽下,點擊“瀏覽(B)…”。
(9)導航到ZedGraph.dll文件,點擊“打開”,之后點擊“確定”。
(10)工具箱中點擊“ZedGraphControl”控件,拖放控件到窗體。實際上工具箱中的控件拖放到窗體時,類庫的引用自動添加,所以在具體應用時,之前的添加引用過程可省略。
(11)窗體中點選“ZedGraphControl”控件,視圖菜單中選擇“屬性窗口”。
(12)把ZedGraphControl的名稱“(Name)”項填寫成“zg1”,默認通常是“zedGraphControl1”。
(13)雙擊窗體,切換到代碼窗口,窗口模板中帶有Form1_Load()方法。
(14)在文件上部加上“usingZedGraph;”。
2 ZedGraph應用開發(fā)實例
本例的分析數(shù)據(jù)來自物聯(lián)網(wǎng)中的中心節(jié)點,中心節(jié)點收集分散于通過無線的形式收集各處的信息采集點發(fā)送來的數(shù)據(jù),通過上位機對中心節(jié)點的讀取就實現(xiàn)對遠程節(jié)點的控制,中心節(jié)點起著一定程度上的網(wǎng)關(guān)的作用,對中心節(jié)點的讀取可以使用.NET提供的System.IO.Ports命名空間下的控件。
(1)在WinForm容器中繪制圖表的代碼
下列函數(shù)是在要表達實時數(shù)據(jù)的窗體中的私有函數(shù),zedGraphControl1在函數(shù)之外經(jīng)過實列化之后,只要設(shè)置其x軸為自動增長,PointPairList中保存有要在界面上顯示的數(shù)據(jù),執(zhí)行zedGraphControl1.Refresh();就實現(xiàn)了圖表的刷新。隨著數(shù)據(jù)的積累,應該放棄一些時間點,以保證圖表中數(shù)據(jù)的個數(shù)一樣,DropPrePoint()函數(shù)就是實現(xiàn)了這樣的功能,代碼如下:
private void DrawGraph()
{
//設(shè)置為x軸的標尺Scale可以隨著值自動增長
zedGraphControl1.GraphPane.XAxis.Scale.MaxAuto = true;
double x = (double)new XDate(DateTime.Now);//橫坐標
//縱坐標,y1表示溫度,y2表示濕度,y3表示土壤濕度
double y1 = 0, y2 = 0, y3 = 0;
for (int i = 1; i < dt.Rows.Count; i++) {
//dt中存放的是從中心節(jié)點中讀取的緩存數(shù)據(jù)
y1 = double.Parse(dt.Rows[i]["wd"].ToString());
y1 = y1 * 0.01;
y2 = double.Parse(dt.Rows[i]["sd"].ToString());
y2 = y2 * 0.01;
y3 = double.Parse(dt.Rows[i]["yw"].ToString());
y3 = y3 * 0.01;
}
//分結(jié)點添加數(shù)據(jù)
for (int k = 0; k < nodesum; k++) {
if (dt.Rows[i][0].ToString() == (k + 1).ToString()) {
wlist[k].Add(x, y1);
slist[k].Add(x, y2);
ylist[k].Add(x, y3);
}
}
}
//控制折線圖中的點保持在100個,超過100個就報先前的去掉
DropPrePoint();
this.zedGraphControl1.AxisChange();
this.zedGraphControl1.Refresh();//刷新數(shù)據(jù)
}
(2)使用定時器定期對容器中圖表進行刷新
使用定時器便可以在指定的時間間隔刷新圖表,定時器是timer1,其時間間隔到時便會自動調(diào)用約定的函數(shù)timer1_Tick(),在這個函數(shù)中需要保證上位機中留存的數(shù)據(jù)個數(shù),從串口中讀取收集來的數(shù)據(jù)LoadSerialData(),重新繪制圖表DrawGraph(),代碼如下:
private void timer1_Tick(object sender, EventArgs e) {
if (isStart) {//判斷是否已經(jīng)開始記錄
if (_serialPort.IsOpen){ //判斷端口是否打開
if (dt.Rows.Count > 1){ //dt里面是否有上位機以外的記錄
//移除掉線結(jié)點
for (int j = 1; j < dt.Rows.Count; j++){
comboBox2.Items.RemoveAt(j - 1);
dt.Rows.RemoveAt(j);
}
if (dt.Rows.Count > 0){
Node = new string[dt.Rows.Count, 5];//5表示有5列
//將dt里面的數(shù)據(jù)移入Node,以便繪制TOPO圖
for (int i = 0; i < dt.Rows.Count; i++){
Node[i, 0] = dt.Rows[i][0].ToString(); //ID碼
Node[i, 1] = dt.Rows[i]["wd"].ToString(); //溫度
Node[i, 2] = dt.Rows[i]["sd"].ToString(); //濕度
Node[i, 3] = dt.Rows[i]["yw"].ToString(); //土壤濕度
Node[i, 4] = dt.Rows[i]["ontime"].ToString(); //時刻
}
bind();//拓撲圖綁定
}
}
}
LoadSerialData();// 從串口讀取數(shù)據(jù)
DrawGraph();//畫折線圖
}
}
(3)使用定時器定期捕獲數(shù)據(jù),如圖1和圖2所示。
3 結(jié)束語
ZedGraph控件為開發(fā)者提供了豐富的屬性用來簡化軟件開發(fā)過程,控件開源的特性使得開發(fā)者可以根據(jù)具體情況修改源代碼以滿足特定需求。在生態(tài)養(yǎng)殖的環(huán)境監(jiān)測系統(tǒng)中應用ZedGraph控件,有助于監(jiān)測的數(shù)據(jù)圖形化和分析結(jié)果的可視化。
參考文獻:
[1] 孫吉赟,方明,顧燕偉.多維數(shù)據(jù)圖形顯示中ZedGraph控件的應用[J].電腦開發(fā)與應用,2008(3).
[2] 亦鋼. 應用Zedgraph高效開發(fā)數(shù)據(jù)圖表[J]. 電腦編程技巧與維護,2009(6).
[3] 沈?qū)m新 基于ZedGraph控件的制冷系統(tǒng)實時曲線的繪制[J].三門峽職業(yè)技術(shù)學院學報,2013(12).
[4] 朱振茂 無線網(wǎng)絡(luò)實時監(jiān)測系統(tǒng)上位機軟件的設(shè)計與實現(xiàn)[J].大連海事大學學報,2008(2).