


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、因为工作的原因,需要将原来基于 MCF5474平台上的IDU软件 系统移植到AT91SAM9G20上。IDU软件提供了用户与设备间交互的 界面,方便用户通过 Web和SNM方式来管理IDU、ODU设备,可以通 过Web的方式进行日志查看,实时检测网络节点的系统状态。以时间 设置为例,如下图: CMttHinle 121 帰 HMH:LKf iwiiiMejwa LKflltUIhMDateVYWWUDC M dtiviww *ii. Pwmnnl Wtap 州"旳当点击左边的菜单栏中时间设置,即可出现右边的信息,可以对 时间和日期的查询和修改。因此,只需在9G20平台上实现一个最简单
2、的基于 SNM协议网管 控制,那么其余的一些操作也是类似的。其根本原理是:在WEB界面上提交相关的设置信息,然后通过 SNM管理端将信息打包发送到代 理端,最后在代理端实现对底层硬件的操作。就按着这个思路,开始 进行移植工作。1:在上位机中,输入目标机的IP地址,即可看到登录界面:在 这里需确保目标机上已经移植了 BOA效劳器,并启动该应用程序这 一步请参考嵌入式boa效劳器的移植.doc。那么在这里看下关于boa的默认 index.html<html><head><title>set password</title>v/head><
3、body >vform n ame="pwd" method二"post" actio n="/cgi-bi n/pwd"> password:vin put type二"password" n ame二"password" />vin put type二"submit" value二"log in" /></form></body></html>这是HTM啲文本语言,挺简单的吧,在上位机中输入目
4、标机的IP的地址,显示如下图:2:顺着index.html,再来看来pwd的源代码pwd.c,该文件主要实现密码验证,通过 CGI来获取index.html提交的表单中的内容,并将它按照"password=%s"格式存放在passwd中,然后翻开 password.c文件文件内容password=123,并将文件内容存放到 temp中,最后通过比拟passwd和temp数组中的内容是否一致,来判断是否能登陆成功。int mai n()int i,le n;char buff100,temp100,pwd16;prin tf("Co nten t-type: tex
5、t/html nn );if(gete nv("CONTENT_LENGTH") len 二 atoi(gete nv("CONTENT_LENGTH");for(i=0;i<le n;i+) buffi = getchar();buffle n = '0'/获取表单中的内容ssca nf(buff,"password=%s",passwd);FILE *fp;fp = fope n(DATAFILE,"r");if(NULL=fp) prtError();return -1;while(fg
6、ets(temp,sizeof(temp),fp) ssca nf(temp,"password=%s",pwd);fclose(fp);if(0=strcmp(passwd,pwd) prtSuccess();else prtError();return 0;当密码验证成功后,即执行prtSuccess();再来看看这个里面放 的是什么?void prtSuccess()prin tf("<html>n");prin tf("<head><title>Log in Success</title>
7、v/head>n"); prin tf("<body>n");printf("<form method二'post' action=/cgi-bin/datesetup n ame='pwd_form'>");printf("<in puttype='hidde n'n ame='cmd' value二'1'/>");prin tf("</form>");prin tf(&
8、quot;</body>n");prin tf("</html>n");char script512= "<script>"char temp250 = "docume nt.pwd_form.submit();"char script120= "</script>" -str ncat(script,temp,strle n( temp);str ncat(script,script1,strle n( script1);prin tf(script);
9、fflush(stdout);3:可以看到当登录成功后,它将运行datesetup0' * *Fir<fw-Rfltf) MHHEI Bttn fflSJ fWEO IBTH 鼠IT.HI* C空 礴対 344 L.L忧斗謝rtki m轉i必炳 阳晶 IMAFffl!怦 f暉扌氐|革M鼻址砰lEiM*ia|二 0«"网p-QO-M!TiHM-MfMMJiSDM再看看datesetup如何实现时间的设置。datesetup.c int mai n()prin tf("Co nten t-type: text/html nn");prin tf
10、("<html>n");prin tf("<head><title>idu sett in gs</title>v/head>");prin tf("<body>n");prin tf("<p>");prin tf("<form n ame二'timeSetForm'actio n='/cgi-bi n/settime' method二'post'");printf
11、("<in puttype='hidde n'n ame='cmd' value二'O'/>");printf("<table width二'95%' border二'1' bordercolor='#CCCCCC'x/table>");timeSet();prin tf("</form>n");prin tf("</body>n");prin tf("</
12、html>n");fflush(stdout);return 0;当设置成功后,将会执行settime,再来看看settime是如何实现 对实现的设置。settime.c ,对日期和时间设置的一个根本流程,从 datesetup中获取表单中提交的值,然后根据JavaScript中提交的值是0还是1,来决定是执行日期还是时间的设置。int mai n()int i,le n;char buff255,cmd1;prin tf("Co nten t-type: text/html nn");if(gete nv("CONTENT_LENGTH"
13、;)len 二 atoi(gete nv("CONTENT_LENGTH");for(i=0;i<le n;i+) buffi = getchar();buffle n=0;printf("buff=%sn", buff);char dst1OO1OO;int num = split(buff,"&", dst, 100);ssca nf(dst0,"cmd=%s",cmd);prin tf("<html>n");prin tf("<head>&l
14、t;title>idu sett in gs</title>v/head>");prin tf("<body>n");prin tf("cmd=%sn", cmd);prin tf("le n=%dn", le n);prin tf("buf=%s n", dst);if(0 = atoi(cmd) led 亮if(1 = atoi(cmd) led 灭(为了调试的方便,在这里对日期和时间的设置,实质上是对 LED灯的控制。)LED测试结果:当datesetup提交的表
15、单中 CMD=,LED亮, 当 CMD=,1 LED灭。4:基于SNM协议管理端的实现if(0 = atoi(cmd) char temp1024="" strncat(temp, "0", 1);/建立UDR!接 int n read, n write; uint8_t bufMAXLINE;int listen_fd = udp_open_listenfd(1162);if (liste n_fd <= 0) retur n -1;g_fd = listen_fd;struct sockaddr_in clientaddr;socklen_t
16、socklen = 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_msg msg,ret_msg;msg.snmp_version = 0; strcpy(msg.snmp_community, COMMUNITY); msg.snmp_type = SNMP_VALUE_TYPE_SET_REQ; msg
17、.snmp_req_id = 0x01020304;msg.snmp_error_status = 0; msg.snmp_error_id = 0;msg.snmp_val0.snmp_val_type =SNMP_VALUE_TYPE_NULL;msg.clientaddr = clientaddr;msg.clilen = len; strcpy(msg.snmp_val0.snmp_object, SNMP_OBJECT_35);msg.snmp_val0.snmp_val_type = 0x4; strcpy(msg.snmp_val0.snmp_val_string,temp);c
18、har* retValue = NULL; struct timeval tv = 5, 0 ;int ret = send_request_msg_timeout(&msg, &ret_msg, &tv);if (ret = 0) printf("send_request_msg success!n"); else printf("date no responsen"); return -1; return 0;5:基于SNM协议代理端的实现int main(int argc, char *argv)led_fd = open(
19、"/dev/my_led", O_RDWRS,_IRUSR| S_IWUSR); if(led_fd < 0)printf("open /dev/led error!n"); create_snmp_thread(&deal_snmp_msg);while (1)sleep(1);return 0;int deal_snmp_msg(snmp_msg *msg)int teste1;/ 加同步操作 snmp_msg reply;if (!msg) return -1;memcpy(&reply, msg, sizeof(*msg);
20、char dst100100;int num= split(reply.snmp_val0.snmp_object, ".", dst, 100);int len = strlen(dst5);char* temp = sHex2Int(dst5,len);int tmp = atoi(temp);char* retValue = NULL;/* 获取代理端的信息 */ if(SNMP_VALUE_TYPE_GET_REQ = msg->snmp_type) switch(tmp) Case 1: break;Case n: break; Default: break
21、;/* 设置代理端的信息 */ if(SNMP_VALUE_TYPE_SET_REQ = msg->snmp_type) switch(tmp) case 35: printf("35n"); ioctl(led_fd, 0);/LED 亮 retValue = "success" break;case 36: printf("36n"); ioctl(led_fd, 1);/LED 灭 retValue = "success"附件:SNM协议到这里,基于SNMP勺查询管理的流程应该是清楚啦,可是对于SNMP
22、勺原理还不是很清楚,接着看看 SNMP巴。这个图还是能够很好的反响SNM协议的工作原理。«NMF忙啓SUHF M W占中臼L叱4別册r .-LJL4x> JU1HH1ft強乍I-r<皿:'IF罔丨樹小炸的栋畝琳皎一: SNM报文的类型:SNMP®定了 5种协议数据单元PDU也就是SNMP艮文,用来在 管理进程和代理之间的交换。get-request操作:从代理进程处提取 一个或多个参数值get-next-request操作:从代理进程处提取紧跟当前参数值的下一个参数值set-request操作:设置代理进程的一个 或多个参数值get-response操作
23、:返回的一个或多个参数值。这个 操作是由代理进程发出的,它是前面三种操作的响应操作。trap操作:代理进程主动发出的报文,通知管理进程有某些事情发生。前面 的3种操作是由管理进程向代理进程发出的,后面的2个操作是代理进程发给管理进程的,图2-1描述了 SNMP勺这5种报文操作。请注 意,在代理进程端是用熟知端口 161俩接收get或set报文,而在管理进程端是用端口 162来接收trap报文SNM数据报文的格式一个SNMP报文共有三个局部组成,即公共 SNMP首部、get/set首部trap首部、变量绑定。13 -Uli&2并呂宇节"SNMF报文if mUDF首部公共SNMP
24、首制ptM苜部变量绑定共同值假设值过失索引(m)请求标识(差篇状态(05)名PDU类型 4?±211代理的IP琬址坯F类型(06)特定代码时间假设值值trap MnUn(1) 公共SNMF首部 版本:写入版本字段的是版本号减 1,对于SNM(即SNMPVJ1那么应写入0 共同体(community):共同体就是一个字符串,作为管理进程和代理进程之间的明文口令,常用的是6个字符“ public 。 PDU类型:根据PDI的类型,填入04中的一个数字,其对应 关系如表2-3所示意图。PDU类型名称0get-request1get -n ext-request2get-resp onse3
25、set-request4trap表2-3 PDU类型(2) get/set 首部 请求标识符(request ID):这是由管理进程设置的一个整数值。代理进程在发送get-response报文时也要返回此请求标识符。管理 进程可同时向许多代理发出get报文,这些报文都使用UDP传送,先 发送的有可能后到达。设置了请求标识符可使管理进程能够识别返回 的响应报文对于哪一个请求报文 过失状态(error status ):由代理进程答复时填入 05中的 一个数字,见表2-3的描述过失状态名字说明0n oError一切正常1tooBig代理无法将答复装入到一个 SNMP 报文之中2no SuchNam
26、e操作指明了一个不存在的变量 3badValue一个set操作指明了一个无效值 或无效语法4read Only管理进程试图修改一个只读变量5genErr某些其他的过失表2-3过失状态描述 过失索引(error index):当出现 noSuchName badValue 或readOnly的过失时,由代理进程在答复时设置的一个整数,它指明有过失的变量在变量列表中的偏移(3) trap 首部 企业(enterprise ):填入trap报文的网络设备的对象标识符。此对象标识符肯定是在图3的对象命名树上的enterprise结点136.141下面的一棵子树上。 Trap类型:如表所示,当使用上述类型2、3、5时,在报文后面变量局部的第一个变量应标识响应的接口trap 类型名字说明0coldStart代理进行了初始化1warmStart代理进行了重
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年咖啡机销售合同范本
- 殡葬车合同协议
- 快递代理商合同协议
- 2025如何撰写果树种植及收购合同范本
- 正规出国劳务合同协议
- 商业订单委托合同协议
- 2025年餐饮业用工的劳动合同范本
- 《前列腺炎的护理》课件
- 2025企业标准劳动合同模板
- 2025年度广告合作合同模板
- 【涪陵榨菜产品成本控制问题及完善措施分析9600字】
- 公司外派工作合同协议书
- 巾帼家政职业技能竞赛(家政服务)理论考试题库(含答案)
- 终止合作意向书
- CJJT213-2016 生活垃圾卫生填埋场运行监管标准
- 2024年山东省淄博市沂源县中考二模生物试题(原卷版+解析版)
- Python自动化运维(技术与最佳实践)
- 2024届广东惠城区重点达标名校中考猜题语文试卷含解析
- MOOC 离散系统建模与仿真理论基础-南开大学 中国大学慕课答案
- 杜绝形式主义-从我做起
- GB/T 43824-2024村镇供水工程技术规范
评论
0/150
提交评论