新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于W5500+STM32的SNMP協議應用

        基于W5500+STM32的SNMP協議應用

        作者: 時間:2016-11-26 來源:網絡 收藏

        ?int32 SnmpXDaemon(){

        int32 snmpfd = 0;

        int32 fromlen = 0;

        int32 retStatus = 0;

        int32 len = 0;

        uint8 loopsnmpd = 1;

        uint8 svr_addr[6];

        uint16svr_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("[Request]","",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("[Response]","",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

        elseGPIO_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 usrin”, 之后輸入 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協議啟動


        上一頁 1 2 下一頁

        關鍵詞: W5500STM32SNMP協

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 涿鹿县| 陇南市| 通渭县| 阿拉尔市| 祁连县| 拉萨市| 西充县| 张家港市| 孝感市| 油尖旺区| 山东| 瓦房店市| 淄博市| 获嘉县| 舞钢市| 繁昌县| 桦甸市| 石嘴山市| 麻栗坡县| 衡东县| 宿州市| 屏东县| 浏阳市| 肥西县| 香格里拉县| 蒲城县| 武平县| 公主岭市| 成都市| 清徐县| 德州市| 沙湾县| 盐津县| 寿阳县| 崇阳县| 芦山县| 雅安市| 綦江县| 子洲县| 丹凤县| 兴义市|