您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 基于SNMP协议的简单网络控制的实现
基于SNMP协议的简单网络管理的实现因为工作的原因,需要将原来基于MCF5474平台上的IDU软件系统移植到AT91SAM9G20上。IDU软件提供了用户与设备间交互的界面,方便用户通过Web和SNMP方式来管理IDU、ODU设备,可以通过Web的方式进行日志查看,实时检测网络节点的系统状态。以时间设置为例,如图所示:当点击左边的菜单栏中时间设置,即可出现右边的信息,可以对时间和日期的查询和修改。因此,只需在9G20平台上实现一个最简单的基于SNMP协议网管控制,那么其余的一些操作也是类似的。其基本原理是:在WEB界面上提交相关的设置信息,然后通过SNMP管理端将信息打包发送到代理端,最后在代理端实现对底层硬件的操作。就按着这个思路,开始进行移植工作。1:在上位机中,输入目标机的IP地址,即可看到登录界面:在这里需确保目标机上已经移植了BOA服务器,并启动该应用程序(这一步请参考嵌入式boa服务器的移植.doc)。那么在这里看下关于boa的默认网址:index.htmlhtmlheadtitlesetpassword/title/headbodyformname=pwdmethod=postaction=/cgi-bin/pwdpassword:inputtype=passwordname=password/inputtype=submitvalue=login//form/body/html这是HTML的文本语言,挺简单的吧,在上位机中输入目标机的IP的地址,显示如图所示:2:顺着index.html,再来看来pwd的源代码pwd.c,该文件主要实现密码验证,通过CGI来获取index.html提交的表单中的内容,并将它按照password=%s格式存放在passwd中,然后打开password.c文件(文件内容password=123),并将文件内容存放到temp中,最后通过比较passwd和temp数组中的内容是否一致,来判断是否能登陆成功。intmain(){inti,len;charbuff[100],temp[100],pwd[16];printf(Content-type:text/html\n\n);if(getenv(CONTENT_LENGTH))len=atoi(getenv(CONTENT_LENGTH));for(i=0;ilen;i++){buff[i]=getchar();}buff[len]='\0';//获取表单中的内容sscanf(buff,password=%s,passwd);FILE*fp;fp=fopen(DATAFILE,r);if(NULL==fp){prtError();return-1;}while(fgets(temp,sizeof(temp),fp)){sscanf(temp,password=%s,pwd);}fclose(fp);if(0==strcmp(passwd,pwd)){prtSuccess();}else{prtError();}return0;}当密码验证成功后,即执行prtSuccess();再来看看这个里面放的是什么?voidprtSuccess(){printf(html\n);printf(headtitleLoginSuccess/title/head\n);printf(body\n);printf(formmethod='post'action=/cgi-bin/datesetupname='pwd_form');printf(inputtype='hidden'name='cmd'value='1'/);printf(/form);printf(/body\n);printf(/html\n);charscript[512]=script;chartemp[250]=document.pwd_form.submit();;charscript1[20]=/script;strncat(script,temp,strlen(temp));strncat(script,script1,strlen(script1));printf(script);fflush(stdout);}3:可以看到当登录成功后,它将运行datesetup。再看看datesetup如何实现时间的设置。datesetup.cintmain(){printf(Content-type:text/html\n\n);printf(html\n);printf(headtitleidusettings/title/head);printf(body\n);printf(p);printf(formname='timeSetForm'action='/cgi-bin/settime'method='post');printf(inputtype='hidden'name='cmd'value='0'/);printf(tablewidth='95%'border='1'bordercolor='#CCCCCC'/table);timeSet();printf(/form\n);printf(/body\n);printf(/html\n);fflush(stdout);return0;}当设置成功后,将会执行settime,再来看看settime是如何实现对实现的设置。settime.c,对日期和时间设置的一个基本流程,从datesetup中获取表单中提交的值,然后根据JavaScript中提交的值是0还是1,来决定是执行日期还是时间的设置。intmain(){inti,len;charbuff[255],cmd[1];printf(Content-type:text/html\n\n);if(getenv(CONTENT_LENGTH))len=atoi(getenv(CONTENT_LENGTH));for(i=0;ilen;i++){buff[i]=getchar();}buff[len]=0;printf(buff=%s\n,buff);chardst[100][100];intnum=split(buff,&,dst,100);sscanf(dst[0],cmd=%s,cmd);printf(html\n);printf(headtitleidusettings/title/head);printf(body\n);printf(cmd=%s\n,cmd);printf(len=%d\n,len);printf(buf=%s\n,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)){chartemp[1024]=;strncat(temp,0,1);//建立UDP连接intnread,nwrite;//uint8_tbuf[MAXLINE];intlisten_fd=udp_open_listenfd(1162);if(listen_fd=0){return-1;}g_fd=listen_fd;structsockaddr_inclientaddr;socklen_tsocklen=sizeof(clientaddr);clientaddr.sin_family=AF_INET;clientaddr.sin_port=htons(161);inet_pton(AF_INET,127.0.0.1,&clientaddr.sin_addr);//封装SNMP消息。snmp_msgmsg,ret_msg;msg.snmp_version=0;strcpy(msg.snmp_community,COMMUNITY);msg.snmp_type=SNMP_VALUE_TYPE_SET_REQ;msg.snmp_req_id=0x01020304;msg.snmp_error_status=0;msg.snmp_error_id=0;msg.snmp_val[0].snmp_val_type=SNMP_VALUE_TYPE_NULL;msg.clientaddr=clientaddr;msg.clilen=len;strcpy(msg.snmp_val[0].snmp_object,SNMP_OBJECT_35);msg.snmp_val[0].snmp_val_type=0x4;strcpy(msg.snmp_val[0].snmp_val_string,temp);char*retValue=NULL;structtimevaltv={5,0};intret=send_request_msg_timeout(&msg,&ret_msg,&tv);if(ret==0){printf(send_request_msgsuccess!\n);}else{printf(datenoresponse\n);return-1;}return0;}5:基于SNMP协议代理端的实现intmain(intargc,char*argv[]){led_fd=open(/dev/my_led,O_RDWR,S_IRUSR|S_IWUSR);if(led_fd0)printf(open/dev/lederror!\n);create_snmp_thread(&deal_snmp_msg);while(1)sleep(1);return0;}intdeal_snmp_msg(snmp_msg*msg){intteste1;//加同步操作snmp_msgreply;if(!msg)return-1;memcpy(&reply,msg,sizeof(*msg));chardst[100][100];intnum=split(reply.snmp_val[0].snmp_object,.,dst,100);intlen=strlen(dst[5]);char*temp=sHex2Int(dst[5],len);inttmp=atoi(temp);char*retValue=NULL;/*获取代理端的信息*/if(SNMP_VALUE_TYPE_GET_REQ==msg-snmp_type){switch(tmp){Case1:break;....Casen:break;Default:break;}.....}/*设置代理端的信息*/if(SNMP_VALUE_TYPE_SET_REQ==msg-snmp_type){switch(tmp){case35:printf(35\n);ioctl(led_fd,0);//LED亮retValue=success;break;case36:printf(36\n);ioctl(led_fd,1);//LED灭retValue=success;}.....}附件:SNMP协议到这里,基于SNMP的查询管理的流程应该是清楚啦,可是对于SNMP的原理还不是很清楚,接着看看SNMP吧。这个图还是能够很好的反应SNMP协议的工作原理。一:SNMP报文的类型:SNMP规定了5种协议数据单元PDU(也就是SNMP报文),用来在管理进程和代理之间的交换。get-request操作:从代理进程处提取一个或多个参数值get-next-request操作:从代理进程处提取紧跟当前参数值的下一个参数值set-request操作:设置代理进程的一个或多个参数值get-response操作:返回的一个或多个参数值。这
本文标题:基于SNMP协议的简单网络控制的实现
链接地址:https://www.777doc.com/doc-2572094 .html