一 实验背景

近期一个做焊接设备的朋友想在焊机上加入监控的新功能,实时获取焊机的温度、功耗等參数,还可简单控制,实现对集群焊接设备的网络化管理。而这个朋友不想在开发管理系统上花太多精力,想找一个开源的管理软件来实现他的需求。这让我想到了简单邮件管理协议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-request;2 get-next-request;3
set-request。4 get-response。5trap。前面的3种操作是由管理进程向代理进程发出的get/set操作,两方都使用UDP161port。第4个是对前三种操作的回应,用UDP161port,第5个代理进程主动发出的报文,通知管理进程有某些事情发生,使用UDP162port。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvV0labmV0MjAxMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

图1 SNMP的5种报文操作

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvV0labmV0MjAxMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

图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地址、和网关。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvV0labmV0MjAxMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

图3主程序流程图

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvV0labmV0MjAxMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

图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是亮的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvV0labmV0MjAxMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

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

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvV0labmV0MjAxMg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

图6最右边LED灭

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

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

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

五总结

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

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

  1. 基于JAX-WS的Web Service服务端/客户端 ;JAX-WS + Spring 开发webservice

    一.基于JAX-WS的Web Service服务端/客户端 下面描述的是在main函数中使用JAX-WS的Web Service的方法,不是在web工程里访问,在web工程里访问,参加第二节. JAX ...

  2. SNMP代理软件开发

    SNMP代理模块包括6个子模块: SNMP协议主要有五种报文get.get-next.set.get-response,trap.l.get-request操作:从代理进程处提取一个或多个参数值2.g ...

  3. 基于Vivado的嵌入式开发 ——PS+PL实践

    基于Vivado的嵌入式开发 ——PS走起 硬件平台:ZedBoard 开发工具:Vivado 2014.2 1.规划 废话不多说,依然是流水灯,这次是采用PS+PL实现. 功能依旧简单,目标是为了学 ...

  4. Atitit事件代理机制原理 基于css class的事件代理

    Atitit事件代理机制原理 基于css class的事件代理 1.1. 在javasript中delegate这个词经常出现,看字面的意思,代理.委托1 1.2. 事件代理1 1.3. 代理标准化规 ...

  5. 基于zepto的插件之移动端无缝向上滚动并上下触摸滑动

    该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 公司的移动端项目是基于zepto的,有一个页面要求文字能够无缝地不停向上滚动,但查了 ...

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

    前言 一般来说,Web端即时通讯技术因受限于浏览器的设计限制,一直以来实现起来并不容易,主流的Web端即时通讯方案大致有4种:传统Ajax短轮询.Comet技术.WebSocket技术.SSE(Ser ...

  7. Pomelo:网易开源基于 Node.js 的游戏服务端框架

    Pomelo:网易开源基于 Node.js 的游戏服务端框架 https://github.com/NetEase/pomelo/wiki/Home-in-Chinese

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

    基于python语言的tensorflow的‘端到端’的字符型验证码识别 1   Abstract 验证码(CAPTCHA)的诞生本身是为了自动区分 自然人 和 机器人 的一套公开方法, 但是近几年的 ...

  9. 基于 SSL 的 Nginx 反向代理

    基于 SSL 的 Nginx 反向代理 描述: 线上zabbix因机房网络问题,外网接口无法对外访问,因此采用同机房的另外一台服务器做反向代理. 线上用于zabbix提供web访问的Nginx,采用h ...

随机推荐

  1. Chapter6:函数

    执行函数的第一步是(隐式地)定义并初始化它的形参.所以,函数最外层作用域中的局部变量也不能使用与函数形参一样的名字. 局部静态变量:在程序的执行路径第一次经过对象定义语句时初始化,并且直到程序终止才被 ...

  2. C++标准转换运算符 --四种

    具体归纳如下: reinterpret_cast 函数将一个类型的指针转换为另一个类型的指针. 这种转换不用修改指针变量值存放格式(不改变指针变量值),只需在编译时重新解释指针的类型就可做到.rein ...

  3. 【boost】使用装饰者模式改造boost::thread_group

    在项目中使用boost::thread_group的时候遇到几个问题: 1.thread_group不提供删除全部thread列表的方法,一直使用create会是其内部列表不断增加. 2.thread ...

  4. Java基础 —— JavaScript

    Javascript:基于对象与事件驱动的脚本语言,主要用于客户端 特点: 交互性:信息动态交互. 安全性:不能访问本地硬盘. 跨平台性:只要有浏览器就支持Javascript,与平台无关. Java ...

  5. ZOJ-3201 Tree of Tree 树形DP

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3201 题意:给一颗树,每个节点有一个权值,求节点数为n的最大权子 ...

  6. DataGrid参数

    1.3.2 data-options="singleSelect:true,collapsible:false,url:'/datagrid/getbasic'"    参数 类型 ...

  7. Axis2与Web项目整合

    一.说明: 上一篇介绍了通过使用Axis2来发布和调用WebService,但是是把WebService发布在Axis2提供的项目中,如果我们需要在自己的Web项目中来使用Axis2发布WebServ ...

  8. Java沙箱技术

    自从Java技术出现以来,有关Java平台的安全性及由Java技术发展所引发的新的安全性问题,引起了越来越多的关注.目前,Java已经大量应用在各个领域,研究Java的安全 性对于更好地使用Java具 ...

  9. CCF 201312-1 出现次数最多的数 (水题)

    问题描述 给定n个正整数,找出它们中出现次数最多的数.如果这样的数有多个,请输出其中最小的一个. 输入格式 输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数. 输入的第二行有n ...

  10. hdu 1171 Big Event in HDU(多重背包+二进制优化)

    题目链接:hdu1171 思路:将多重背包转为成完全背包和01背包问题,转化为01背包是用二进制思想,即件数amount用分解成若干个件数的集合,这里面数字可以组合成任意小于等于amount的件数 比 ...