最近一個做焊接設備的朋友想在焊機上添加監控的新功能,實時獲取焊機的溫度、功耗等參數,還可簡單控制,實現對集群焊接設備的網絡化管理。而這個朋友不想在開發管理系統上花太多精力,想找一個開源的管理軟件來實現他的需求。這讓我想到了簡單郵件管理協議SNMP,它生來就是為搞網絡管理服務的。能廣泛兼容各網絡設備,一經推出就得到了廣泛的應用和支持,幾乎所有的網絡設備生產廠家都實現了對SNMP的支持,大多數網絡管理系統和平台也都是基於SNMP的。事實上,目前SNMP已成為網絡管理領域中的工業標准,我國國家廣電總局就要求通信領域的標准網絡設備都必須支持SNMP協議。SNMP代理端實際占用系統資源少,在單片機上運行是沒有問題的。於是我想到用手頭的WIZnet-W5500評估板實現了SNMP代理端,給他提供一個參考。

二 SNMP基礎普及

在實現SNMP代理端之前,我們先了解一下SNMP的基本知識。管理系統中就要有管理者和被管理者,網管協議定義它為管理站和代理端,它們通過管理信息庫MIB進行接口統一,實現數據的通信。

MIB可以認為是一個被管理對像的集合,每個對像規定了能夠被管理進程查詢和設置的信息,同時都有自己的名字我們稱之為對像標識符,簡稱OID,它的命名方法跟DNS樹形結構命名類似,通過OID就能知道這個設備所屬的領域和廠家,如MIB中有一個節點{1.3.6.1.4.1},即enterprises,代表企業,它以下的節點都為企業型的。如IBM為{1.3.6.1.4.1.2},Cisco為{1.3.6.1.4.1.9}等。任何一個公司、學校只要用電子郵件發往 [email protected] 進行申請即可獲得一個結點名。這樣就可以定義自己的產品的OID,使它能用SNMP進行管理。

為了操作管理數據庫MIB,如圖1所示:SNMP 規定了5種協議SNMP報文,用來在管理進程和代理之間的交換。1 get-request;2 get-next-request;3 set-request;4 get-response;5trap。前面的3種操作是由管理進程向代理進程發出的get/set操作,雙方都使用UDP161端口。第4個是對前三種操作的回應,用UDP161端口,第5個代理進程主動發出的報文,通知管理進程有某些事情發生,使用UDP162端口。

image

                                      圖1 SNMP的5種報文操作

圖2是封裝成UDP數據報的5種操作的SNMP報文格式。可見一個SNMP報文共有三個部分組成,即公共SNMP首部、get/set首部或trap首部、變量綁定。

image

                                                   圖2 SNMP報文格式

三 SNMP嵌入式系統實現方法

了解了SNMP協議之後,下面就讓我們通過WIZnet W5500EVB做一個嵌入式SNMP代理端的簡單實驗。

1.實驗目的:建立一個SNMP代理端

2.硬件環境

單片機:STM32F103RC,256K字節Flash,48K字節SRAM

以太網控制器:W5500,SPI接口與單片機相連

電源:USB供電

硬件外設:板載LED

3.開發工具: IAR V5.14(版本不一樣,需要稍加改動)

4.測試軟件:串口調試助手,Net-SNMP(可從網絡下載)

軟件部分是實現簡單網絡管理協議SNMP的關鍵,下面就以程序流程圖的形式看看我們是如何實現的。

圖3為主程序流程圖,我們可以看出程序首先進行單片機系統軟硬件初始化,然後初始化W5500,配置了IP地址、MAC地址、和網關。

image

                                                 圖3主程序流程圖

配置完畢後就是代理端主動發送SNMP Trap報文了,發送SNMP Trap報文的過程比較簡單,主要就是安裝Trap報文格式對發送數據進行打包即可,需要注意的是數據包要根據ASN.1中的BER編碼方式(格式類型/長度/值)進行編碼。打包完畢後,開啟UDP Socket,本地端口為162,然後向管理的162端口發送Trap包。接下來就進入一個循環,等待解析SNMP管理站發來Request數據包,邊解析,邊准備要回復的數據包,下圖為代理端解析管理站發來的GET/SET請求,並准備Response數據包的流程圖。

軟件部分是實現簡單網絡管理協議SNMP的關鍵,下面就以程序流程圖的形式看看我們是如何實現的。

圖3為主程序流程圖,我們可以看出程序首先進行單片機系統軟硬件初始化,然後初始化W5500,配置了IP地址、MAC地址、和網關。

image

                                圖4代理端解析Request程序流程圖

通過圖4流程圖我們可以看到,整個過程是嚴格按照SNMP協議一步步進行解析判斷的。需要說明的是,也是先根據SNMP編碼方式進行解碼,再進行比較和判斷。我們知道SNMP中MIB聯系管理站和代理端的關鍵,解析程序到最後查詢的便是MIB中的對像,在此我們給出定義MIB對像的結構體:

typedef struct {

   uint8 oidlen;

   uint8 oid[MAX_OID];

   uint8 dataType;

   uint8 dataLen;

   union {

      uint8octetstring[MAX_STRING];

      uint32 intval;

   } u;

   void(*getfunction)(void *, uint8 *);

   void(*setfunction)(int32);

} dataEntryType;

通過該結構體的定義我們可以知道MIB對像的幾個部分:OID ,數據類型,數據長度,數據,get函數,set函數,本方案MIB中定義的一個控制LED動作的一個對像:{8, {0x2b, 6, 1, 4, 1, 0, 2, 0},SNMPDTYPE_INTEGER, 4,{“”},  NULL, setWIZnetLed}

其中8為OID長度,0x2b是ASN.1中“1.3”的縮寫,即:1*40+3=0x2b。整個OID其實為1.3.6.1.4.1.0.2.0。該對像的set函數為setWIZnetLed:

 void setWIZnetLed(int32 val){

  wiznetLedStatus =val;// W5500-EVB

   if (wiznetLedStatus==0 )GPIO_SetBits(GPIOA, LED3); // STM32

   elseGPIO_ResetBits(GPIOA, LED3);

}

此為函數名,同樣也為函數的指針,在解析SET函數過程中有一句代碼:snmpData[id].setfunction(snmpData[id].u.intval);就是執行了該函數,其中snmpData[id].u.intval為從set Request當中解析到的綁定變量值。

整個MIB就是由上述格式的對像組成,讓可以自己定義對像的OID變量及對像的函數,當管理站向該對像發送請求時,就可以執行相應函數,從而完成你所需要讓SNMP完成的管理和控制。

完整源程序下載:http://pan.baidu.com/s/1qWmHpTE

四 測試SNMP代理端

下面以PC機為SNMP管理站,講述如何測試我們實現的SNMP代理端。

1.在電腦中安裝Net-SNMP軟件。Net-SNMP是一個免費的、開放源碼的SNMP實現方式。按默認選型安裝軟件後,點擊Windows開始——>運行 輸入“ CMD ”,點擊確認,進入DC命令環境,輸入“ cd usrbin”,此路徑即安裝的Net—SNMP默認路徑,在此路徑下可執行SNMP命令。

2.修改PC本地連接IP地址。控制面板——>網絡和Internet——>網絡連接,點擊本地連接選擇屬性,設置PC為靜態IP(與W5500在同一網段),設置完成後點擊確定,本例中我們設定PC機ip為192.168.1.110,SNMP代理端IP為192.168.1.111,默認網關都為192.168.1.1。

3.接著用網線把PC和W5500EVB連接,打開串口軟件,選擇正確的COM口並打開串口,以獲取調試信息。

4.下載編譯好的代碼並復位W5500EVB,我們發現板子上有一排LED,最右邊這個LED就是我們要查詢並且控制的。如圖5所示,現在這個LED是亮的。

image

                                                   圖5最右邊LED亮

5.在剛才打開的Net—SNMP默認路徑下可以輸入指令,如圖所示輸入“snmpget -v 1 -cpublic 192.168.1.111 .1.3.6.1.4.1.0.1.0 ”回車,查詢到“LED On”,符合板子現在亮的情況。

6.再輸入“snmpset -v 1 -cpublic 192.168.1.111 .1.3.6.1.4.1.0.2.0 i 0”回車,結合這個OID對像的set函數分析可知,該條命令是置STM32的LED3對應引腳為高,即關閉LED。如圖6觀察板子上的LED3,可見已滅。

image

                                                  圖6最右邊LED滅

7.如圖7再次輸入第5步的snmpget指令,可以查詢到狀態為“LED Off”。

image

                                  圖7 Net-SNMP工具測試SNMP協議

通過以上步驟可以看出SNMP Agent已經運行,當然要實現一個復雜的網絡管理功能還需要Net—SNMP中很多其他指令在此不一一列舉。

五總結

本文給出了基於W5500的嵌入式系統SNMP的設計與實現方案,並展示了如何用Net-SNMP調試工具進行簡單控制的方法。隨著物聯網事業的發展,越來越多的嵌入式設備都將擁有聯網功能,相信SNMP協議的作用將越來越重要。除了智能家居,在當下物聯網時代,想必還有其他應用也會遇到類似問題,希望本文能對做網絡設備開發的朋友有所幫助。