基于W5500+STM32的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];
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模式,以下是正常进入系统后串
W5500STM32SNMP协 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)