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



一 实验背景

最近一个做焊接设备的朋友想在焊机上添加监控的新功能,实时获取焊机的温度、功耗等参数,还可简单控制,实现对集群焊接设备的网络化管理。而这个朋友不想在开发管理系统上花太多精力,想找一个开源的管理软件来实现他的需求。这让我想到了简单邮件管理协议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}等。任何一个公司、学校只要用电子邮件发往[email protected]进行申请即可获得一个结点名。这样就可以定义自己的产品的OID,使它能用SNMP进行管理。

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

图1 SNMP的5种报文操作

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

图2 SNMP报文格式

三 SNMP嵌入式系统实现方法

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

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

2.硬件环境

单片机:STM32F103RC,256K字节Flash,48K字节SRAM

以太网控制器:W5500,SPI接口与单片机相连

电源: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编码方式进行解码,再进行比较和判断。我们知道SNMP中MIB联系管理站和代理端的关键,解析程序到最后查询的便是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}

其中8为OID长度,0x2b是ASN.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代理端。

1.在电脑中安装Net-SNMP软件。Net-SNMP是一个免费的、开放源码的SNMP实现方式。按默认选型安装软件后,点击Windows开始——>运行
输入“ CMD ”,点击确认,进入DC命令环境,输入“ cd \usr\bin”,此路径即安装的Net—SNMP默认路径,在此路径下可执行SNMP命令。

2.修改PC本地连接IP地址。控制面板——>网络和Internet——>网络连接,点击本地连接选择属性,设置PC为静态IP(与W5500在同一网段),设置完成后点击确定,本例中我们设定PC机ip为192.168.1.110,SNMP代理端IP为192.168.1.111,默认网关都为192.168.1.1。

3.接着用网线把PC和W5500EVB连接,打开串口软件,选择正确的COM口并打开串口,以获取调试信息。

4.下载编译好的代码并复位W5500EVB,我们发现板子上有一排LED,最右边这个LED就是我们要查询并且控制的。如图5所示,现在这个LED是亮的。

图5最右边LED亮

5.在刚才打开的Net—SNMP默认路径下可以输入指令,如图所示输入“snmpget
-v 1 -cpublic 192.168.1.111 .1.3.6.1.4.1.0.1.0 ”回车,查询到“LED On”,符合板子现在亮的情况。

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,可见已灭。

图6最右边LED灭

7.如图7再次输入第5步的snmpget指令,可以查询到状态为“LED
Off”。

图7 Net-SNMP工具测试SNMP协议

通过以上步骤可以看出SNMP Agent已经运行,当然要实现一个复杂的网络管理功能还需要Net—SNMP中很多其他指令在此不一一列举。

五总结

本文给出了基于W5500的嵌入式系统SNMP的设计与实现方案,并展示了如何用Net-SNMP调试工具进行简单控制的方法。随着物联网事业的发展,越来越多的嵌入式设备都将拥有联网功能,相信SNMP协议的作用将越来越重要。除了智能家居,在当下物联网时代,想必还有其他应用也会遇到类似问题,希望本文能对做网络设备开发的朋友有所帮助。

时间: 2024-10-11 18:17:00

基于W5500的嵌入式SNMP代理端实现的相关文章

基于W5500+STM32的SNMP协议应用

概述 工具: PC  W5500EVB Net-SNMP软件包 编译环境:Keil4 &IAR 功能:通过网络管理协议SNMP及基本的控制命令实现简单的LED控制 一.W5500简介 韩国WIZnet公司生产的以太网控制芯片W5500整合了五层结构中的前四层,即物理层.数据链路层.网络层和传输层,并在内部利用硬件实现了TCP/IP协议栈.开发者无需专业的网络知识,使用W5500如同控制外部存储器一样简单,为用户提供了最简单的网络接入方法.全硬件TCP/IP协议栈完全独立于主控芯片,可以降低主芯片

SNMP代理软件开发

SNMP代理模块包括6个子模块: SNMP协议主要有五种报文get.get-next.set.get-response,trap.l.get-request操作:从代理进程处提取一个或多个参数值2.get-next-request操作:从代理进程处提取紧跟当前参数值的下一个参数值3.set-request操作:设置代理进程的一个或多个参数值 4.get-response操作:返回的一个或多个参数值.这个操作是由代理进程发出的,它是前面三种操作的响应操作.5.trap操作:代理进程主动发出的报文,

基于python语言的tensorflow的‘端到端’的字符型验证码识别源码整理(github源码分享)

基于python语言的tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的人工智能技术的发展,传统的字符验证已经形同虚设. 所以,大家一方面研究和学习此代码时,另外一方面也要警惕自己的互联网系统的web安全问题. Keywords: 人工智能,Python,字符验证码,CAPTCHA,识别,tensorflow,CNN,深度学习 2   Introduction 全自动区

Comet技术详解:基于HTTP长连接的Web端实时通信技术

前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Server-sent Events). 关于这4种技术方式的优缺点,请参考<Web端即时通讯技术盘点:短轮询.Comet.Websocket.SSE>.本文将专门讲解Comet技术.(本文同步发布于:http://www.52im.net/thread-334-1-1.html) 学习交流 - 即时通

如何在Linux服务器上开启安全的SNMP代理

服务器监控工具可以帮助我们从任何一个地方实时了解服务器的性能和功能.监控宝服务器监控套装,可以实时CPU使用率.内存使用率.平均负载.磁盘I/O.网络流量.磁盘使用率等,能够同时为你带来短期效益和长期效益. 监控宝目前提供的服务器监控项目包括: 1. CPU使用率,监控CPU的使用率比例,包括用户态(User).内核态(System).I/O等待(IOWait).空闲(Idle)等 2. CPU负载,监控Linux服务器的平均负载(load average),包括最近1分钟.5分钟.15分钟等 

tomcat配置及基于nginx、apache反向代理tomcat

如今,基于Web的应用越来越多,传统的Html已经满足不了如今的需求.我们需要一个交互式的Web,于是便诞生了各种Web语言.如Asp,Jsp,Php等.当然,这些语言与传统的语言有着密切的联系,如Php基于C和C 语言,Jsp基于Java语言.Tomcat即是一个Jsp和Servlet的运行平台. Tomcat是一个免费的开源的Serlvet容器,它是Apache基金会的Jakarta项目中的一个核心项目,由Apache,Sun和其它一些公司及个人共同开发而成.由于有了Sun的参与和支持,最新

基于Salt Event系统构建Master端returner

前置阅读 环境说明 开工 前置配置 编写returner 测试 SaltStack 的 returner 是由minion端主动连接returner完成执行结果的存储, 在部分场景下并不能满足需求. 由于Salt底层已经构建了一套 Event系统, 所有的操作均会产生event. 因此基于Salt Event系统构建Master端returner成为一种可能. 之前已经完成了 SaltStack Event系统监听events测试, 本文将基于Salt Event系统构建Master端retur

基于java工程开发RMI服务端

ServiceRegist.java import java.rmi.Remote; import java.rmi.RemoteException; public interface ServiceRegist extends Remote{ public user login(String userName, String password) throws RemoteException; } ServiceRegisterImpl.java public class ServiceRegi

如何搭建一个基于 Egg + Webpack + Vue 的服务端渲染工程项目呢?

如何搭建一个基于 Egg + Webpack + Vue 的服务端渲染工程项目呢? 项目你可以通过 easywebpack-cli 直接初始化即可完成或者clone egg-vue-webpack-boilerplate.下面说明一下从零如何搭建一个Egg + Webpack + Vue 的服务端渲染工程项目. 通过 egg-init 初始化 egg 项目 egg-init egg-vue-ssr // choose Simple egg app 安装 easywebpack-vue 和 egg