2021-09-12 16:26:11 索煒達(dá)電子 895
項(xiàng)目編號(hào):E1120
文件大?。?.51M
源碼說明:帶中文注釋
開發(fā)環(huán)境:C編譯器
簡要概述:
概述
工具: PC W5500EVB Net-SNMP軟件包
編譯環(huán)境:Keil4 &IAR
功能:通過網(wǎng)絡(luò)管理協(xié)議SNMP及基本的控制命令實(shí)現(xiàn)簡單的LED控制
一、W5500簡介
韓國WIZnet公司生產(chǎn)的以太網(wǎng)控制芯片W5500整合了五層結(jié)構(gòu)中的前四層,即物理層、數(shù)據(jù)鏈路層、網(wǎng)絡(luò)層和傳輸層,并在內(nèi)部利用硬件實(shí)現(xiàn)了TCP/IP協(xié)議棧。開發(fā)者無需專業(yè)的網(wǎng)絡(luò)知識(shí),使用W5500如同控制外部存儲(chǔ)器一樣簡單,為用戶提供了最簡單的網(wǎng)絡(luò)接入方法。全硬件TCP/IP協(xié)議棧完全獨(dú)立于主控芯片,可以降低主芯片負(fù)載且無需移植繁瑣的TCP/IP協(xié)議棧,便于產(chǎn)品實(shí)現(xiàn)網(wǎng)絡(luò)化更新。以太網(wǎng)控制芯片W5500具有以下特點(diǎn):
1、W5500支持硬件TCP/IP協(xié)議,包括TCP、UDP、ICMP、IPv4、ARP、IGMP、PPPoE和以太網(wǎng)的PHY和MAC層,TCP/IP協(xié)議的硬件實(shí)現(xiàn)
2、支持8個(gè)獨(dú)立的SOCKET同時(shí)工作,可同時(shí)工作在不同的工作模式;
3、支持高速SPI接口(SPI MODE 0,3),SPI的時(shí)鐘最高可達(dá)到80MHz,極大地提高了網(wǎng)絡(luò)通信的數(shù)據(jù)傳輸速率;
4、內(nèi)部集成32KB存儲(chǔ)器用于發(fā)送/接收緩存;
5、內(nèi)嵌10BaseT/100BaseTX以太網(wǎng)物理層(PHY);
6、支持自動(dòng)協(xié)商(10/100-Based全雙工/半雙工);
7、工作電壓為3.3V,但I(xiàn)/O信號(hào)口可承受5V電壓;
二、SNMP協(xié)議簡介
SNMP:“簡單網(wǎng)絡(luò)管理協(xié)議”,用于網(wǎng)絡(luò)管理的協(xié)議。
SNMP定義在IP協(xié)議上,使用無連接的UDP進(jìn)行通信,SNMP支持5個(gè)基本的操作,分別是:GetRequest、GetNextRequest、SetRequest、GetResponse和Trap,這 5個(gè)操作來自各自的PDU結(jié)構(gòu)。SNMP采用的是一個(gè)請(qǐng)求---應(yīng)答的通信方式,Trap除外,Trap不需要應(yīng)答。
在具體實(shí)現(xiàn)上,SNMP為管理員提供了一個(gè)網(wǎng)管平臺(tái)(NMS),又稱為管理站,負(fù)責(zé)網(wǎng)管命令的發(fā)出、數(shù)據(jù)存儲(chǔ)、及數(shù)據(jù)分析。被監(jiān)管的設(shè)備上運(yùn)行一個(gè)SNMP代理(Agent),代理實(shí)現(xiàn)設(shè)備與管理站的SNMP通信。管理站與代理端通過MIB進(jìn)行接口統(tǒng)一,MIB定義了設(shè)備中的被管理對(duì)象。管理站和代理都實(shí)現(xiàn)了相應(yīng)的MIB對(duì)象,使得雙方可以識(shí)別對(duì)方的數(shù)據(jù),實(shí)現(xiàn)通信。管理站向代理申請(qǐng)MIB中定義的數(shù)據(jù),代理識(shí)別后,將管理設(shè)備提供的相關(guān)狀態(tài)或參數(shù)等數(shù)據(jù)轉(zhuǎn)換為MIB定義的格式,應(yīng)答給管理站,完成一次管理操作。Agent在161端口監(jiān)聽傳來的GetRequest、GetNextRequest和SetRequest命令,NMS在162端口監(jiān)聽傳來的Trap。SNMP操作請(qǐng)求被封裝成一個(gè)簡單的UDP分組,接收端處理完請(qǐng)求后應(yīng)答一個(gè)UDP的SNMP消息報(bào)文;一個(gè)請(qǐng)求對(duì)應(yīng)一個(gè)應(yīng)答就完成了一次操作。
SNMP的工作方式:管理員需要向設(shè)備獲取數(shù)據(jù),所以SNMP提供了讀操作;管理員需要向設(shè)備執(zhí)行設(shè)置操作,所以SNMP提供了寫操作;設(shè)備需要在重要狀況改變的時(shí)候,向管理員通報(bào)事件的發(fā)生,所以SNMP提供了Trap操作。對(duì)于網(wǎng)絡(luò)管理,我們面對(duì)的數(shù)據(jù)是設(shè)備的配置、參數(shù)、狀態(tài)等信息,面對(duì)的操作是讀取和設(shè)置;同時(shí),因?yàn)榫W(wǎng)絡(luò)設(shè)備眾多,為了能及時(shí)得到設(shè)備的重要狀態(tài),還要求設(shè)備能主動(dòng)地匯報(bào)重要狀態(tài),這就是報(bào)警功能。
Get:讀取網(wǎng)絡(luò)設(shè)備的狀態(tài)信息。
Set:遠(yuǎn)程配置設(shè)備參數(shù)。
Trap:管理站及時(shí)獲取設(shè)備的重要信息。
下面是管理信息庫的對(duì)象標(biāo)識(shí)
對(duì)象命名樹的頂級(jí)對(duì)象有三個(gè),即ISO、ITU-T和這兩個(gè)組織的聯(lián)合體。Internet(標(biāo)號(hào)是1)在ISO 下的被標(biāo)識(shí)組織的dod下,其標(biāo)識(shí)符為{1.3.6.1}。Internet結(jié)點(diǎn)下面的第二個(gè)結(jié)點(diǎn)是mgmt(管理),標(biāo)號(hào)是2。其標(biāo)識(shí)為{1.3.6.1.2.1}或{Internet(1).2.1}。這種標(biāo)識(shí)為對(duì)象標(biāo)識(shí)符,即ObjectID ,簡稱OID。這里要提一下MIB中的對(duì)象{1.3.6.1.4.1},即enterprises(企業(yè)),其所屬結(jié)點(diǎn)數(shù)已超過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}等。世界上任何一個(gè)公司、學(xué)校只要用電子郵件發(fā)往iana-mib@isi.edu進(jìn)行申請(qǐng)即可獲得一個(gè)結(jié)點(diǎn)名。這樣各廠家就可以定義自己的產(chǎn)品的被管理對(duì)象名,使它能用SNMP進(jìn)行管理。
三、Net-SNMP軟件包
目前,開發(fā)SNMP的軟件包有許多可以選擇如SNMP++、AGENT++、NET-SNMP等。這里我們選用的是NET-SNMP。首先它是一個(gè)開源軟件,其次基于C語言開發(fā),便于移植。
net-snmp早先是在Unix平臺(tái)下開發(fā)的?,F(xiàn)可以移植到 Linux 、 Windows等多個(gè)平臺(tái)。Net-snmp是一個(gè)代理端軟件,但也提供管理端的查詢工具。安裝有兩種方式:一是直接安裝的二進(jìn)制包,二是需要編譯的源代碼。我們?cè)趙indows平臺(tái)上安裝的二進(jìn)制包,在windows上的二進(jìn)制包的安裝就非常簡單了,只需按提示就可完成。源代碼和二進(jìn)制包可從www.net-snmp.org網(wǎng)站下載,本文中所用的是net-snmp5.2.1.2的版本。之所以要先安裝一個(gè)可運(yùn)行的net-snmp系統(tǒng),是因?yàn)槲覀冮_發(fā)程序運(yùn)行環(huán)境的配置文件,是按照默認(rèn)安裝路徑內(nèi)部設(shè)定搜索的;另外,還可以利用其提供的配置工具來生成配置文件,利用提供的查詢工具來測(cè)試程序。運(yùn)行net-snmp之前先要進(jìn)行環(huán)境設(shè)置,否則無法查詢到結(jié)果。
四、系統(tǒng)設(shè)計(jì)
1. 硬件設(shè)計(jì)
下圖是控制板實(shí)物圖和LED內(nèi)部接線圖。MCU選用Cotex M3系列STM32F103芯片,以太網(wǎng)控制芯片選用WIZnet的W5500。程序以控制D3為例詳細(xì)介紹SNMP協(xié)議的應(yīng)用。D3和MCU的PA3相連,低電平有效。
2.程序設(shè)計(jì)
在分析細(xì)節(jié)代碼之前,我們還是先來看一下主函數(shù)。在這里完成了對(duì)W5500EVB的初始化,并在主函數(shù)中加入簡單的LED燈閃爍提示,同時(shí)也為SNMP協(xié)議啟動(dòng)做好準(zhǔn)備,之后便進(jìn)入SNMP協(xié)議操作進(jìn)程。SNMP協(xié)議操作程序主要是snmplib和snmpdemo兩個(gè)子函數(shù)。以下是系統(tǒng)基本的工作流程。
在snmplib程序中詳細(xì)介紹了SNMP協(xié)議的工作流程。以下主要對(duì)報(bào)警報(bào)文的發(fā)送進(jìn)行簡單地分析。NMS網(wǎng)管平臺(tái)在UDP模式下打開162端口監(jiān)聽傳來的Trap,成功得到Trap后關(guān)閉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端口監(jiān)聽傳來的GetRequest、GetNextRequest和SetRequest命令。成功打開端口以后,首先通過讀取空閑接收緩存寄存器來判斷是否接收到數(shù)據(jù)。如果接收到數(shù)據(jù),就通過recvfrom()從具體的端口和地址把數(shù)據(jù)讀出來。之后判斷數(shù)據(jù)是否正確,若果不正確就返回再次讀取,如果數(shù)據(jù)正確,就發(fā)送到網(wǎng)絡(luò)端執(zhí)行命令。。最后關(guān)閉SOCK_SNMP,執(zhí)行下一次操作。
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子函數(shù)下有兩個(gè)函數(shù),第一個(gè)定義了一個(gè)大的數(shù)組,將MIB的不同對(duì)象都放在其中,這樣我們就可在具體的位置得到需要的信息。
本次實(shí)驗(yàn)中控制LED動(dòng)作的MIB對(duì)象分別定義為:
{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。整個(gè)OID其實(shí)為1.3.6.1.4.1.0.2.0。setfuction函數(shù)為setWIZnetLed:
void setWIZnetLed(int32 val)
{
wiznetLedStatus = val;
if ( wiznetLedStatus==0 )
GPIO_SetBits(GPIOA, LED3); // LED in the W5500-EVB
else
GPIO_ResetBits(GPIOA, LED3);
}
此為函數(shù)名,同樣也為函數(shù)的指針,在解析SET函數(shù)過程中有一句代碼:snmpData[id].setfunction(snmpData[id].u.intval);
就是執(zhí)行了該函數(shù),其中snmpData[id].u.intval 為從set Request當(dāng)中解析到的綁定變量值。下面為查詢LED狀態(tài)的MIB對(duì)象:
{8, {0x2b, 6, 1, 4, 1, 0, 1, 0}, SNMPDTYPE_OCTET_STRING, 30, {""},getWIZnetLed, NULL}
其中g(shù)etWIZnetLed定義為:
void getWIZnetLed(void *ptr, uint8 *len)
{
if ( wiznetLedStatus==0 )
*len = sprintf((int8 *)ptr, "LED Off");
else
*len = sprintf((int8 *)ptr, "LED On");
}
五、測(cè)試效果及注意問題
1. 測(cè)試效果
首先打開網(wǎng)絡(luò)連接,點(diǎn)擊本地連接選擇屬性,設(shè)置PC為靜態(tài)IP(與W5500在同一網(wǎng)段),完成后點(diǎn)擊確定。用網(wǎng)線把PC和W5500EVB連接,打開串口軟件,選擇正確的COM口并打開串口,以獲取調(diào)試信息。點(diǎn)擊復(fù)位可以看到LED2在閃爍,之后進(jìn)入SNMP Agent模式,以下是正常進(jìn)入系統(tǒng)后串口的打印信息。
然后打開運(yùn)行-->“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狀態(tài)為“LED ON”。
輸入“snmpset -v 1 -c public 192.168.1.111 .1.3.6.1.4.1.0.2.0 i 0”回車,如上圖所示,設(shè)置變量為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狀態(tài)為“LED OFF”。
通過以上5步可以清楚地發(fā)現(xiàn),通過snmpset命令可以方便快速設(shè)置LED的狀態(tài);在不清楚LED狀態(tài)的情況下,也可以通過snmpget命令得到,從而實(shí)現(xiàn)快速有效的控制。
我們通過串口助手可得下圖Request 和Response 包
2.注意問題
1.最基本的要注意保持程序和串口工具波特率一致,否則無法正常觀察操作信息,以免引起誤導(dǎo)
2.切記如果是EVB和電腦通過網(wǎng)線直接,需修改電腦IP為靜態(tài)IP且和W5500EVB設(shè)置IP在同一個(gè)網(wǎng)段,否則不能實(shí)現(xiàn)測(cè)試效果,如果是通過路由器測(cè)試則不需修改
3.如果大家需要在自己的調(diào)試板測(cè)試,需要將所有LED燈修改為和自己的調(diào)試版對(duì)應(yīng),以免產(chǎn)生錯(cuò)誤
4.輸入測(cè)試指令時(shí)要注意不同指令之間的空格以及點(diǎn),Public后面的IP地址正是你在程序中給調(diào)試板設(shè)置IP地址;后面的OID信息跟snmpdemo子函數(shù)下定義的數(shù)組中信息對(duì)應(yīng),對(duì)照看也可以幫助大家理解
5.Net-SNMP軟件一定要安裝,安裝哪個(gè)盤不限制,但是安裝在C盤最好,更方便SNMP協(xié)議啟動(dòng)