概述

工具: 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}等。 世界上任何一個公司、學校只要用電子郵件發往[email protected]進行申請即可獲得一個結點名。 這樣各廠家就可以定義自己的產品的被管理對象名,使它能用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(“rn[Request] rn”, ”rn”, 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(“rn[Response] rn”, ”rn”, 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 usrbin”,之後輸入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協議啟動

代碼請登錄來源的阿莫電子論壇下載

通過:iwiznet.cn