tag 标签: 代理端

相关博文
  • 热度 29
    2015-4-1 15:30
    1600 次阅读|
    0 个评论
    一   实验背景 最近一个做焊接设备的朋友想在焊机上添加监控的新功能,实时获取焊机的温度、功耗等参数,还可简单控制,实现对集群焊接设备的网络化管理。 而这个朋友不想在开发管理系统上花太多精力,想找一个开源的管理软件来实现他的需求。这让我想到了简单邮件管理协议 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 ; 5 trap 。前面的 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 ;     uint8 dataType;     uint8 dataLen;     union {        uint8octetstring ;        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 .setfunction(snmpData .u.intval) ;就是执行了该函数,其中 snmpData .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      
  • 热度 22
    2015-4-1 15:22
    1822 次阅读|
    0 个评论
    一   实验背景 而这个朋友不想在开发管理系统上花太多精力,想找一个开源的管理软件来实现他的需求。这让我想到了简单邮件管理协议 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 ; 5 trap 。前面的 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 ;     uint8 dataType;     uint8 dataLen;     union {        uint8octetstring ;        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 .setfunction(snmpData .u.intval) ;就是执行了该函数,其中 snmpData .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 协议的作用将越来越重要。 除了智能家居,在当下物联网时代,想必还有其他应用也会遇到类似问题,希望本文能对做网络设备开发的朋友有所帮助。