上海皕科电子有限公司
转载: 基于W5500的嵌入式SNMP代理端实现
发起人:Queen  回复数:0  浏览数:3793  最后更新:2015-4-22 11:50:52 by Queen

发表新帖  帖子排序:
2015-4-22 11:49:39
Queen





角  色:管理员
发 帖 数:18
注册时间:2015-4-17
转载: 基于W5500的嵌入式SNMP代理端实现








实验背景




最近一个做焊接设备的朋友想在焊机上添加监控的新功能,实时获取焊机的温度、功耗等参数,还可简单控制,实现对集群焊接设备的网络化管理。



而这个朋友不想在开发管理系统上花太多精力,想找一个开源的管理软件来实现他的需求。这让我想到了简单邮件管理协议SNMP

,它生来就是为搞网络管理服务的。能广泛兼容各网络设备,一经推出就得到了广泛的应用和支持,几乎所有的网络设备生产厂家都实现了对SNMP

的支持,大多数网络管理系统和平台也都是基于SNMP

的。事实上,目前SNMP

已成为网络管理领域中的工业标准,我国国家广电总局就要求通信领域的标准网络设备都必须支持SNMP

协议。SNMP

代理端实际占用系统资源少,在单片机上运行是没有问题的。于是我想到用手头的WIZnet-W5500

评估板实现了SNMP

代理端,给他提供一个参考。










SNMP



基础普及




[align=left][align=left]在实现SNMP

代理端之前,我们先了解一下SNMP

的基本知识。管理系统中就要有管理者和被管理者,网管协议定义它为管理站和代理端,它们通过管理信息库MIB

进行接口统一,实现数据的通信。


[/align]

[align=left]MIB

可以认为是一个被管理对象的集合,每个对象规定了能够被管理进程查询和设置的信息,同时都有自己的名字我们称之为对象标识符,简称OID

,它的命名方法跟DNS

树形结构命名类似,通过OID

就能知道这个设备所属的领域和厂家,如MIB

中有一个节点{1.3.6.1.4.1}

,即enterprises

,代表企业,它以下的节点都为企业型的。如IBM

为{1.3.6.1.4.1.2}

,Cisco

为{1.3.6.1.4.1.9}

等。任何一个公司、[email=%E5%AD%A6%E6%A0%A1%E5%8F%AA%E8%A6%81%E7%94%A8%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%E5%8F%91%E5%BE%80iana-mib@isi.edu]学校只要用电子邮件发往iana-mib@isi.edu





[/email]

进行申请即可获得一个结点名。这样就可以定义自己的产品的OID

,使它能用SNMP

进行管理。


[/align]

[align=left]为了操作管理数据库MIB

,如图1

所示:SNMP

规定了5

种协议SNMP

报文,用来在管理进程和代理之间的交换。


1


get-request




2


get-next-request




3


set-request




4


get-response




5

trap

。前面的3

种操作是由管理进程向代理进程发出的get/set

操作,双方都使用UDP161

端口。第


4

个是对前三种操作的回应,用UDP161

端口,第


5

个代理进程主动发出的报文,通知管理进程有某些事情发生,使用UDP162

端口。


[/align]

 








[align=center][size=10.5pt]图

[size=10.5pt]1 SNMP



[size=10.5pt]的

[size=10.5pt]5



[size=10.5pt]种报文操作

[/align]

[align=left]图2

是封装成UDP

数据报的5

种操作的SNMP

报文格式。可见一个SNMP

报文共有三个部分组成,即公共SNMP

首部、get/set

首部或trap

首部、变量绑定。


[/align]

[align=center]



[/align]

[align=center][size=10.5pt]图

[size=10.5pt]2 SNMP



[size=10.5pt]报文格式

[/align]



SNMP



嵌入式系统实现方法


[align=left]了解了SNMP

协议之后,下面就让我们通过WIZnet W5500EVB

做一个嵌入式SNMP

代理端的简单实验。


[/align]

[align=left]1.

实验目的:建立一个SNMP

代理端


[/align]

[align=left]2.

硬件环境

[/align]

[align=left]单片机:

STM32F103RC

,256K

字节Flash

,48K

字节SRAM



[/align]

[align=left]以太网控制器:W5500

,SPI

接口与单片机相连


[/align]

[align=left]电源:

USB

供电

[/align]

[align=left]硬件外设

:板载LED



[/align]

[align=left]3.

开发工具: IAR V5.14

(版本不一样,需要稍加改动)


[/align]

[align=left]4.

测试软件:串口调试助手,Net-SNMP

(可从网络下载)


[/align]

[align=left]

[/align]

[align=left]软件部分是实现简单网络管理协议SNMP

的关键,下面就以程序流程图的形式看看我们是如何实现的。


[/align]

[align=left]图3

为主程序流程图,我们可以看出程序首先进行单片机系统软硬件初始化,然后初始化W5500

,配置了IP

地址、MAC

地址、和网关。


[/align]

[align=center]



[/align]

[align=center]



3



主程序流程图



[/align]

[align=left]配置完毕后就是代理端主动发送SNMP Trap

报文了,发送SNMP Trap

报文的过程比较简单,主要就是安装Trap

报文格式对发送数据进行打包即可,需要注意的是数据包要根据ASN.1

中的BER

编码方式(格式类型/

长度/

值)进行编码。打包完毕后,开启UDP Socket

,本地端口为162

,然后向管理的162

端口发送Trap

包。接下来就进入一个循环,等待解析SNMP

管理站发来Request

数据包,边解析,边准备要回复的数据包,下图为代理端解析管理站发来的GET/SET

请求,并准备Response

数据包的流程图。


[/align]












4



代理端解析



Request



程序流程图




[align=left]通过图4

流程图我们可以看到,整个过程是严格按照SNMP

协议一步步进行解析判断的。需要说明的是,也是先根据SNMP

编码方式进行解码,再进行比较和判断。我们知道SNMP

中MIB

联系管理站和代理端的关键,解析程序到最后查询的便是MIB

中的对象,在此我们给出定义MIB

对象的结构体:


[/align]

[align=left]typedef struct {

[/align]

[align=left]
uint8 oidlen;


[/align]

[align=left]
uint8 oid[MAX_OID];


[/align]

[align=left]
uint8 dataType;


[/align]

[align=left]
uint8 dataLen;


[/align]

[align=left]
union {


[/align]

[align=left]
uint8octetstring[MAX_STRING];


[/align]

[align=left]
uint32 intval;


[/align]

[align=left]
} u;


[/align]

[align=left]
void(*getfunction)(void *, uint8 *);


[/align]

[align=left]
void(*setfunction)(int32);


[/align]

[align=left]} dataEntryType;

[/align]

[align=left]通过该结构体的定义我们可以知道MIB

对象的几个部分:OID ,

数据类型,

数据长度,

数据,get

函数,set

函数,本方案MIB

中定义的一个控制LED

动作的一个对象:{8, {0x2b, 6, 1, 4, 1, 0, 2, 0},SNMPDTYPE_INTEGER, 4,{""},


NULL, setWIZnetLed}



[/align]

[align=left]其中8

为OID

长度,0x2b

是ASN.1

中“1.3

”的缩写,即:1*40+3=0x2b

。整个OID

其实为1.3.6.1.4.1.0.2.0

。该对象的set

函数为setWIZnetLed



[/align]

[align=left]void setWIZnetLed(int32 val){

[/align]

[align=left]
wiznetLedStatus =val;// W5500-EVB


[/align]

[align=left]
if (wiznetLedStatus==0 )GPIO_SetBits(GPIOA, LED3); // STM32


[/align]

[align=left]
elseGPIO_ResetBits(GPIOA, LED3);


[/align]

[align=left]}

[/align]

[align=left]此为函数名,同样也为函数的指针,在解析SET

函数过程中有一句代码:snmpData[id].setfunction(snmpData[id].u.intval)

;就是执行了该函数,其中snmpData[id].u.intval

为从set Request

当中解析到的绑定变量值。


[/align]

[align=left]整个MIB

就是由上述格式的对象组成,让可以自己定义对象的OID

变量及对象的函数,当管理站向该对象发送请求时,就可以执行相应函数,从而完成你所需要让SNMP

完成的管理和控制。


[/align]

[align=left]完整源程序下载:

http://pan.baidu.com/s/1qWmHpTE



[/align]



测试

SNMP



代理端


[align=left]下面以PC

机为SNMP

管理站,讲述如何测试我们实现的SNMP

代理端。


[/align]

[align=left]1.

在电脑中安装Net-SNMP

软件。Net-SNMP

是一个免费的、开放源码的SNMP

实现方式。按默认选型安装软件后,点击Windows

开始——>

运行 输入“
CMD


”,

点击确认,进入DC

命令环境,输入“
cd \usr\bin

”,

此路径即安装的Net

—SNMP

默认路径,在此路径下可执行SNMP

命令。


[/align]

[align=left]2.

修改PC

本地连接IP

地址。控制面板——>

网络和Internet

——>

网络连接,点击本地连接选择属性,设置PC

为静态IP

(与W5500

在同一网段),设置完成后点击确定,本例中我们设定PC

机ip

为192.168.1.110

,SNMP

代理端IP

为192.168.1.111

,默认网关都为192.168.1.1



[/align]

[align=left]3.

接着用网线把PC

和W5500EVB

连接,打开串口软件,选择正确的COM

口并打开串口,以获取调试信息。


[/align]

[align=left]4.

下载编译好的代码并复位W5500EVB

,我们发现板子上有一排LED

,最右边这个LED

就是我们要查询并且控制的。如图5

所示,现在这个LED

是亮的。


[/align]

[align=center]



[/align]

[align=center]



5



最右边



LED







[/align]

[align=left]5.

在刚才打开的Net

—SNMP

默认路径下可以输入指令,如图所示输入“snmpget -v 1 -cpublic 192.168.1.111 .1.3.6.1.4.1.0.1.0


”回车,查询到“LED On

”,符合板子现在亮的情况。


[/align]

[align=left]6.

再输入“snmpset -v 1 -cpublic 192.168.1.111 .1.3.6.1.4.1.0.2.0 i 0

”回车,结合这个OID

对象的set

函数分析可知,该条命令是置STM32

的LED3

对应引脚为高,即关闭LED

。如图6

观察板子上的LED3

,可见已灭。


[/align]

[align=center]



[/align]

[align=center]



6



最右边



LED







[/align]

[align=left]7.

如图7

再次输入第5

步的snmpget

指令,可以查询到状态为“LED Off

”。


[/align]

[align=center]



[/align]

[align=center]



7 Net-SNMP



工具测试



SNMP



协议



[/align]

[align=left]通过以上步骤可以看出SNMP Agent

已经运行,当然要实现一个复杂的网络管理功能还需要Net

—SNMP

中很多其他指令在此不一一列举。


[/align]



总结


本文给出了基于W5500

的嵌入式系统SNMP

的设计与实现方案,并展示了如何用Net-SNMP

调试工具进行简单控制的方法。


随着物联网事业的发展,越来越多的嵌入式设备都将拥有联网功能,相信SNMP

协议的作用将越来越重要。除了智能家居,在当下物联网时代,想必还有其他应用也会遇到类似问题,希望本文能对做网络设备开发的朋友有所帮助。






[/align]