现在在公司里做网管那块,和设备通信用的是SNMP。既然在做网管,就必须把基本的框架和一些主要的知识学透彻,这是最基本的,否则自己就是在原地踏步。其实SNMP不仅可用于南向接口,也可用于北向接口。目前,几种主流的北向接口有:CORBA、SOAP以及SNMP。这篇文章主要介绍SNMP北向。
SNMP,翻译过来就是简单网络管理协议,它是基于UDP的,面向无连接的,换句话说,也就是我只管发消息,至于接收方能不能收到,我是不管的。可靠性而言,和TCP是没的比,因为TCP是基于有连接的,支持链路检测、定时检测、重传等机制。由于SNMP协议栈是开源的,所以和系统无关,我在官网上下到的SNMP的WIN32版本是用VS2003进行编译的。这里顺便提一点,有些机子在装2003的时候,会提示:FrontPage 2000 WEB 扩展客户端 安装失败。其实只要额外安装两个DLL就可以解决了,这里附上解决的办法和需要的文件:
复制fp4autl.dll、fpencode.dll 和 fp4awel.dll到 C:\Program Files\Common Files\Microsoft Shared\Web Server Extensions\40\bin下。然后再重新安装就可以了。
|
文件: |
FrontPage 2000 WEB 扩展客户端.rar |
大小: |
632KB |
下载: |
下载 | |
安装好编译器之后,去AGENTPP的官网上下载SDK。
我下的SDK的版本是:
下完之后解压,然后用VS2003去编译就是了。要提一点,如果你不需要SNMPv3支持的话,可以在snmp++\include\snmp_pp\config_snmp_pp.h文件里将_NO_SNMPv3宏使能,这样的话,编译出来的动态库就不支持SNMPv3了。编译完成之后,可以在msvc\dynamic\release\目录下看到.lib和.dll文件。如下图所示:
动态库编译完成之后,等于说是我们已经拿到了SNMP和AGENT的SDK了,接下来要做的就是定义AGENT的MIB文件了,在MIB文件里,你可以定义自定义的OID。MIB文件是用ASN.1语法来表达的,所以在看和写MIB文件之前,有必要了解一下ASN.1语法,不难的。具体的语法在这里我就不阐述了,自己GOOGLE去搜吧。MIB文件实际上就是一些对象的信息,包括对象的OID,类型,访问权限和描述等。定义好了MIB文件之后,AGENT里要管理的对象也就定下来了。我用的是网上下的一个OID,叫PLC-MIB.txt,本来想自己写一个,后来想想反正能看懂,就算了,自己写无非也就是换个名称,换个OID之类的,所以就用现成的了。关键是一定要理解MIB文件是怎么写的。
|
文件: |
PLC-MIB.rar |
大小: |
2KB |
下载: |
下载 | |
MIB文件定义好了之后,就是要把MIB文件转换成相应的.cpp和.h文件。我用的是AgentGen1.5,免费的,在网上就可以下到。还有种转换工具,叫做是mib2c,好像是net-snmp提供的,但我没去试过,呵呵。有了AgentGen1.5,我们就可以把MIB文件转换成.cpp和.h文件了。具体的使用方法,这里不阐述,自己去看用户手册,就一点点E文,不难的。
生成了MIB文件相应的.cpp和.h文件之后,接着我们就可以来编写AGENT端的代码了。我是先编写AGENT端,然后再编写MANAGER端的。因为我觉得大部分的工作量都集中在AGENT端,如果先把难的搞定了,简单的也就不在话下了,有点擒贼先擒王的味道。
用来做测试的环境的拓扑结构为:
为了测北向接口,还特地花了40RMB买了个HUB,是TP-LINK的,感觉做工不咋地,反正能用就行。上几张AGENT和MANAGER之间通信的图:
先启动AGENT端:
AGENT进程这边,除了主线程之外,我一共起了三个线程,分别管理:接收和处理SNMP的GET/SET消息、定时发送TRAP消息以及AGENT进程内部修改指定OID的值。消息的接收和发送使用的是161端口。
TRAP的发送间隔是60S,以下是抓的包:
TRAP消息里一共带两个字段,都是STRING型的,分别是"What's your name?"和"Blade Master"。
接下来启动MANAGER端:
因为命令行的打印消息太长了,所以只截取了局部的图,凑合着看吧。
MANAGER这边,除了主线程之后,一共是起了两个线程,分别管理:GET/SET请求的下发以及TRAP消息的接收。期间有个小插曲,因为TRAP消息我用的是162端口,但162端口已经被其他进程给占用了,用netstat命令找了下,有个叫"snmpTrap"的进程开着,也不知道是哪来的,估计是其他软件的组件吧。后来在WINDOWS任务管理器里将其kill掉了。如果端口被占用,会报错误,错误码是-21。
在MANAGER端,我一共是做了三个操作,依次是GET、SET、GET。因为AGENT初始化起来的时候,OID所对应的值是没有初值的,除非自己进行初始化,所抓的包如下:
如果通信过程中用的不是161或者是162端口的话,用SNMP做为过滤条件是抓不到包的,必须用UDP做为过滤条件来抓取。
到这,SNMP基本的功能都已经实现了,包括:GET/SET请求的发送和响应,TRAP消息的发送和接收。说的简单点就是:MANAGER端负责主动查询和主动设置的工作,以及TRAP消息的接收和处理;AGENT端负责接收MANAGER端的查询和设置请求,并正确处理,再返回结果,以及TRAP消息的发送。
总结:
1、其实我们学到的还只是SNMP协议栈最最皮毛的东西,都是些调用接口的傻瓜似操作,真的,精华都在SDK的src文件夹中,那才是王道,因为越往底层走,能学到的东西就越多,对自己能力的提升就越快,所以有时间还是要拜读下源码。
2、利用工作之余,断断续续地研究了差不多一个月,期间也走了不少弯路,主要是卡在MIB文件的转换上。一开始,上GOOGLE,搜到最有名的MIB文件的编译工具是MIB-Brower,但看它的用户手册,找来找去,就是找不到用MIB-Brower是如何生成.cpp和.h文件的。也许MIB-Brower确实有这样的功能,但我真的没找到,想想自己还是挺失败的。后来找了个AgentPro,以为可以了,结果人家是要LICENSE了,于是习惯性地去搜LICENSE,但令人失望的是,根本就搜不到AgentPro的LICENSE。再后来,才找到AgentGen,总算是有免费的工具用了。找到了MIB文件的转换工具,以为水到渠成,.cpp和.h文件应该马上就可以出来了,但又让我失望了,说什么语法错误,缺失依赖文件什么的,但幸好这些问题都没有难倒我,真是挺幸运的:)
3、有志者,事竟成。冰山一角。
阅读(10848) | 评论(5) | 转发(0) |