原创 基于W5500的嵌入式SNMP代理端实现

2015-4-1 15:30 1596 29 29 分类: 消费电子

 实验背景

最近一个做焊接设备的朋友想在焊机上添加监控的新功能,实时获取焊机的温度、功耗等参数,还可简单控制,实现对集群焊接设备的网络化管理。而这个朋友不想在开发管理系统上花太多精力,想找一个开源的管理软件来实现他的需求。这让我想到了简单邮件管理协议SNMP,它生来就是为搞网络管理服务的。能广泛兼容各网络设备,一经推出就得到了广泛的应用和支持,几乎所有的网络设备生产厂家都实现了对SNMP的支持,大多数网络管理系统和平台也都是基于SNMP的。事实上,目前SNMP已成为网络管理领域中的工业标准,我国国家广电总局就要求通信领域的标准网络设备都必须支持SNMP协议。SNMP代理端实际占用系统资源少,在单片机上运行是没有问题的。于是我想到用手头的WIZnet-W5500评估板实现了SNMP代理端,给他提供一个参考。

 SNMP基础普及

在实现SNMP代理端之前,我们先了解一下SNMP的基本知识。管理系统中就要有管理者和被管理者,网管协议定义它为管理站和代理端,它们通过管理信息库MIB进行接口统一,实现数据的通信。

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}等。任何一个公司、学校只要用电子邮件发往iana-mib@isi.edu进行申请即可获得一个结点名。这样就可以定义自己的产品的OID,使它能用SNMP进行管理。

为了操作管理数据库MIB,如图1所示:SNMP规定了5种协议SNMP报文,用来在管理进程和代理之间的交换。1 get-request2 get-next-request3 set-request4 get-response5trap。前面的3种操作是由管理进程向代理进程发出的get/set操作,双方都使用UDP161端口。第4个是对前三种操作的回应,用UDP161端口,第5个代理进程主动发出的报文,通知管理进程有某些事情发生,使用UDP162端口。

1 SNMP5种报文操作

2是封装成UDP数据报的5种操作的SNMP报文格式。可见一个SNMP报文共有三个部分组成,即公共SNMP首部、get/set首部或trap首部、变量绑定。

2 SNMP报文格式

 SNMP嵌入式系统实现方法

了解了SNMP协议之后,下面就让我们通过WIZnet W5500EVB做一个嵌入式SNMP代理端的简单实验。

1.实验目的:建立一个SNMP代理端

2.硬件环境

单片机:STM32F103RC256K字节Flash48K字节SRAM

以太网控制器:W5500SPI接口与单片机相连

电源:USB供电

硬件外设:板载LED

3.开发工具: IAR V5.14(版本不一样,需要稍加改动)

4.测试软件:串口调试助手,Net-SNMP(可从网络下载)

软件部分是实现简单网络管理协议SNMP的关键,下面就以程序流程图的形式看看我们是如何实现的。

3为主程序流程图,我们可以看出程序首先进行单片机系统软硬件初始化,然后初始化W5500,配置了IP地址、MAC地址、和网关。

3主程序流程图

配置完毕后就是代理端主动发送SNMP Trap报文了,发送SNMP Trap报文的过程比较简单,主要就是安装Trap报文格式对发送数据进行打包即可,需要注意的是数据包要根据ASN.1中的BER编码方式(格式类型/长度/值)进行编码。打包完毕后,开启UDP Socket,本地端口为162,然后向管理的162端口发送Trap包。接下来就进入一个循环,等待解析SNMP管理站发来Request数据包,边解析,边准备要回复的数据包,下图为代理端解析管理站发来的GET/SET请求,并准备Response数据包的流程图。

4代理端解析Request程序流程图

通过图4流程图我们可以看到,整个过程是严格按照SNMP协议一步步进行解析判断的。需要说明的是,也是先根据SNMP编码方式进行解码,再进行比较和判断。我们知道SNMPMIB联系管理站和代理端的关键,解析程序到最后查询的便是MIB中的对象,在此我们给出定义MIB对象的结构体:

typedef struct {

   uint8 oidlen;

   uint8 oid[MAX_OID];

   uint8 dataType;

   uint8 dataLen;

   union {

      uint8octetstring[MAX_STRING];

      uint32 intval;

   } u;

   void(*getfunction)(void *, uint8 *);

   void(*setfunction)(int32);

} dataEntryType;

通过该结构体的定义我们可以知道MIB对象的几个部分:OID ,数据类型,数据长度,数据,get函数,set函数,本方案MIB中定义的一个控制LED动作的一个对象:{8, {0x2b, 6, 1, 4, 1, 0, 2, 0},SNMPDTYPE_INTEGER, 4,{""},  NULL, setWIZnetLed}

其中8OID长度,0x2bASN.1中“1.3”的缩写,即:1*40+3=0x2b。整个OID其实为1.3.6.1.4.1.0.2.0。该对象的set函数为setWIZnetLed

void setWIZnetLed(int32 val){

   wiznetLedStatus =val;// W5500-EVB

   if (wiznetLedStatus==0 )GPIO_SetBits(GPIOA, LED3); // STM32

   elseGPIO_ResetBits(GPIOA, LED3);

}

此为函数名,同样也为函数的指针,在解析SET函数过程中有一句代码:snmpData[id].setfunction(snmpData[id].u.intval);就是执行了该函数,其中snmpData[id].u.intval为从set Request当中解析到的绑定变量值。

整个MIB就是由上述格式的对象组成,让可以自己定义对象的OID变量及对象的函数,当管理站向该对象发送请求时,就可以执行相应函数,从而完成你所需要让SNMP完成的管理和控制。

完整源程序下载:http://pan.baidu.com/s/1qWmHpTE

测试SNMP代理端

下面以PC机为SNMP管理站,讲述如何测试我们实现的SNMP代理端。继续阅读:http://bbs.ednchina.com/BLOG_ARTICLE_3028531.HTM

 

 

 

文章评论0条评论)

登录后参与讨论
我要评论
0
29
关闭 站长推荐上一条 /2 下一条