基於W5500+STM32的SNMP協議應用

WIZnet發表於2015-01-07

概述

工具: PC  W5500EVB Net-SNMP軟體包
編譯環境:Keil4 &IAR
功能:通過網路管理協議SNMP及基本的控制命令實現簡單的LED控制

一、W5500簡介
   

韓國WIZnet公司生產的乙太網控制晶片W5500整合了五層結構中的前四層,即物理層、資料鏈路層、網路層和傳輸層,並在內部利用硬體實現了TCP/IP協議棧。開發者無需專業的網路知識,使用W5500如同控制外部儲存器一樣簡單,為使用者提供了最簡單的網路接入方法。全硬體TCP/IP協議棧完全獨立於主控晶片,可以降低主晶片負載且無需移植繁瑣的TCP/IP協議棧,便於產品實現網路化更新。乙太網控制晶片W5500具有以下特點:


1、W5500支援硬體TCP/IP協議,包括TCP、UDP、ICMP、IPv4、ARP、IGMP、PPPoE和乙太網的PHY和MAC層,TCP/IP協議的硬體實現
2、支援8個獨立的SOCKET同時工作,可同時工作在不同的工作模式;
3、支援高速SPI介面(SPI MODE 0,3),SPI的時鐘最高可達到80MHz,極大地提高了網路通訊的資料傳輸速率;
4、內部整合32KB儲存器用於傳送/接收快取;
5、內嵌10BaseT/100BaseTX乙太網物理層(PHY);
6、支援自動協商(10/100-Based全雙工/半雙工);
7、工作電壓為3.3V,但I/O訊號口可承受5V電壓;

 
二、SNMP協議簡介

    SNMP:“簡單網路管理協議”,用於網路管理的協議。
SNMP定義在IP協議上,使用無連線的UDP進行通訊,SNMP支援5個基本的操作,分別是:GetRequest、GetNextRequest、SetRequest、GetResponse和Trap,這 5個操作來自各自的PDU結構。SNMP採用的是一個請求—應答的通訊方式,Trap除外,Trap不需要應答。
在具體實現上,SNMP為管理員提供了一個網管平臺(NMS),又稱為管理站,負責網管命令的發出、資料儲存、及資料分析。被監管的裝置上執行一個SNMP代理(Agent),代理實現裝置與管理站的SNMP通訊。管理站與代理端通過MIB進行介面統一,MIB定義了裝置中的被管理物件。管理站和代理都實現了相應的MIB物件,使得雙方可以識別對方的資料,實現通訊。管理站向代理申請MIB中定義的資料,代理識別後,將管理裝置提供的相關狀態或引數等資料轉換為MIB定義的格式,應答給管理站,完成一次管理操作。Agent在161埠監聽傳來的GetRequest、GetNextRequest和SetRequest命令,NMS在162埠監聽傳來的Trap。SNMP操作請求被封裝成一個簡單的UDP分組,接收端處理完請求後應答一個UDP的SNMP訊息報文;一個請求對應一個應答就完成了一次操作。
SNMP的工作方式:管理員需要向裝置獲取資料,所以SNMP提供了讀操作;管理員需要向裝置執行設定操作,所以SNMP提供了寫操作;裝置需要在重要狀況改變的時候,向管理員通報事件的發生,所以SNMP提供了Trap操作。對於網路管理,我們面對的資料是裝置的配置、引數、狀態等資訊,面對的操作是讀取和設定;同時,因為網路裝置眾多,為了能及時得到裝置的重要狀態,還要求裝置能主動地彙報重要狀態,這就是報警功能。


Get:讀取網路裝置的狀態資訊。
Set:遠端配置裝置引數。
Trap:管理站及時獲取裝置的重要資訊。

下面是管理資訊庫的物件標識

    物件命名樹的頂級物件有三個,即ISO、ITU-T和這兩個組織的聯合體。Internet(標號是1)在ISO 下的被標識組織的dod下,其識別符號為{1.3.6.1}。Internet結點下面的第二個結點是mgmt(管理),標號是2。其標識為{1.3.6.1.2.1}或{Internet(1).2.1}。這種標識為物件識別符號,即ObjectID ,簡稱OID。這裡要提一下MIB中的物件{1.3.6.1.4.1},即enterprises(企業),其所屬結點數已超過3000。例如IBM為{1.3.6.1.4.1.2},Cisco為{1.3.6.1.4.1.9},Novell為{1.3.6.1.4.1.23}等。世界上任何一個公司、學校只要用電子郵件發往iana-mib@isi.edu進行申請即可獲得一個結點名。這樣各廠家就可以定義自己的產品的被管理物件名,使它能用SNMP進行管理。


三、Net-SNMP軟體包
    目前,開發SNMP的軟體包有許多可以選擇如SNMP++、AGENT++、NET-SNMP等。這裡我們選用的是NET-SNMP。首先它是一個開源軟體,其次基於C語言開發,便於移植。
net-snmp早先是在Unix平臺下開發的。現可以移植到 Linux 、 Windows等多個平臺。Net-snmp是一個代理端軟體,但也提供管理端的查詢工具。安裝有兩種方式:一是直接安裝的二進位制包,二是需要編譯的原始碼。我們在windows平臺上安裝的二進位制包,在windows上的二進位制包的安裝就非常簡單了,只需按提示就可完成。原始碼和二進位制包可從www.net-snmp.org網站下載,本文中所用的是net-snmp5.2.1.2的版本。之所以要先安裝一個可執行的net-snmp系統,是因為我們開發程式執行環境的配置檔案,是按照預設安裝路徑內部設定搜尋的;另外,還可以利用其提供的配置工具來生成配置檔案,利用提供的查詢工具來測試程式。執行net-snmp之前先要進行環境設定,否則無法查詢到結果。

四、系統設計  

1. 硬體設計
    下圖是控制板實物圖和LED內部接線圖。MCU選用Cotex M3系列STM32F103晶片,乙太網控制晶片選用WIZnet的W5500。程式以控制D3為例詳細介紹SNMP協議的應用。D3和MCU的PA3相連,低電平有效。
   
2.程式設計
    在分析細節程式碼之前,我們還是先來看一下主函式。在這裡完成了對W5500EVB的初始化,並在主函式中加入簡單的LED燈閃爍提示,同時也為SNMP協議啟動做好準備,之後便進入SNMP協議操作程式。SNMP協議操作程式主要是snmplib和snmpdemo兩個子函式。以下是系統基本的工作流程。

    在snmplib程式中詳細介紹了SNMP協議的工作流程。以下主要對報警報文的傳送進行簡單地分析。NMS網管平臺在UDP模式下開啟162埠監聽傳來的Trap,成功得到Trap後關閉SOCK_SNMP。
int32 SnmpXTrapSend(… …)
{
………………
// Send Packet
{
uint8 svr_addr[6];
//UDPOpen(SOCK_SNMP, 162);
socket(SOCK_SNMP,Sn_MR_UDP,162,0);
ipToByteArray(managerIP, svr_addr);
sendto(SOCK_SNMP, packet_trap, packet_index, svr_addr, 162);
close(SOCK_SNMP);
return 0;
}
}

    Agent工作在UDP模式下,在SOCK_SNMP中開啟161埠監聽傳來的GetRequest、GetNextRequest和SetRequest命令。成功開啟埠以後,首先通過讀取空閒接收快取暫存器來判斷是否接收到資料。如果接收到資料,就通過recvfrom()從具體的埠和地址把資料讀出來。之後判斷資料是否正確,若果不正確就返回再次讀取,如果資料正確,就傳送到網路端執行命令。。最後關閉SOCK_SNMP,執行下一次操作。
int32 SnmpXDaemon()
{
int32 snmpfd = 0;
int32 fromlen = 0;
int32 retStatus = 0;
int32 len = 0;
uint8 loopsnmpd = 1;
uint8 svr_addr[6];
uint16  svr_port;
UNUSED(snmpfd);
UNUSED(fromlen);
UNUSED(retStatus);
//        UDPOpen(SOCK_SNMP, 161);
socket(SOCK_SNMP,Sn_MR_UDP,161,0);
WDEBUG(“Start SNMP Daemon(Agent) “);
while(loopsnmpd)
{
if ( (len = getSn_RX_RSR(SOCK_SNMP))>0 )
{
request_msg.len= recvfrom(SOCK_SNMP, (uint8 *)&request_msg.buffer[0], len, svr_addr, &svr_port);
}
else
{
request_msg.len = 0;
continue;
}
if (request_msg.len > 0)
{
dumpCode(“\r\n[Request]\r\n”,”\r\n”,request_msg.buffer,request_msg.len);
request_msg.index = 0;
response_msg.index = 0;
errorStatus = errorIndex = 0;
if (parseSNMPMessage() != -1)
{
sendto(SOCK_SNMP, response_msg.buffer, response_msg.index, svr_addr, svr_port);
}   dumpCode(“\r\n[Response]\r\n”,”\r\n”,response_msg.buffer,response_msg.index);
}
}
close(SOCK_SNMP);
return(0);
}

在snmpdemo子函式下有兩個函式,第一個定義了一個大的陣列,將MIB的不同物件都放在其中,這樣我們就可在具體的位置得到需要的資訊。
本次實驗中控制LED動作的MIB物件分別定義為:

{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。setfuction函式為setWIZnetLed:
void setWIZnetLed(int32 val)
{
wiznetLedStatus = val;
if ( wiznetLedStatus==0 )
GPIO_SetBits(GPIOA, LED3); // LED in the W5500-EVB
else
GPIO_ResetBits(GPIOA, LED3);
}
此為函式名,同樣也為函式的指標,在解析SET函式過程中有一句程式碼:snmpData[id].setfunction(snmpData[id].u.intval);
就是執行了該函式,其中snmpData[id].u.intval 為從set Request當中解析到的繫結變數值。下面為查詢LED狀態的MIB物件:

{8, {0x2b, 6, 1, 4, 1, 0, 1, 0}, SNMPDTYPE_OCTET_STRING, 30, {“”},getWIZnetLed, NULL}
其中getWIZnetLed定義為:
void getWIZnetLed(void *ptr, uint8 *len)
{
if ( wiznetLedStatus==0 )
*len = sprintf((int8 *)ptr, “LED Off”);
else
*len = sprintf((int8 *)ptr, “LED On”);
}
五、測試效果及注意問題
1. 測試效果
    首先開啟網路連線,點選本地連線選擇屬性,設定PC為靜態IP(與W5500在同一網段),完成後點選確定。用網線把PC和W5500EVB連線,開啟串列埠軟體,選擇正確的COM口並開啟串列埠,以獲取除錯資訊。點選復位可以看到LED2在閃爍,之後進入SNMP Agent模式,以下是正常進入系統後串列埠的列印資訊。

然後開啟執行–>“CMD” , 輸入 “cd \usr\bin”, 之後輸入 SNMP命令。

上圖輸入“snmpget -v 1 -c public 192.168.1.111 .1.3.6.1.4.1.0.2.0”回車,通過Get命令得到此變數為1。
輸入“snmpget -v 1 -c public 192.168.1.111 .1.3.6.1.4.1.0.1.0”回車,如上圖所示,得到LED狀態為“LED ON”。
輸入“snmpset -v 1 -c public 192.168.1.111 .1.3.6.1.4.1.0.2.0 i 0”回車,如上圖所示,設定變數為0。
輸入“snmpget -v 1 -c public 192.168.1.111 .1.3.6.1.4.1.0.2.0”回車,如圖所示,得到該變數為0。
輸入“snmpget -v 1 -c public 192.168.1.111 .1.3.6.1.4.1.0..0”回車,如上圖所示,得到LED狀態為“LED OFF”。


通過以上5步可以清楚地發現,通過snmpset命令可以方便快速設定LED的狀態;在不清楚LED狀態的情況下,也可以通過snmpget命令得到,從而實現快速有效的控制。
我們通過串列埠助手可得下圖Request 和Response 包
 

2.注意問題

1.最基本的要注意保持程式和串列埠工具波特率一致,否則無法正常觀察操作資訊,以免引起誤導
2.切記如果是EVB和電腦通過網線直接,需修改電腦IP為靜態IP且和W5500EVB設定IP在同一個網段,否則不能實現測試效果,如果是通過路由器測試則不需修改
3.如果大家需要在自己的除錯板測試,需要將所有LED燈修改為和自己的除錯版對應,以免產生錯誤
4.輸入測試指令時要注意不同指令之間的空格以及點,Public後面的IP地址正是你在程式中給除錯板設定IP地址;後面的OID資訊跟snmpdemo子函式下定義的陣列中資訊對應,對照看也可以幫助大家理解
5.Net-SNMP軟體一定要安裝,安裝哪個盤不限制,但是安裝在C盤最好,更方便SNMP協議啟動

程式碼請登入阿莫電子論壇下載:http://www.amobbs.com/thread-5607833-1-1.html

相關文章