用snmp4j開發網管應用(一) - SNMP
要開發網管應用,SNMP是必學的協議,這裏首先對SNMP進行一下簡單的介紹和想要開發SNMP協議的內容所需要用到的工具。
SNMP
SNMP 協議分為了多個版本,V1太簡單,V2加入了一些驗證,V3最嚴謹,下麵都是以V2進行說明
概念:
ASN.1 高級數據描述語言,用於定義數據類型,語法規則等。
BER ASN.1的基本編碼規則,發送消息之前經過其編碼,接收後先解碼
SMI 管理信息結構,ASN.1的子集加上一部分宏等內容。SNMP用它來描述MIB和PDU
MIB 管理信息庫,一般是一個樹形結構,使用SMI描述,用來定義一個或者多個網元
OID 網絡節點的唯一ID,用在MIB中,是一個國際機構統一分配的,比如1.3.6.1.4.1代表enterprises企業網
PDU SNMP協議數據單元,是一個數據包的格式。每一種SNMP方法對應一種PDU,使用SMI描述,BER編碼,傳輸層(UDP)協議進行傳輸
SNMP跟網管有關的開發可能會涉及如下的內容:
1. 獲取網元信息
- 網元已經存在,其提供MIB文件,其中定義了該網元節點的結構以及想獲取該結構內容所需要用到的OID
- 使用代碼或者其他的方式構建PDU,比如用snmp4j構建一個get請求類型的PDU(這個PDU是SMI描述的,BER編碼的,包含了要操作的OID)到網元,得到返回結果。
- 根據返回結果進行操作(可以通過getNext達到遍曆的效果),或者是把單純的數據信息持久化起來用於觀察。
2. 設置網元參數
- 發送set請求的PDU到網元達到設置網元某個參數的作用
3. 開發trap服務器接收trap消息
- 開發trap接收服務端,並在在網元端配置服務器端地址,網元因為某個時間出發一個trap發送到該服務端。
- 服務端記錄該trap消息,用於數據分析
4. 開發一個網元模擬器
- 開發一個模擬器,自己作為網元被人管理,通常用於測試。因為網管係統對應的真是網元都是昂貴的硬件,不容易找到合適的測試環境。
為了進行網元開發,首先我們需要準備一下所用到的工具
MIB Browser
我上傳的一個免費版本:https://download.csdn.net/detail/three_man/7477903
官網下載地址:https://ireasoning.com/download.shtml
可以下載
iReasoning MIB Browser Free Personal Edition |
這個版本是個人版,沒有時間限製,但是有導入的mib文件數量的限製,不過很適合開發使用。
我自己寫了一個文件可以來這裏上傳:https://download.csdn.net/detail/three_man/7477887
這裏對這個文件進行簡單的說明。
文件主要內容:
CMS-MIB DEFINITIONS ::= BEGIN// 文件描述開始
IMPORTS MODULE-IDENTITY, OBJECT-TYPE, Counter32, Gauge32, Integer32, enterprises,// 導入基本的庫,特別注意enterprises.他的oid是1.3.6.1.4.1
convediaCorp OBJECT IDENTIFIER ::= { enterprises 7569 }// 定義了一個節點,表示他是enterprises+ 7569,所以他的Oid是1.3.6.1.4.1.7569
nodeInfo OBJECT IDENTIFIER ::= { msMIBObjects 1 }// 按照上麵的類推,這個節點的Oid為.1.3.6.1.4.1.7569.1.2.1.1
nodeLicensedPorts OBJECT-TYPE SYNTAX Integer32 (0.. 65535) MAX-ACCESS read-only STATUS current DESCRIPTION "Future: The maximum number of ports licensed for this MS." DEFVAL { 18000 } ::= { nodeInfo 1 }
// 表示從屬於nodeInfo的一個節點。其Oid為.1.3.6.1.4.1.7569.1.2.1.1.1.0可以通過get OID這樣的結構得到這個屬性的值,後續會說具體的方式。
這裏說一下SMI定義一個OBJECT-TYPE的結構。
- SYNTAX表示值的類型為Integer32,SMI本身定義了很少的基本類型和一個複合類型Sequences.
- MAX-ACCESS 訪問權限,這個在MibBrowers中read-only表示為一個葉子,write表示為一個筆尖
alarmTable OBJECT IDENTIFIER ::= { msMIBObjects 23 } alarmEventTable OBJECT-TYPE SYNTAX SEQUENCE OF AlarmEventEntry MAX-ACCESS not-accessible STATUS current DESCRIPTION "A list of alarm status history entries." ::= { alarmTable 3 } alarmEventEntry OBJECT-TYPE SYNTAX AlarmEventEntry MAX-ACCESS not-accessible STATUS current DESCRIPTION "An entry in the Alarm Event Table." INDEX { aleEventIndex } ::= { alarmEventTable 1 } AlarmEventEntry ::= SEQUENCE { aleEventIndex Unsigned32, aleSequenceID Unsigned32, aleEventTime DateAndTime, aleEventType EventType, aleAlarmID Unsigned32, aleAlarmText DisplayString, aleAlarmSeverity AlarmSeverity, aleInstanceID Unsigned32, aleSlotNumber Unsigned32 } aleEventIndex OBJECT-TYPE SYNTAX Unsigned32 (1.. 2000 ) MAX-ACCESS not-accessible STATUS current DESCRIPTION "This object is used as a key attribute to specify the row entry in this table." ::= { alarmEventEntry 1 } aleSequenceID OBJECT-TYPE SYNTAX Unsigned32 MAX-ACCESS read-only STATUS current DESCRIPTION "Unique sequential event identification number." ::= { alarmEventEntry 2 }// 關鍵來了,這裏定義了一個Table,SMI中使用SEQUENCE 來定義複雜的結構,該結構可以看做是一個表,然後可以通過get,getNext來遍曆這張表中的內容。
alarm001 NOTIFICATION-TYPE OBJECTS { aleSequenceID, aleEventType, aleAlarmID, aleInstanceID, aleAlarmText, aleAlarmSeverity, aleEventTime, aleSlotNumber } STATUS current DESCRIPTION "External alarm 1 has been triggered. Text and severity of this alarm are user-configurable. This alarm is deactivated when the external contact is cleared." --#SUMMARY "Alarm #001: %s. Slot: %d Event type: %d Severity: %d Instance: %d Sequence: #%d" --#ARGUMENTS {4,7,1,5,3,0} --#SEVERITY MAJOR --#TIMEINDEX 10 --#STATE OPERATIONAL ::= { msTraps 11 } // 這個注意NOTIFICATION-TYPE,其定義了一個Trap消息,還定義了該trap消息中的內容是使用了AlarmTable中的內容。
好了基本上一個網元在設計的時候都是先去申請OID節點,然後設計這個MIB文件座位開發的標準。
然後我們使用MibBrowser導入它。
下載安裝MibBrowser打開它。

點擊File->Load MIBS,選擇一個mib文件打開就會得到上麵的樣子了。
我們再來看看其他功能。
1. get

- 在左樹中選擇要操作的節點,
- 最上麵Address中輸入網元地址,這裏是筆者自己寫的一個模擬器,後麵會把模擬器的代碼奉上。
- Advanced可以設置SNMP的版本,一個用來身份驗證的Community和端口
- Operations選擇為Get,此外還能選擇為Getnext walk等。 點擊Go.截圖沒截到
- 這樣就完成了一個請求操作,在後下的列表中會返回結果
2. getNext
與1相同,隻是Operations設置為GetNext
3. walk
與1相同,Operations設置為walk,這個的返回結果會是一個列表。會默認輪詢調用getNext獲取整個Mib結構的所有值。

4, trapReceiver
打開TrapReceiver. Tool->Trap Receiver.
按照5中的方式發送Trap
然後看到結果:

輸入一些信息,點擊SendTrap,在4中看結果
好了基本就這麼多的功能了,因為SNMP本身就是很簡單的協議。這些功能也是我們之後在開發中要用代碼實現的。
Linux SNMP服務
這個有可能需要安裝,也是比較好用的。主要的命令格式是:
snmpget -v2c -c CONV 10.85.134.194 .1.3.6.1.2.1.1.1.0
snmpwalk -v2c -c CONV 10.32.147.19:10161 1.3.6.1.4.1.7569.1.2.1.28.1
這個一看明了了吧, -v2c是版本, -c是Community, 然後是ip:port oid.
Linux上開發必備
SNMP4J
這個是下一篇要說的內容,是基於Java的開源的開發SNMP的包。下一篇具體說。
最後更新:2017-04-03 07:56:58