| ||||||
| 2.SNMP通信程序 |
| 后台程序进行数据采集时利用基于UDP的SNMP协议获取ADSL接入设备上的端口状态信息。利用SNMP协议进行通信的过程如图2所示。 |
|
| 本文以华为公司的ADSL设备为例介绍程序的实现过程。华为的MA5100提供对用户的接入服务,MA5100采用标准插框结构设计,每框16个槽位,可插16块板,其中7块为ADSL用户接入板,每块板上提供16个端口。 |
| 有关端口状态的MIB项如下: |
| 1.3.6.1.4.1.2011.2.6.3.6.3.2.1.1.0.0.0 |
| 其中,倒数第三个0代表机框号为0,当MA5100为单机框时,此项为0。倒数第二个0代表槽位号为0,为了获取一个设备上的所有用户状态信息,在此项上分别填入0~6。倒数第一个0代表端口号为0,在程序中应依次填入0~15。 |
| 以上的MIB项有7个取值,分别代表的含义为:0:激活;1:去激活;2:物理损坏;3:正在激活;4:正在去激活;5:阻塞;6:解阻塞。其中我们取0和3状态为用户在线状态。 |
| 我们利用adslwalk程序来遍历MIB树,该程序每执行一次,获取一块板上的信息,需执行7次获取一台设备上的所有信息。以下为adslwalk程序的主要部分,程序中的函数调用了如图3所示的一些基本通信函数: |
| if ((fp=fopen(filebuf,“a”))==NULL) |
| PRintf(“cann’t open file/n”); |
| while (1) |
| { |
| pdu = snmp_pdu_create(SNMP_PDU_GETNEXT); |
| snmp_add_null_var(pdu, name, name_length); |
| status = snmp_synch_response(ss, pdu,&response); |
| for (vars = response->variables; vars; vars = vars->next_variable) |
| { |
| memcpy((char *)name, (char *)vars->name, |
| vars->name_length * sizeof(oid)); |
| name_length = vars->name_length; |
| sprint_value(buf,vars->name,vars-> |
| name_length,vars); |
| j=strlen(buf); |
| buf[j]=‘/n’; |
| buf[j+1]=‘/0’; |
| fwrite(buf,strlen(buf),1,fp); |
| } /* End of var processing loop */ |
| } |
| fclose(fp); |
| adslwalk程序执行时的格式为: |
| adslwalk 10.10.20.30 public |
| 1.3.6.1.4.1.2011.2.6.3.6.3.2.1.1.0.0 |
| 其中10.10.20.30为指定MA5100设备的网管地址。程序执行完毕后,生成名为10.10.20.30.temp的文件,文件内容为该MA5100的用户端口状态信息。 |
| 3.CGI程序 |
| 在本系统中,为了便于前台和后台之间的交互,笔者采用了CGI技术,用它在WWW中生成MA5100设备的面板图。 |
| 标准的CGI程序是用户和后台的直接交互,而我们所编写的CGI程序则将.temp库文件作为程序输入部分。 |
| 以下为本系统中CGI程序的主要部分: |
| strcpy(filename,homedir); |
| strcat(filename,“10.10.20.30.temp”); |
| draw(filename); |
| /*下面是绘图函数*/ |
| draw(ptr) |
| char *ptr; |
| { |
| FILE *fp; |
| struct stat statbuf; |
| char buf[200]; |
| int i=0,j,k; |
| char inputs[200]; |
| if ((fp=fopen(ptr,“r”))==NULL) |
| printf(“<H4 ALIGN=center>can’t open file |
| </A></H4>/n”); |
| fstat(fileno(fp),&statbuf); |
| if (statbuf.st_size!=0) |
| { |
| i=0; |
| while (!feof(fp)) |
| { |
| fgets(buf,sizeof(buf)-1,fp); |
| if (strstr(buf,“0”)) |
| inputs[i]=‘0’; |
| else |
| if (strstr(buf,“3”)) |
| inputs[i]=‘3’; |
| else |
| inputs[i]=‘5’; |
| i++; |
| } |
| printf(“<TABLE ALIGN=center BORDER=2>”); printf(“<TR><TH>TH><TH>0</TH> |
| <TH>1</TH><TH>2</TH><TH>3</TH><TH>4</TH><TH>5</TH><TH>6</TH></TR>”); |
| for (k=0;k<16;k++) |
| { |
| printf(“<TR>”); |
| for (j=0;j<7;j++) |
| { |
| if (j==0) |
| printf(“<TD>%d</TD>”,k); |
| if (inputs[j*16+k]==‘0’) |
| printf(“<TD bgcolor=00FF00>%c |
| </TD>”,inputs[j*16+k]); |
| else{ |
| if (inputs[j*16+k]==‘3’) |
| printf(“<TD bgcolor=FFFF00>%c |
| </TD>”,inputs[j*16+k]); |
| else |
| printf(“<TD bgcolor=FF0000>%c |
| </TD>”,inputs[j*16+k]); |
| } |
| } |
| printf(“</TR>”); |
| } |
| printf(“</TABLE>”); |
| } |
| fclose(fp); |
| return(0); |
| } |
| 上述程序放置在/cgi-bin目录下,当管理员按下查看面板图的按钮时,系统调用该程序输出结果。在前台的HTML文件中我们用以下的语句来调用CGI程序: |
| <H3 ALIGN=left><A HREF=“/cgi-bin/adsltable”>Table</A></H3> |
| 4.各种图片的生成程序 |
| 以Solaris操作系统为例,加载ZBLIB、GDLIB软件包,就可以在Solaris下用C语言编写程序,将采集来的数据生成JPG、PNG等压缩格式的图片。 |
| 5.后台程序的调度 |
| 以Solaris操作系统为例,在Solaris中利用Crontab来定期重复执行相关命令。Crontab命令的定期执行是由Cron daemon完成的。Cron daemon实时检查系统的/var/spool/cron/crontabs目录,根据指定的时间运行相应的程序。 |
| Cron daemon根据每个Crontab文件中的命令定期运行系统任务,Crontab文件的每行代表一条命令,每行开头是该条命令执行的日期和时间。 |
| 时间域的顺序为:分、小时、日期、月、星期。例如: |
| 0 20 * * 0 ,4 /etc/cron.d/logchecker |
| 表示每周日、周四晚8点运行logchecker。 |
| Crontab存放在/var/spool/cron/crontabs目录中系统默认的Crontab文件中。 |
| 建立Crontab的过程如下: |
| 设置全局变量EDITOR: |
| $setenv EDITOR /usr/bin/vi |
| 建立Crontab文件: |
| $crontab -e |
| 按语法要求,加入要求系统定时完成的任务。 |
| 存盘退出。 |
| 查看Crontab内容用以下命令: |
| $crontab -l |
| 下面是一个应用实例: |
| [root@search che]# crontab -l |
| # This is a crontab file , please don't edit it unless necessary . |
| 0,5,10,15,20,25,30,35,40,45,50,55 * * * * /home/httpd/html/gddemo.sh |
| 19,49 * * * * /home/httpd/html/private/adslgddemo |
| #The end. |
新闻热点
疑难解答