新闻中心

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协

评论


技术专区

关闭