閆海卿 李宥謀 李延峰 李曉俊
(西安郵電大學(xué)計算機學(xué)院 西安 710100)
LXI是成熟的以太網(wǎng)技術(shù)在測控自動化領(lǐng)域應(yīng)用的擴展,是將成熟的以太網(wǎng)技術(shù)應(yīng)用到自動測控系統(tǒng)中,以替代傳統(tǒng)的測試總線技術(shù),隨著信息技術(shù)的發(fā)展,儀器儀表的測控技術(shù)[2]發(fā)生了翻天覆地的變化,因此,LXI總線應(yīng)運而生,LXI測試總線技術(shù)是信息化、網(wǎng)絡(luò)化發(fā)展的必然趨勢,在網(wǎng)絡(luò)化的測控系統(tǒng)中,數(shù)據(jù)通過網(wǎng)絡(luò)傳輸?shù)接脩艚K端,而用戶可以不受時間和空間的限制對系統(tǒng)內(nèi)的測量儀器進行遠程操控、獲取測量信息[3],LXI網(wǎng)絡(luò)儀器是一種以LXI作為儀器內(nèi)部總線的由不同功能的LXI模塊所組成的新型儀器[4],傳統(tǒng)儀器測量技術(shù)存在很多缺陷,容易受到地域或者其他條件的影響,監(jiān)管和測控不方便,并且儀器不能單獨使用,無法實時監(jiān)測到數(shù)據(jù),如果儀器設(shè)備發(fā)生故障的時候,無法快速準(zhǔn)確定位故障點,還需要人工進行排查,并且也無法對之前采集的數(shù)據(jù)進行分析與統(tǒng)計。
LXI網(wǎng)絡(luò)儀器可以實現(xiàn)遠程實時測控[5]、監(jiān)管與維護,因此設(shè)計一個用戶感覺良好、功能完善的LXI網(wǎng)絡(luò)儀器系統(tǒng)的測控平臺具有深遠意義[6],通過該平臺可以將主界面和其他界面相互協(xié)作完成對LXI網(wǎng)絡(luò)儀器的測量、監(jiān)管和維護。
該測控平臺在Windows操作系統(tǒng)下完成的,使用C#語言在.NET Framework4.5平臺、Microsoft Vi?sual Studio 2012環(huán)境下開發(fā)的,在測控平臺主界面中,左側(cè)為樹形圖,右側(cè)為拓撲圖,本文中的樹形結(jié)構(gòu)[7]主要是利用控件TreeView動態(tài)將代理和儀器設(shè)備加載到樹形圖,樹形圖和拓撲圖都可以直觀地看到代理和儀器設(shè)備的連接情況,但是樹形圖可以直觀地看到父子關(guān)系,和書的目錄相似,功能完善,代理和儀器設(shè)備都可以通過樹形結(jié)構(gòu)進行動態(tài)顯示,連接好的遠端代理和設(shè)備的信息都可以通過測控平臺的后臺模塊傳送到測控界面中的MIB信息管理界面進行顯示。
LXI網(wǎng)絡(luò)儀器樹形圖,在TreeView控件的基礎(chǔ)上進行設(shè)計,樹形圖的設(shè)計分為三層,層次結(jié)構(gòu)明確,如圖1所示,左側(cè)為樹形圖,右側(cè)為拓撲圖[8],本文重點介紹樹形圖,拓撲圖只是簡單說明,樹形圖第一級為根節(jié)點,無實際意義,用于連接代理開發(fā)板,第二級是代理開發(fā)版,用于連接儀器、儀表或者傳感器等設(shè)備,第三級就是儀器、儀表或者傳感器等設(shè)備,整個三層結(jié)構(gòu)顯示了網(wǎng)路儀器的拓撲層次結(jié)構(gòu)。
圖1 樹形圖的生成
1)當(dāng)點擊樹形圖上的根節(jié)點的時候,會彈出相應(yīng)的菜單欄,包含刪除和添加菜單項,根節(jié)點無實際意義,只起到連接作用,可以在根節(jié)點進行添加,將代理節(jié)點添加到根節(jié)點下,代理最多可添加32個,每個代理下最多可添加四個儀器設(shè)備,同時將添加的代理和儀器設(shè)備存入數(shù)據(jù)庫,也可以在根節(jié)點處進行刪除操作,刪除根節(jié)點下的所有代理節(jié)點,同時,數(shù)據(jù)庫中的信息也進行變化,除了根節(jié)點之外,所有數(shù)據(jù)都將刪除,樹形圖和拓撲圖都動態(tài)變化。
2)當(dāng)右擊代理節(jié)點的時候,會彈出相應(yīng)的菜單欄,包括查看代理信息、配置代理、MIB信息管理、添加組件和刪除組件,對于添加組件和刪除組件項,添加的是代理節(jié)點(代理節(jié)點最多32個),刪除的是選中的該代理以及該代理下所連接的所有儀器設(shè)備,查看代理信息是將數(shù)據(jù)庫[9~11]中已經(jīng)存放好的該代理的詳細信息進行顯示,配置代理是將代理的ID編號和MAC地址進行添加,MIB信息管理界面是對MIB節(jié)點進行管理,可以獲得代理以及帶代理對應(yīng)的詳細信息,包括IP地址,可以將儀器設(shè)備端的數(shù)據(jù)通過代理,然后經(jīng)過后臺處理之后在MIB界面進行顯示。
3)當(dāng)右擊設(shè)備節(jié)點的時候,彈出相應(yīng)的菜單項,包含設(shè)備屬性、MIB信息管理、設(shè)備配置、刪除節(jié)點,因為最多三級節(jié)點,因此沒有添加選項,設(shè)備屬性是將設(shè)備的基本信息顯示出來,設(shè)備配置是將設(shè)備的基本信息進行保存和刪除,還包括該設(shè)備的上一級節(jié)點的信息,MIB信息管理可以對儀器設(shè)備節(jié)點進行管理并將采集的數(shù)據(jù)通過該節(jié)點進行顯示,在TreeView屬性圖上進行添加和刪除組件的操作都會影響數(shù)據(jù)庫中的數(shù)據(jù)記錄,操作結(jié)果的相關(guān)信息會在主界面的運行窗口進行顯示,同時也會影響主界面中的ListView控件中所顯示的信息,與此同時還會影響LXI網(wǎng)絡(luò)儀器拓撲圖區(qū)域中的拓撲圖的信息顯示,這幾個部分的信息彼此相關(guān)聯(lián),無論是樹形圖還是拓撲圖的改變,數(shù)據(jù)庫和ListView控件中的信息都需要立即進行更新,從而保持?jǐn)?shù)據(jù)的一致性。
2.2.1 樹形圖的生成
TreeView樹形圖的生成是監(jiān)管平臺主控界面的核心功能,實現(xiàn)過程是首先從數(shù)據(jù)庫t_Running?TreeView表中讀取數(shù)據(jù),而該表中的數(shù)據(jù)來自于中間交互處理模塊對代理開發(fā)板的自動發(fā)現(xiàn),然后根據(jù)該表的所有信息以及表中節(jié)點的ID和PID遞歸的調(diào)用自定義的額add_tree()方法,執(zhí)行該方法的過程中,樹形節(jié)點就會逐級的被添加到TreeView控件上,同時也會統(tǒng)計代理和儀器設(shè)備的數(shù)目。樹形圖的生成過程是首先從數(shù)據(jù)庫中t_RunningTree?View表中讀取數(shù)據(jù)并存入DataTable內(nèi)存數(shù)據(jù)表中,利用DataTable類對象的Select方法,即Da?taRow[]dr=dt.Select(“pid=”+pid),從根節(jié)點開始遞歸,即pid=0的節(jié)點開始遍歷dr,每次遍歷實例化新的node對象,用于在樹形圖TreeView中添加新節(jié)點,即TreeNode node=new TreeNode(),將 dr對象的每行值與node的相關(guān)屬性綁定,再把node節(jié)點通過Add方法添加到TreeView控件上,在此過程中要對本局域網(wǎng)中代理總數(shù)和儀器設(shè)備數(shù)目進行統(tǒng)計。生成樹形圖的關(guān)鍵代碼為
string ostring=“select*from t_RunningTreeView”;DataSet ds=new DataSet();//實例化數(shù)據(jù)集
ds=MyMysqlMeans.getDataSet(ostring,“RunningTree?View”);//調(diào)用自定義的數(shù)據(jù)庫公共類的靜態(tài)數(shù)據(jù)方法,返回DataSet對象
DataTable dt=ds.Tables[“RunningTreeView”];//創(chuàng)建DataTable對象
//將t_RunningTreeView表中的代理以及儀器設(shè)備動態(tài)添加到TreeView控件
add_tree(dt,0,(TreeNode)null,random);//將根節(jié)點添加到樹形圖中
private void add_tree(DataTable dt,int pid,TreeNode pNode,Random random)
{//獲取與篩選條件相匹配的所有DataRow對象的數(shù)組
DataRow[]dr=dt.Select(“pid=”+pid);
foreach(DataRow row in dr)//遍歷數(shù)組dr
{
TreeNode node=new TreeNode();//實例化一個TreeNode節(jié)點對象
if(pNode==null)//如果父節(jié)點為空,則為根節(jié)點root
{
//設(shè)置樹節(jié)點標(biāo)簽中顯示的文本,即名稱
node.Text=row[“name”].ToString();
node.Tag=row[“id”].ToString();//設(shè)置樹節(jié)點的ID編號屬性
node.ImageIndex=0;
node.SelectedImageIndex=0;//選定狀態(tài)時的圖像列表索引值
treeView1.Nodes.Add(node);//將創(chuàng)建的節(jié)點添加到樹節(jié)點集合的末尾
//調(diào)用自定義的方法將row行表示的節(jié)點項添加到ListView列表控件中
add_listview(row);
//再次遞歸調(diào)用自定義的方法,遞歸創(chuàng)建并添加根節(jié)點的子節(jié)點
add_tree(dt,int.Parse(row[“id”].ToString()),node,ran?dom);
count_nodes++;//節(jié)點總數(shù)累加
}
else{
//添加當(dāng)前節(jié)點的子節(jié)點
node.Text=row[“name”].ToString();
node.Tag=row[“id”].ToString();
int imageIndex=random.Next(1,33);//隨機數(shù)
node.ImageIndex=imageIndex;//
node.SelectedImageIndex=imageIndex;
//node.ToolTipText=row[“notes”].ToString();
pNode.Nodes.Add(node);
add_listview(row);
add_tree(dt,int.Parse(row[“id”].ToString()),node,random);
if(node.Level==1)//一級節(jié)點
{
agentNum++;//統(tǒng)計代理數(shù)目
}
else if(node.Level==2)//節(jié)點深度為2,表示代理下面的設(shè)備節(jié)點
{
devNum++;//儀器設(shè)備數(shù)目統(tǒng)計
}
count_nodes++;//節(jié)點總數(shù)累加
}
}
}
2.2.2 樹形圖的動態(tài)刷新生成
樹形圖的動態(tài)生成實質(zhì)上是清除已有的樹狀圖和拓撲圖,再將它們重新生成,是根據(jù)數(shù)據(jù)庫表t_RunningTreeView中的數(shù)據(jù)生成TreeView目錄樹狀圖,再根據(jù)TreeView節(jié)點的數(shù)據(jù)繪制樹狀圖和拓撲圖,這樣的缺點是無論樹狀圖和拓撲圖是否發(fā)生變化,都要人工去刷新,消耗體力,程序輪詢控制時,在時間間隔上有局限性,要實現(xiàn)動態(tài)刷新,更新數(shù)據(jù)庫表t_RunningTreeView,再進行程序控制的刷新,在動態(tài)刷新的時候,樹形圖和拓撲圖自動動態(tài)更新,獲取本局域網(wǎng)中動態(tài)樹形圖的方法有兩種,方法之間相互協(xié)調(diào),共同完成任務(wù),動態(tài)樹形圖如圖2所示,具體工作流程[12~13]如下。
1)IP地址自動發(fā)現(xiàn):測控平臺加載之后調(diào)用后臺模塊,后臺模塊調(diào)用開源DHCP模塊,為代理開發(fā)板分配動態(tài)分配IP地址,然后后臺將IP地址和MAC地址通過進程間通信socket通信推送到測控平臺,測控平臺創(chuàng)建線程[14]去接收,將接收到的消息通過主界面的運行欄進行顯示,同時將其寫入日志文件,以備后來查看,同時,測控平臺主界面自定義函數(shù)getDHCPInfo()中將接收到的MAC地址在數(shù)據(jù)庫表t_AgentIdMac中進行查詢,如果不存在此MAC地址,則說明該代理不存在,則將該代理添加到此表中,然后在表t_RunningTreeView中通過代理名稱來查詢編號ID,如果不存在,則將該代理的名稱、pid、ip和mac地址添加到此表中,點擊刷新,樹形圖和拓撲圖都發(fā)生改變。
2)掃描代理:代理通過DHCP模塊為代理進行IP地址的分配,在主界面創(chuàng)建一個線程scanAgentIp(),測控平臺每隔一定時間去讀取數(shù)據(jù)庫表t_Run?ningTreeView中所有代理的ID和IP地址,然后通過Ping類和PingReply類與代理的IP地址進行Ping操作,即發(fā)送ICMP請求,并獲取ICMP應(yīng)答狀態(tài),如果應(yīng)答狀態(tài)失敗,則表明此代理不存在,則應(yīng)該將該代理從數(shù)據(jù)庫表中刪除,并且將該代理下面的儀器設(shè)備進行刪除,如果Ping操作成功,則在數(shù)據(jù)庫中讀取下一條ID和IP地址的記錄,然后進行和上面同樣的操作。
圖2 代理和儀器連接
LXI網(wǎng)絡(luò)儀器測控平臺主界面中的樹形圖和拓撲圖都可以動態(tài)顯示代理以及儀器設(shè)備,也可以實現(xiàn)動態(tài)添加、刪除、查看對應(yīng)屬性信息,遠端代理和儀器設(shè)備的信息獲取是使用的 SNMP[15~16]的 Get和Set操作,用戶可以將遠端數(shù)據(jù)通過MIB界面進行正確顯示,實現(xiàn)遠程監(jiān)控和數(shù)據(jù)查看。
1)當(dāng)加載此窗體時,窗體在加載的過程中會對DataGridView控件進行自定義設(shè)置,例如在該控件中創(chuàng)建復(fù)選框列,從數(shù)據(jù)庫中加載信息,顯示在該控件的指定位置,并進行分頁顯示,在圖3中的MIB表中,可以單擊某行后面的“獲取”或者“設(shè)置”按鈕,從而實現(xiàn)對選定行中的OID進行SNMP的“Get”和“Set”操作,也可以在復(fù)選框中選擇一個起始的OID,單擊“批量獲取”按鈕進行連續(xù)四個OID符號表示的信息的獲取,當(dāng)點擊“獲取”時,會彈出一個小窗口,需要填充該OID對應(yīng)的代理的IP地址,可以通過單擊該小窗口上的“自動獲取”按鈕進行快速獲取,然后點擊“提交”按鈕之后,通過中間交互處理模塊即后臺處理模塊向代理發(fā)送Get或者Set請求,對于“獲取”、“設(shè)置”和“批量設(shè)置”操作實現(xiàn)比較復(fù)雜,用到數(shù)據(jù)庫技術(shù)、多線程、內(nèi)存映射文件、socket套接字以及序列化與反序列化操作等,這里不做詳細說明。
2)在實驗中用到的有基于Linux操作系統(tǒng)的開發(fā)板、基于μC/OS-II[17]操作系統(tǒng)的開發(fā)板、示波器、信號發(fā)生器和溫度傳感器等設(shè)備,本測試用Linux操作系統(tǒng)的開發(fā)板進行測試,5號代理將示波器和傳感器分別接在代理的USB和UART接口上,上圖2中device-5-1和device-5-3分別代表示波器和傳感器分別接入到5號代理的接口1和接口3,選擇OID號為1.3.6.1.4.1.1199.5.1.4.0,表示5號代理第一個接口所連接的設(shè)備的第4個屬性。
圖3 MIB信息管理界面
3)在MIB信息表中,選中OID號為1.3.6.1.4.1.1199.5.1.4.0所在的行,點擊“獲取”之后,在圖5所示的窗口點擊自動獲取填充此代理的IP地址,可在MIB信息管理界面看到結(jié)果,結(jié)果如圖4所示。當(dāng)點擊該行的“設(shè)置”(SNMP協(xié)議中的Set),表示對示波器device-5-1的操作,設(shè)置其無效值為“5.1E1”,并在信息顯示窗口查看顯示結(jié)果,然后再對其設(shè)置有效值“5.0E0”,查看設(shè)置結(jié)果,當(dāng)點擊“獲取”的時候,兩次設(shè)置對比圖分別如圖6和圖7所示。
圖4 “獲取”屬性值
圖5 “設(shè)置”屬性值
圖6 第一次設(shè)置結(jié)果
圖7 第二次設(shè)置結(jié)果
本文主要研究的是局域網(wǎng)內(nèi)樹形圖的生成及遠程管理和測量,屬于LXI網(wǎng)絡(luò)儀器測控與管理的系統(tǒng)監(jiān)管平臺項目的一部分,該項目是陜西省重大科技創(chuàng)新專項資助項目,實現(xiàn)了儀器設(shè)備的遠程測量與監(jiān)控,具有創(chuàng)新性和開發(fā)的價值,該項目已經(jīng)成功驗收,測控界面直觀、易操作,達到預(yù)期目標(biāo)。