傻彪5213 发表于 2014-12-11 10:54:12

基于W500+STM32的SNMP协议应用

概述
工具: PCW5500EVB Net-SNMP软件包
编译环境:Keil4 &IAR
功能:通过网络管理协议SNMP及基本的控制命令实现简单的LED控制
一、W5500简介
    韩国WIZnet公司生产的以太网控制芯片W5500整合了五层结构中的前四层,即物理层、数据链路层、网络层和传输层,并在内部利用硬件实现了TCP/IP协议栈。开发者无需专业的网络知识,使用W5500如同控制外部存储器一样简单,为用户提供了最简单的网络接入方法。全硬件TCP/IP协议栈完全独立于主控芯片,可以降低主芯片负载且无需移植繁琐的TCP/IP协议栈,便于产品实现网络化更新。以太网控制芯片W5500具有以下特点:
1、W5500支持硬件TCP/IP协议,包括TCP、UDP、ICMP、IPv4、ARP、IGMP、PPPoE和以太网的PHY和MAC层,TCP/IP协议的硬件实现
2、支持8个独立的SOCKET同时工作,可同时工作在不同的工作模式;
3、支持高速SPI接口(SPI MODE 0,3),SPI的时钟最高可达到80MHz,极大地提高了网络通信的数据传输速率;
4、内部集成32KB存储器用于发送/接收缓存;
5、内嵌10BaseT/100BaseTX以太网物理层(PHY);
6、支持自动协商(10/100-Based全双工/半双工);
7、工作电压为3.3V,但I/O信号口可承受5V电压;
二、SNMP协议简介
SNMP:“简单网络管理协议”,用于网络管理的协议。
SNMP定义在IP协议上,使用无连接的UDP进行通信,SNMP支持5个基本的操作,分别是:GetRequest、GetNextRequest、SetRequest、GetResponse和Trap,这 5个操作来自各自的PDU结构。SNMP采用的是一个请求---应答的通信方式,Trap除外,Trap不需要应答。
    在具体实现上,SNMP为管理员提供了一个网管平台(NMS),又称为管理站,负责网管命令的发出、数据存储、及数据分析。被监管的设备上运行一个SNMP代理(Agent),代理实现设备与管理站的SNMP通信。管理站与代理端通过MIB进行接口统一,MIB定义了设备中的被管理对象。管理站和代理都实现了相应的MIB对象,使得双方可以识别对方的数据,实现通信。管理站向代理申请MIB中定义的数据,代理识别后,将管理设备提供的相关状态或参数等数据转换为MIB定义的格式,应答给管理站,完成一次管理操作。Agent在161端口监听传来的GetRequest、GetNextRequest和SetRequest命令,NMS在162端口监听传来的Trap。SNMP操作请求被封装成一个简单的UDP分组,接收端处理完请求后应答一个UDP的SNMP消息报文;一个请求对应一个应答就完成了一次操作。
    SNMP的工作方式:管理员需要向设备获取数据,所以SNMP提供了读操作;管理员需要向设备执行设置操作,所以SNMP提供了写操作;设备需要在重要状况改变的时候,向管理员通报事件的发生,所以SNMP提供了Trap操作。对于网络管理,我们面对的数据是设备的配置、参数、状态等信息,面对的操作是读取和设置;同时,因为网络设备众多,为了能及时得到设备的重要状态,还要求设备能主动地汇报重要状态,这就是报警功能。
Get:读取网络设备的状态信息。
Set:远程配置设备参数。
Trap:管理站及时获取设备的重要信息。

下面是管理信息库的对象标识
对象命名树的顶级对象有三个,即ISO、ITU-T和这两个组织的联合体。Internet(标号是1)在ISO 下的被标识组织的dod下,其标识符为{1.3.6.1}。Internet结点下面的第二个结点是mgmt(管理),标号是2。其标识为{1.3.6.1.2.1}或{Internet(1).2.1}。这种标识为对象标识符,即ObjectID ,简称OID。这里要提一下MIB中的对象{1.3.6.1.4.1},即enterprises(企业),其所属结点数已超过3000。例如IBM为{1.3.6.1.4.1.2},Cisco为{1.3.6.1.4.1.9},Novell为{1.3.6.1.4.1.23}等。世界上任何一个公司、学校只要用电子邮件发往iana-mib@isi.edu进行申请即可获得一个结点名。这样各厂家就可以定义自己的产品的被管理对象名,使它能用SNMP进行管理。


三、Net-SNMP软件包
    目前,开发SNMP的软件包有许多可以选择如SNMP++、AGENT++、NET-SNMP等。这里我们选用的是NET-SNMP。首先它是一个开源软件,其次基于C语言开发,便于移植。
   net-snmp早先是在Unix平台下开发的。现可以移植到 Linux 、 Windows等多个平台。Net-snmp是一个代理端软件,但也提供管理端的查询工具。安装有两种方式:一是直接安装的二进制包,二是需要编译的源代码。我们在windows平台上安装的二进制包,在windows上的二进制包的安装就非常简单了,只需按提示就可完成。源代码和二进制包可从www.net-snmp.org网站下载,本文中所用的是net-snmp5.2.1.2的版本。之所以要先安装一个可运行的net-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;
                //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;
        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, len, svr_addr, &svr_port);
                }
                else
                {
                request_msg.len = 0;
                continue;
                }
                if (request_msg.len > 0)
                {
       dumpCode("\r\n\r\n","\r\n",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("\r\n\r\n","\r\n",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
        else                                               
         GPIO_ResetBits(GPIOA, LED3);
}
此为函数名,同样也为函数的指针,在解析SET函数过程中有一句代码:snmpData.setfunction(snmpData.u.intval);
就是执行了该函数,其中snmpData.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模式,以下是正常进入系统后串口的打印信息。

然后打开运行-->“CMD” , 输入 “cd \usr\bin”, 之后输入 SNMP命令。

上图输入“snmpget -v 1 -c public 192.168.1.111 .1.3.6.1.4.1.0.2.0”回车,通过Get命令得到此变量为1。
输入“snmpget -v 1 -c public 192.168.1.111 .1.3.6.1.4.1.0.1.0”回车,如上图所示,得到LED状态为“LED ON”。
输入“snmpset -v 1 -c public 192.168.1.111 .1.3.6.1.4.1.0.2.0 i 0”回车,如上图所示,设置变量为0。
输入“snmpget -v 1 -c public 192.168.1.111 .1.3.6.1.4.1.0.2.0”回车,如图所示,得到该变量为0。
输入“snmpget -v 1 -c public 192.168.1.111 .1.3.6.1.4.1.0..0”回车,如上图所示,得到LED状态为“LED OFF”。
通过以上5步可以清楚地发现,通过snmpset命令可以方便快速设置LED的状态;在不清楚LED状态的情况下,也可以通过snmpget命令得到,从而实现快速有效的控制。
我们通过串口助手可得下图Request 和Response 包

2.注意问题
1.最基本的要注意保持程序和串口工具波特率一致,否则无法正常观察操作信息,以免引起误导
2.切记如果是EVB和电脑通过网线直接,需修改电脑IP为静态IP且和W5500EVB设置IP在同一个网段,否则不能实现测试效果,如果是通过路由器测试则不需修改
3.如果大家需要在自己的调试板测试,需要将所有LED灯修改为和自己的调试版对应,以免产生错误
4.输入测试指令时要注意不同指令之间的空格以及点,Public后面的IP地址正是你在程序中给调试板设置IP地址;后面的OID信息跟snmpdemo子函数下定义的数组中信息对应,对照看也可以帮助大家理解
5.Net-SNMP软件一定要安装,安装哪个盘不限制,但是安装在C盘最好,更方便SNMP协议启动

nishuizhou 发表于 2014-12-11 11:03:28

冒个泡先

442502587 发表于 2014-12-11 11:04:28

标记一下,

bitcoin2 发表于 2014-12-11 11:17:14

很 牛的资料啊,我要顶了

niu14789 发表于 2014-12-11 11:21:34

好东西 谢谢~~~~~~~~~~~~

niu14789 发表于 2014-12-11 11:21:51

好东西 谢谢~~~~~~~~~~~~

wdluo 发表于 2014-12-11 13:29:25

不错,感谢楼主分享

dzf050727 发表于 2014-12-11 15:48:15

收藏,有时间玩玩

sblpp 发表于 2014-12-11 16:44:33

谢谢分享!必须顶啊!

mmiker 发表于 2014-12-11 17:04:59

好帖,好帖

ljt80158015 发表于 2014-12-11 17:10:25

snmp的意义在哪?

redworlf007 发表于 2014-12-11 17:11:26

整在弄enc28j60.。。。。移植协议好烦~

傻彪5213 发表于 2014-12-11 17:13:09

ljt80158015 发表于 2014-12-11 17:10
snmp的意义在哪?

专门用来实现网络管理。

傻彪5213 发表于 2014-12-11 17:15:21

redworlf007 发表于 2014-12-11 17:11
整在弄enc28j60.。。。。移植协议好烦~

W5500底层驱动都是开源的,一直都比较方便,可以尝试一下。

ljt80158015 发表于 2014-12-11 17:19:05

傻彪5213 发表于 2014-12-11 17:13
专门用来实现网络管理。

好像用的很少呢,你这个例子是控制LED灯,能不能举几个实际应用中的例子。

tian_zi 发表于 2014-12-11 17:24:48

snmp类似于uip和lwip这一类吗,优势在哪?

傻彪5213 发表于 2014-12-11 18:10:13

tian_zi 发表于 2014-12-11 17:24
snmp类似于uip和lwip这一类吗,优势在哪?

哥,你搞错了,
uip Lwip是TCP/IP 软协议栈   =W5500 硬件TCPIP协议栈


SNMP 是基于TCP/IP 上面的应用层协议   跟DNS HTTP 一个地位


W5500 硬件TCP/IP ,更加稳定,更容易实现 SNMP

傻彪5213 发表于 2014-12-11 18:15:58

ljt80158015 发表于 2014-12-11 17:19
好像用的很少呢,你这个例子是控制LED灯,能不能举几个实际应用中的例子。 ...

国家广电总局 规定 网络通信设备 都必须支持SNMP,用来进行网络管理。
这是一个比较成熟的管理方案,有现成的管理软件可以用的。
当然你可以用 客户端 服务器的形式进行通信,那服务器就需要开发了。这是我的理解


同时 你可以类比一下工控领域的 Modbus协议, 很多厂家都支持的,你要自己搞一个协议也是可以通信的,但是用现成更好,经得起考验

傻彪5213 发表于 2014-12-11 18:16:50

redworlf007 发表于 2014-12-11 17:11
整在弄enc28j60.。。。。移植协议好烦~

我用W5500,现成的,不用移植

lizuqing 发表于 2014-12-11 18:18:03

感谢呀,正是我需要的。

chill520 发表于 2014-12-11 19:20:20

好资料,感谢

cwei 发表于 2014-12-12 08:26:41

不错的资料,现在拿5200只做基本通信,还没有涉及协议

fsmcu 发表于 2014-12-12 09:25:32

不错的资料,有没有ftp的资料,最近打算用W5500做ftp的移植

傻彪5213 发表于 2014-12-12 09:50:44

fsmcu 发表于 2014-12-12 09:25
不错的资料,有没有ftp的资料,最近打算用W5500做ftp的移植

我也正在学习呢,之后实现功能后会上传,大家一起讨论学习。

zhd1021 发表于 2014-12-12 10:18:11

大字体,啧啧

lfgc 发表于 2015-1-18 08:13:48

傻彪5213 发表于 2014-12-12 09:50
我也正在学习呢,之后实现功能后会上传,大家一起讨论学习。

你是大牛 人的,看了博客!!!

undead 发表于 2015-1-18 09:34:54

请问支持TRAP吗?支持以walk方式读取全部节点表吗

livelei 发表于 2015-9-1 23:16:04

好资料,按照楼主的说明运行成功,W5500+F107
W5500用在F107上有点浪费,不过手上只有107的板,好在跟103基本没有什么区别。
W5500模块是坛友送到空板,手焊的。

SXH201312 发表于 2015-9-2 08:14:19

This is very

jeasey 发表于 2015-9-2 11:04:54

不知道这个W5500 TCP或者UDP通信的速率能到多少?

有人实测多吗?

傻彪5213 发表于 2015-9-6 15:11:06

undead 发表于 2015-1-18 09:34
请问支持TRAP吗?支持以walk方式读取全部节点表吗

这是V1版本,walk方式读取全部节点是可以的,trap有测试过也可以。但是功能不是很多,正在研究V2版本。

傻彪5213 发表于 2015-9-6 15:12:54

jeasey 发表于 2015-9-2 11:04
不知道这个W5500 TCP或者UDP通信的速率能到多少?

有人实测多吗?

W5500是通过SPI通行的,这个要看你选择的MCU是什么。不能一概而论。

jzkn 发表于 2015-9-22 08:09:00

楼主你的V2版本搞出来了吗,能不能共享下,谢谢啊

youkebing 发表于 2015-9-22 08:52:08

jzkn 发表于 2015-9-22 08:09
楼主你的V2版本搞出来了吗,能不能共享下,谢谢啊

v2其实和v1差别不大,只是多了个getbulk

youkebing 发表于 2015-9-22 08:53:26

另外,官方的代码,耗费内存还是比较厉害的,我自己写的可以只需要很少的代码,大约3k的ram可以处理2k以上的包

fengyunyu 发表于 2015-9-22 08:56:14

youkebing 发表于 2015-9-22 08:52
v2其实和v1差别不大,只是多了个getbulk

v2相比v1,trap不一样的。

youkebing 发表于 2015-9-22 08:59:56

v2的trap其实更简单

youkebing 发表于 2015-9-22 09:00:48

对snmp来说,难点其实是那几个基本命令处理,对于trap等其实仅仅是一些固定编码,反而简单

jzkn 发表于 2015-9-22 09:28:44

youkebing 发表于 2015-9-22 09:00
对snmp来说,难点其实是那几个基本命令处理,对于trap等其实仅仅是一些固定编码,反而简单 ...

有没有资源共享一下啊,这年头搞SNMP的不太多了。{:handshake:}

youkebing 发表于 2015-9-22 10:02:16

jzkn 发表于 2015-9-22 09:28
有没有资源共享一下啊,这年头搞SNMP的不太多了。

如果有问题,欢迎提出来,我来解答好了,{:loveliness:} 我也算snmp专家吧(自封)。

youkebing 发表于 2015-9-22 10:29:15

snmp其实还是非常简单的,如果资源没有什么限制,那么就用net-snmp,如果java系的用snmp4j,c#的也有开源的,当然用我的snmplite更简单,如果资源有限(比如8k以下的m0处理器),可以用wiznet的库,当然用我的库更小,ram至少可以减少一半。

akin 发表于 2016-3-4 12:32:08

感谢撸主

城关珠 发表于 2016-3-4 13:35:23

好东西,学习了。

youkebing 发表于 2016-6-13 16:57:34

redworlf007 发表于 2014-12-11 17:11
整在弄enc28j60.。。。。移植协议好烦~

可以做个简化版本的,速度一点也不慢

youkebing 发表于 2016-6-13 16:58:30

jzkn 发表于 2015-9-22 08:09
楼主你的V2版本搞出来了吗,能不能共享下,谢谢啊

v2版本和这个差不多,我的在这个基础上做出来了,支持getbulk

wisure 发表于 2016-9-24 23:50:25

感谢分享如此完整的资料~!

tangbo_designer 发表于 2016-9-26 15:57:53

需要W5500模块的可以联系我的啊,欢迎大家来玩哦1,可以通过下面的方式联系到我的啊!

dz2016 发表于 2017-9-26 17:45:37

很不错,谢谢分享!

cyberkit 发表于 2018-3-30 23:02:27

最近需要使用SNMP,正好是需要的资料。感谢

ddcour 发表于 2018-4-8 07:40:24

W5500+SNMP 多谢共享!

openm4 发表于 2018-4-8 12:58:54

感谢楼主分享,好资料。

honami520 发表于 2018-4-8 13:40:00

网络当面的还不错

brumby 发表于 2018-8-17 10:09:42

标记一下

liang16888 发表于 2019-1-24 16:23:35

记录一下 可能要搞snmp

daat 发表于 2019-1-25 11:06:10

好资料,感谢

zhunyan1 发表于 2019-2-13 14:03:46

你这个是不按照NET-SNMP移植的吧?

zhunyan1 发表于 2019-2-13 14:14:02

有V2C的例程吗?最近在搞SNMP v2c 版本的

My_Skity 发表于 2019-2-27 09:32:26

zhunyan1 发表于 2019-2-13 14:14
有V2C的例程吗?最近在搞SNMP v2c 版本的

没有V2C例程{:smile:}

youkebing 发表于 2019-2-27 23:02:46

zhunyan1 发表于 2019-2-13 14:14
有V2C的例程吗?最近在搞SNMP v2c 版本的

论坛我写的支持v2,但是有bug,没有bug的已经商用了,所以不能公开了

ST_ATMEL_NXP 发表于 2020-1-14 17:26:12

请问楼主的工程中,snmplib.c的文件以及对应的snmplib.h的文件是从net-snmp中提取出来的吗?还是自己写的?

youkebing 发表于 2020-1-14 21:51:42

ST_ATMEL_NXP 发表于 2020-1-14 17:26
请问楼主的工程中,snmplib.c的文件以及对应的snmplib.h的文件是从net-snmp中提取出来的吗?还是自己写的? ...

和netsnmp没有关系,wiznet有snmp库,但是只支持v1

ST_ATMEL_NXP 发表于 2020-1-15 08:47:44

youkebing 发表于 2020-1-14 21:51
和netsnmp没有关系,wiznet有snmp库,但是只支持v1

请教下,如果不用W5500的芯片,直接用STM32内部MAC+PHY的形式,可以直接使用net-snmp的库吗?还是需要自己功过PDU的方式自行解析SNMP的协议。

youkebing 发表于 2020-1-15 09:10:45

ST_ATMEL_NXP 发表于 2020-1-15 08:47
请教下,如果不用W5500的芯片,直接用STM32内部MAC+PHY的形式,可以直接使用net-snmp的库吗?还是需要自 ...

snmp和5500没有关系,所以你不用5500完全没有关系,net-snmp是snmp的一个实现,但是这个实现偏重,一般都要带系统(普遍是linux或windows系统),对资源要求也比较高,这个在单片机上跑的可能性非常小。我建议你用wiznet的库就可以了,简单的移植一下接口,我以前就跑过(enc28j60),但是这个库只实现了v1,如果你想支持v2只能自己写了,我在论坛发过一个支持v2版本的,但是很早之前写的,里面有bug,需要自己去修改。

bingcheking 发表于 2021-12-13 14:58:03

正是我想要的,谢谢分享

yexiangru2020 发表于 2023-4-8 17:37:36

youkebing 发表于 2020-1-15 09:10
snmp和5500没有关系,所以你不用5500完全没有关系,net-snmp是snmp的一个实现,但是这个实现偏重,一般都 ...
(引用自63楼)

有关于snmp的问题请教,我不能发站内信。能加个VX吗18862926250    {:handshake:}

youkebing 发表于 2023-4-8 17:55:17

yexiangru2020 发表于 2023-4-8 17:37
有关于snmp的问题请教,我不能发站内信。能加个VX吗18862926250      ...
(引用自65楼)

好的,我加你一下

akey3000 发表于 2023-4-8 18:06:57

youkebing 发表于 2020-1-15 09:10
snmp和5500没有关系,所以你不用5500完全没有关系,net-snmp是snmp的一个实现,但是这个实现偏重,一般都 ...
(引用自63楼)

抛开v2扩展的mib,v2和v1差别很小

youkebing 发表于 2023-4-8 18:17:30

akey3000 发表于 2023-4-8 18:06
抛开v2扩展的mib,v2和v1差别很小
(引用自67楼)

是的差别很小,主要就多一个getbulk

tang_qianfeng 发表于 2023-4-8 19:59:13

mark一下,
页: [1]
查看完整版本: 基于W500+STM32的SNMP协议应用