《基于snmp协议的简单网络控制的实现》由会员分享,可在线阅读,更多相关《基于snmp协议的简单网络控制的实现(13页珍藏版)》请在金锄头文库上搜索。
1、基于 SNMP 协议的简单网络管理的实现因为工作的原因,需要将原来基于 MCF5474 平台上的 IDU 软件系统移植到 AT91SAM9G20 上。IDU 软件提供了用户与设备间交互的界面,方便用户通过 Web 和 SNMP 方式来管理 IDU、ODU 设备,可以通过 Web 的方式进行日志查看,实时检测网络节点的系统状态。以时间设置为例,如图所示:当点击左边的菜单栏中时间设置,即可出现右边的信息,可以对时间和日期的查询和修改。因此,只需在 9G20 平台上实现一个最简单的基于 SNMP 协议网管控制,那么其余的一些操作也是类似的。其基本原理是:在 WEB 界面上提交相关的设置信息,然后通过
2、 SNMP 管理端将信息打包发送到代理端,最后在代理端实现对底层硬件的操作。就按着这个思路,开始进行移植工作。1:在上位机中,输入目标机的 IP 地址,即可看到登录界面:在这里需确保目标机上已经移植了 BOA 服务器,并启动该应用程序(这一步请参考嵌入式 boa 服务器的移植.doc)。那么在这里看下关于 boa 的默认网址:index.htmlset passwordpassword:这是 HTML 的文本语言,挺简单的吧,在上位机中输入目标机的IP 的地址,显示如图所示:2:顺着 index.html,再来看来 pwd 的源代码 pwd.c,该文件主要实现密码验证,通过 CGI 来获取 i
3、ndex.html 提交的表单中的内容,并将它按照“password=%s“格式存放在 passwd 中,然后打开password.c 文件(文件内容 password=123),并将文件内容存放到temp 中,最后通过比较 passwd 和 temp 数组中的内容是否一致,来判断是否能登陆成功。 int main() int i,len;char buff100,temp100,pwd16;printf(“Content-type: text/html nn“);if(getenv(“CONTENT_LENGTH“)len = atoi(getenv(“CONTENT_LENGTH“);fo
4、r(i=0;in“); printf(“LoginSuccessn“); printf(“n“); printf(“); printf(“); printf(“);printf(“n“);printf(“n“); char script512= “; char temp250 = “document.pwd_form.submit();“; char script120= “; strncat(script,temp,strlen(temp); strncat(script,script1,strlen(script1); printf(script);fflush(stdout); 3:可以
5、看到当登录成功后,它将运行 datesetup。再看看 datesetup 如何实现时间的设置。datesetup.c int main() printf(“Content-type: text/html nn“); printf(“n“); printf(“idu settings“); printf(“n“); printf(“); printf(“); printf(“); printf(“); timeSet();printf(“n“); printf(“n“); printf(“n“);fflush(stdout);return 0; 当设置成功后,将会执行 settime,再来看看
6、 settime 是如何实现对实现的设置。settime.c,对日期和时间设置的一个基本流程,从 datesetup 中获取表单中提交的值,然后根据 JavaScript 中提交的值是 0 还是 1,来决定是执行日期还是时间的设置。 int main() int i,len; char buff255,cmd1;printf(“Content-type: text/html nn“);if(getenv(“CONTENT_LENGTH“)len = atoi(getenv(“CONTENT_LENGTH“);for(i=0;in“); printf(“idu settings“); print
7、f(“n“);printf(“cmd=%sn“, cmd); printf(“len=%dn“, len); printf(“buf=%sn“, dst);if(0 = atoi(cmd)led 亮 if(1 = atoi(cmd)led 灭 (为了调试的方便,在这里对日期和时间的设置,实质上是 对 LED 灯的控制。 ) LED 测试结果:当 datesetup 提交的表单中 CMD=0,LED 亮, 当 CMD=1,LED 灭。4:基于 SNMP 协议管理端的实现 if(0 = atoi(cmd) char temp1024 = “; strncat(temp, “0“, 1);/ 建立
8、UDP 连接 int nread, nwrite; /uint8_t bufMAXLINE;int listen_fd = udp_open_listenfd(1162);if (listen_fd snmp_type) switch(tmp) Case 1: break; . Case n: break; Default: break; . /*设置代理端的信息*/ if(SNMP_VALUE_TYPE_SET_REQ = msg-snmp_type) switch(tmp) case 35: printf(“35n“); ioctl(led_fd, 0);/LED 亮 retValue =
9、 “success“; break; case 36: printf(“36n“); ioctl(led_fd, 1);/LED 灭 retValue = “success“; . 附件:SNMP 协议到这里,基于 SNMP 的查询管理的流程应该是清楚啦,可是对于SNMP 的原理还不是很清楚,接着看看 SNMP 吧。这个图还是能够很好的反应 SNMP 协议的工作原理。一:SNMP 报文的类型:SNMP 规定了 5 种协议协议数据单元 PDU(也就是 SNMP 报文) ,用来在管理进程和代理之间的交换。get-request 操作:从代理进程处提取一个或多个参数值 get-next-reques
10、t 操作:从代理进程处提取紧跟当前参数值的下一个参数值 set-request 操作:设置代理进程的一个或多个参数值 get-response 操作:返回的一个或多个参数值。这个操作是由代理进程发出的,它是前面三种操作的响应操作。trap 操作:代理进程主动发出的报文,通知管理进程有某些事情发生。前面的 3 种操作是由管理进程向代理进程发出的,后面的 2 个操作是代理进程发给管理进程的,图 2-1 描述了 SNMP 的这 5 种报文操作。请注意,在代理进程端是用熟知端口 161 俩接收 get 或 set报文,而在管理进程端是用端口 162 来接收 trap 报文。二:SNMP 数据报文的格式
11、一个 SNMP 报文共有三个部分组成,即公共 SNMP 首部、get/set首部 trap 首部、变量绑定。(1)公共 SNMP 首部版本:写入版本字段的是版本号减 1,对于 SNMP(即SNMPV1)则应写入 0共同体(community):共同体就是一个字符串,作为管理进程和代理进程之间的明文口令,常用的是 6 个字符“public” 。PDU 类型:根据 PDU 的类型,填入 04 中的一个数字,其对应关系如表 2-3 所示意图。PDU 类型名称 0get-request 1get-next-request 2get-response 3set-request 4trap表 2-3 PD
12、U 类型(2)get/set 首部请求标识符(request ID):这是由管理进程设置的一个整数值。代理进程在发送 get-response 报文时也要返回此请求标识符。管理进程可同时向许多代理发出 get 报文,这些报文都使用 UDP 传送,先发送的有可能后到达。设置了请求标识符可使管理进程能够识别返回的响应报文对于哪一个请求报文差错状态(error status):由代理进程回答时填入 05 中的一个数字,见表 2-3 的描述 差错状态名字说明 0noError一切正常1tooBig代理无法将回答装入到一个 SNMP 报文之中 2noSuchName操作指明了一个不存在的变量3badVa
13、lue一个 set 操作指明了一个无效值 或无效语法 4readOnly管理进程试图修改一个只读变量 5genErr某些其他的差错表 2-3 差错状态描述差错索引(error index):当出现 noSuchName、badValue 或readOnly 的差错时,由代理进程在回答时设置的一个整数,它指明有差错的变量在变量列表中的偏移(3)trap 首部企业(enterprise):填入 trap 报文的网络设备的对象标识符。此对象标识符肯定是在图 3 的对象命名树上的 enterprise 结点1.3.6.1.4.1下面的一棵子树上。Trap 类型:如表所示,当使用上述类型 2、3、5 时
14、,在报文后面变量部分的第一个变量应标识响应的接口。trap 类 型名字说明0coldStart代理进行了初始化 1warmStart代理进行了重新初始化 2linkDown一个接口从工作状态变为故障状 态 3linkUp一个接口从故障状态变为工作状 态 4authentication Failure从 SNMP 管理进程接收到具有一 个无效共同体的报文 5egpNeighborLos s一个 EGP 相邻路由器变为故障状 态 6enterpriseSpec ific代理自定义的事件,需要用后面 的“特定代码”来指明 表 2-4 Trap 类型特定代码(specific-code):指明代理自定
15、义的时间(若 trap类型为 6) ,否则为 0。时间戳(timestamp):指明自代理进程初始化到 trap 报告的事件发生所经历的时间,单位为 10ms。例如时间戳为 1908 表明在代理初始化后 1908ms 发生了该时间。(4)变量绑定(variable-bindings)指明一个或多个变量的名和对应的值。在 get 或 get-next 报文中,变量的值应忽略。三:SNMP 管理信息库 MIB 管理信息库 MIB 指明了网络元素所维持的变量(即能够被管理进程查询和设置的信息) 。MIB 给出了一个网络中所有可能的被管理对象的集合的数据结构。SNMP 的管理信息库采用和域名系统 DN
16、S 相似的树型结构,它的根在最上面,根没有名字。下图画的是管理信息库的一部分,它又称为对象命名(objectnamingtree) 。 管理信息库的对象命名举例对象命名树的顶级对象有三个,即 ISO、ITU-T 和这两个组织的联合体。在 ISO 的下面有 4 个结点,其中的饿一个(标号 3)是被标识的组织。在其下面有 一个美国国防部(Department of Defense)的子树(标号是 6) ,再下面就是 Internet(标号是 1) 。在只讨论 Internet 中的对象时,可只画出 Internet 以下的子 树(图中带阴影的虚线方框) ,并在 Internet 结点旁边标注上1.3.6.1即可。 在 Internet 结点下面的第二个结点是 mgmt(管理) ,标号是 2。再下面是管理信息库,原先的结