如何在以太网芯片W5200中实现SNMP?

本文详细介绍了如何在W5200中实现简单网络管理协议(SNMP)。SNMP是一种用于管理IP网络设备的标准协议,支持路由器、交换机等多种设备。文章深入解析了SNMP消息格式,并通过实例演示了SNMP Get/Set/Trap操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天给大家介绍W5200应用笔记之如何在W5200中实现SNMP。首先简单介绍下SNMP。简单网络管理协议(SNMP)是一个“管理IP网络上的设备的网络标准协议”,通常支持SNMP的设备包括路由器、交换机、服务器、工作站、打印机、调制解调器等等。

 

SNMP对于任何程序员来说都是容易理解的。简而言之可以使系统更加简化。网络设备以后台程序的形式运行SNMP代理,该后台程序响应来自网络的请求。代理提供大量的对象标识符 (Object Identifiers ,OIDs)。一个OID是唯一的键值对。代理填充这些值并且使它们有效。SNMP管理(客户端)能够查询代理的键值对的具体信息。从编程的角度来看这与引进一堆的全局变量没什么区别。SNMP OIDs能够被读或写。向一个SNMP设备写信息是相当罕见的,这是一些管理应用程序控制设备(如交换机的管理GUI)的常用方法。在SNMP中存在一个基本的认证方法,允许管理者发送一个通用名称(认为明文密码)去认证OIDs的读或写。大多数设备使用不安全的通用名称“public”。SNMP使用UDP端口161和162通信。

 

该应用笔记展示了w5200E01-M3中的<SNMP代理>与PC中的<SNMP管理>如何进行通信。

该笔记的所有代码和文件都可在中文网站进行下载。

1. SNMP协议

SNMP消息格式指定在消息里包括哪些字段并按什么顺序。最终,该消息是由几层嵌套的字段组成。在最外面的一层,SNMP消息是Sequence类型的单独字段。完整的消息是一个序列的三个小的字段:SNMP Version(整型),SNMP Community String(8位字符串),和SNMP PDU(GetRequest,或SetRequest)。

SNMP Version和SNMP Community String是原始数据类型,他们不是从小的字段得到的(没有更多的层)。但是,PDU是一个复杂的数据类型,由一些小的字段组成(更多层次)。PDU由一个Request ID (整型)、Error (整型)、Error Index (整型)和一个Varbind List组成。Varbind或 Variable Binding是两个特定字段序列。第一个字段是一个OID,存放指定的参数。第二个字段包括该指定参数的值。在SetRequest中,参数值的数据类型必须与MIB中设置的参数类型一致。 在GetRequest中,参数值是空,长度是0×00。该空数据是Value数据的占位符,该Value数据是SNMP代理使用GetResponse PDU返回得到的。此外,顾名思义, Varbind List就是一个Varbinds Sequence。最后,当一个消息设置或获取一个单独的参数,Varbind List只允许有一个Varbind 。SNMP里每个字段的解释请看下表。

MIB树的SNMP相关分支在网络分支中,包括以下两种主要分支类型:

n 公共分支(mgmt=2),由互联网工程任务组(Internet Engineering Task Force ,IETF) RFCs定义,与所有的SNMP管理设备一样。

n 私有分支(private=4),由互联网号码分配局(IANA)分配,这些分支的分配由一些公司和组织定义。

下图展示了SNMP MIB树的结构。MIB树的深度和宽度没有限制。

MIB树的树根是国际标准化组织(iso),它的下面是组织(org)分支,再下面是国防部(dod),再下面是互联网(internet)。管理(mgmt),主要的公共分支,定义所有供应商设备通用的网络管理参数。在管理分支的下面是MIB-II (mib-2),在其下面是通用管理功能分支,如系统管理,打印机,主机资源和接口。

MIB的私有分支包括一些大的组织,这些组织在企业分支的下面。每个组织在该对象下面都有一个根分支节点。每个组织创建它自己的MIB分支和对象子网,这必须符合称为结构管理信息(SMI)的定义。SMI定义了MIB对象允许的数据类型。

2. SNMP Get/Set/Trap演示

[net-snmp version 5.7 package for windows]用来演示。

(Net-SNMP是一套使用和调度SNMP协议的软件。它包括一个通用的客户端程序库、一套命令行代码、一个高度可扩展的SNMP代理、perl模块和python模块)。

 

在用Microsoft Visual Studio建立工程后,可以获取所有的net-snmp示例可执行文件。在所有的net-snmp示例可执行文件中,使用snmpget.ex,snmpset.exe,snmpwalk.exe和snmptrapd.exe。

2.1 Trap 演示

首先,如下所示启动net-snmp包中的<snmptrapd.exe>。

 

重启[w5200E01-M3]模块。

 

然后,可以看见PC中的snmp trap数据包,如下所示。

2.2 Get Request演示(系统MIB)

2.3 Set Request演示(私有MIB), LED On/Off测试

如果发出以下命令,[w5200E01-M3]的LED将会熄灭。

snmpset -v 1 -c public 192.168.11.251 .1.3.6.1.4.1.0.2.0 i 0

如果发出以下命令,[w5200E01-M3]的LED将会点亮。

snmpset -v 1 -c public 192.168.11.251 .1.3.6.1.4.1.0.2.0 i 1

2.4 Walk演示

3. 使用SNMP Library示例

05-12
### SNMP协议概述 SNMP(Simple Network Management Protocol)是一种用于管理和监控网络设备的应用层协议[^3]。它最初于1988年被制定,并迅速成为互联网环境中广泛使用的网络管理解决方案之一。目前,SNMP已经发展到了第三版(SNMPv3),提供了更高的安全性和功能性。 #### 协议组成与架构 SNMP的核心组成部分包括以下几个方面: - **管理站(Manager)**:负责发送请求并接收来自代理的信息。 - **代理(Agent)**:运行在网络设备上的程序,收集本地系统的数据并通过SNMP向管理站报告。 - **管理信息库(MIB, Management Information Base)**:定义了一组对象及其语义,供SNMP使用以描述网络资源的状态和性能指标。 SNMP的架构通常分为两种模式: - **主代理模式**:由单一代理直接响应管理站发出的所有查询请求[^1]。 - **子代理模式**:通过引入额外的子代理分担工作负载,其中每个子代理专注于特定类型的MIB视图。这种设计增强了灵活性和可扩展性,尤其是在复杂的分布式环境当中[^4]。 #### 配置指南 以下是针对基于Cisco IOS平台配置SNMP服务的一些基本指导: 1. 启用SNMP服务 要启用SNMP功能,可以通过设置读取团体字符串来允许远程管理系统访问设备的数据。例如: ```shell snmp-server community public RO ``` 2. 设置陷阱目标地址 如果希望当某些事件发生时通知指定的管理站点,则需配置trap receiver参数如下所示: ```shell snmp-server host 10.0.0.1 version 2c private ``` 3. 安全加固措施 对于不再需要的服务应当及时停用以防潜在风险暴露在外网之中。比如停止不必要的SNMP操作可通过下面这条指令完成: ```shell no snmp-server enable traps ``` 若要验证当前状态是否已成功关闭,可以借助`show snmp`命令查看详细情况[^2]。 需要注意的是以上例子仅适用于支持IOS系列固件的产品线;而对于其他品牌或者型号则可能有所差异,请参照对应手册获取确切步骤说明。 --- ### 示例代码片段 以下是一个简单的Python脚本示例,展示如何利用pysnmp库从远程主机检索系统名称OID (`.1.3.6.1.2.1.1.5`) 的值: ```python from pysnmp.hlapi import * errorIndication, errorStatus, errorIndex, varBinds = next( getCmd(SnmpEngine(), CommunityData('public'), UdpTransportTarget(('demo.snmplabs.com', 161)), ContextData(), ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysName', 0))) if errorIndication: print(errorIndication) elif errorStatus: print('%s at %s' % (errorStatus.prettyPrint(), errorIndex and varBinds[int(errorIndex)-1][0] or '?')) else: for varBind in varBinds: print(' = '.join([x.prettyPrint() for x in varBind])) ``` 此段代码展示了如何构建GET请求以及解析返回的结果集。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值