-
實驗要求
-
添加並開啟Windows SNMP代理組件;
-
編制控制台程序,接受用戶輸入的OID字符串,返回在Windows SNMP代理中的對應值;
-
開發GUI界面程序,使用戶可通過該程序觀察主機CPU、內存、硬盤空間、流量值;
-
開發閾值告警功能,用戶通過界面可設置性能閾值(如CPU),當超過閾值時自動報警。
-
實驗過程
-
安裝並開啟Windows SNMP代理組件
安裝並開啟Windows SNMP組件操作很簡單,主要是通過"打開或關閉Windows功能"這個系統工具來完成,具體步驟因操作系統而已。以Windows 7 為例,點擊開始菜單的"控制面板",在新窗口左側選擇"程序",在右側點擊"打開或關閉Windows功能",彈出如下圖所示的窗口,勾選"簡單網絡管理協議(SNMP)",包括它的子項"WMI SNMP提供程序",點擊"確定",會有幾分鍾的等待時間。
這樣Windows SNMP 服務就已經安裝好了,一般而言,這個服務也就啟動了。當然,也可以通過Windows服務管理器確認一下相應服務的運行狀態,並可以做必要的設置等操作。方法為,按快捷鍵Win + R,輸入"services.msc",打開Windows 服務管理器,如下圖。
滾動到SNMP Services,可以看到它的狀態是已啟動。在左側窗口中可以停止或重啟這個服務。
-
開發SnmpWatcher程序
SnmpWatcher是實現作業要求第2-4項的Windows程序。這套程序的功能本質是一個SNMP Client,對應的SNMP Sever是Windows,具體而言是前文安裝和啟動的SNMP Service程序。通過閱讀相應的RFC文檔,實現這樣一個C/S模式的客戶端,沒有什么難度,不過卻較為繁瑣,好在已經有開發者提供了一套開源的SNMP庫——SNMP Sharp Net,官方網站是http://www.snmpsharpnet.com/,開源項目代碼托管在Sourceforge,地址是http://sourceforge.net/projects/snmpsharpnet/。SnmpWatcher就使用這個庫。
下面簡單介紹一下SnmpWatcher這個程序的開發。
開發環境和工具如下表。
開發環境和工具 |
|
設備 |
|
ASUS A41IE 筆記本電腦 |
|
軟件 |
|
操作系統 |
Windows 7 Ultimate with SP1, 32 bit(需要安裝和開啟SNMP服務) |
開發工具 |
Microsoft Visual C# 2010 Express |
網絡 |
|
可以不需要 |
特別說明的是,在這個實驗的開發過程中訪問的SNMP Server是開發環境的主機,其實也可以是有網絡鏈接的其他主機,不過簡單起見,就只用了開發主機了,所以網絡可以是不需要的,在實際應用時,SNMP協議必然是運行在網絡環境中的。
項目的文件目錄如下圖所示。現在簡單說明一下主要class和namespace的設計。
-
Program
這個是應用程序的主類,即包含了Main方法入口。Program類保存了應用程序運行的重要數據作為自己的屬性,如SNMP HOST和COMMUNITY,同時負責在啟動時讀取配置文件"snmpwathcer.ini",這個文件設置了HOST和COMMUNITY數據和用戶界面方式命令行或圖形窗口,下面是一個"snmpwatcher.ini"的標准模版。
;This is the config file for SnmpWatcher
[SnmpWatcher]
Host=localhost
Community=public
UI=window
-
工具類
即IniFile和SnmpWatcher,IniFile是讀取上文提到了"snmpwatcher.ini"配置文件的工具類,主要在Program類中使用。SnmpWatcher是對SnmpSharpNet進行簡單封裝的工具類,主要在Calc相關類中使用。
-
Stat
這個名字空間是主要提供了數據類,即對作業要求監控的CPU、內存、硬盤空間、流量值等的數據的封裝,對應的類分別是CpuStat、MemoryStat、DiskStat、NetworkStat。另外一個類Stat是這些類的基類,只作為類型的約束,沒有定義屬性和實際意義。
各個類的屬性和含義,如下表。
數據類屬性說明 |
||
CpuStat |
||
CoreNum:uint |
CPU內核數 |
|
Loads:List<uint> |
CPU負載數列 |
|
LoadRate:double |
CPU負載率(負載和/100) |
|
MemoryStat |
||
Size:uint |
內存總空間 |
|
UsedSize:uint |
內存使用空間 |
|
UsedRate:double |
內存使用率 |
|
DiskStat |
||
Size:uint |
磁盤總空間 |
|
UsedSize:uint |
磁盤使用空間 |
|
UsedRate:double |
磁盤使用率 |
|
NetworkStat |
||
InBytes:uint |
流進字節數 |
|
OutBytes:uint |
流出字節數 |
-
Clac類
這個名字空間這個名字空間下有1個接口和4個類,用於和Host通信,提交含有OID的SNMP請求,讀取SNMP響應報文並作解析,獲得系統的CPU、內存、硬盤、網絡狀態數據信息,存儲到對應的Stat類中。
接口是ICalc,接口定義如下。
interface ICalc<T> where T : Stat
{
T CalcStat();
}
其余4個類實現了這個接口,四個類分別實現的功能和使用到的OID如下表所示。
Calc類 |
功能 |
使用到的OID |
含義 |
CpuCalc |
查詢CPU狀態數據,存儲在CpuStat對象中 |
.1.3.6.1.2.1.25.3.3.1.2 |
遍歷各個CPU的內核的負載 |
MemoryCalc |
查詢內存狀態數據,存儲在MemoryStat對象中 |
1.3.6.1.2.1.25.2.3.1.2 |
存儲單元類型 |
1.3.6.1.2.1.25.2.3.1.4 |
存儲單元大小 |
||
1.3.6.1.2.1.25.2.3.1.5 |
總存儲單元數 |
||
1.3.6.1.2.1.25.2.3.1.6 |
使用存儲單元數 |
||
1.3.6.1.2.1.25.2.1.2 |
內存存儲單元類型碼 |
||
DiskCalc |
查詢硬盤狀態數據,存儲在DiskStat對象中 |
1.3.6.1.2.1.25.2.3.1.2 |
存儲單元類型 |
1.3.6.1.2.1.25.2.3.1.4 |
存儲單元大小 |
||
1.3.6.1.2.1.25.2.3.1.5 |
總存儲單元數 |
||
1.3.6.1.2.1.25.2.3.1.6 |
使用存儲單元數 |
||
1.3.6.1.2.1.25.2.1.4 |
硬盤存儲單元類型碼 |
||
NetworkCalc |
查詢硬盤狀態數據,存儲在NetwrokStat對象中 |
1.3.6.1.2.1.2.2.1.6 |
物理地址 |
1.3.6.1.2.1.2.2.1.10 |
輸入字節數 |
||
1.3.6.1.2.1.2.2.1.16 |
輸出字節數 |
需要說明的是,在1.3.6.1.2.1.25.2下內存和硬盤被抽象成同一種存儲設備,通過1.3.6.1.2.1.25.2.3.1.2這個值進行類別判斷。這個過程相對比較復雜,具體解析過程,還是請查閱源代碼。
-
UI
這個名字空間提供了兩套用戶接口,一個是命令行的(Console1),另一個是圖形窗口的(Form1),另外的兩個類Form1Settings是對Form1數據的抽象,主要是Form1的刷新時間和CPU、內存、磁盤的告警閾值,Form1SettingsDialog是修改閾值的窗口類,Form1Settings在Form1SettingsDialog和Form1間傳遞。
Console1,實現的功能比較簡單,主要是完成了作業的第2個要求,即通過輸入OID查詢系統狀態信息,另外提供了一個命令打開圖像窗口,使用演示如下圖所示。
Form1實現了作業的另兩個要求,使用演示如下圖。
這個窗口顯示監視主機的狀態信息,可以驗證和當前主機的實際信息是一致的,除了CPU會有些誤差,這個誤差出現的原因,我還在思考中。
點擊Settings進入設置對話框。把Memory Threshold設為50以后點OK,返回主界面,這時等待刷新,然后可以看到狀態欄出現了"WARNING"的紅色警告。
-
附:SnmpWatcher程序源代碼
我把SnmpWatcher的源代碼放到了Bitbucket上,可以通過hg下載全部源代碼,命令如下:
hg clone https://bitbucket.org/tt_0411_09/snmpwatcher
當然也可以在Bitbucket上在線查看,地址是:
https://bitbucket.org/tt_0411_09/snmpwatcher/src