ADSL是一項(xiàng)變得越來越為家庭和中小企業(yè)用戶所熟知的寬帶技術(shù),它被稱為“非對(duì)稱”是由于其雙向或雙工帶寬中的大部分被分配給了下行方向,即向用戶發(fā)送數(shù)據(jù)的方向。ADSL下行速率可高達(dá)6.1Mbps,而上行速率最多為640Kbps。由于ADSL技術(shù)具有在帶寬和資費(fèi)上的優(yōu)勢(shì),各ISP都在廣泛地推廣ADSL業(yè)務(wù)。
一個(gè)大型ISP的網(wǎng)絡(luò)往往由許多節(jié)點(diǎn)組成,ADSL設(shè)備被分布在各個(gè)節(jié)點(diǎn)中為用戶提供接入服務(wù),同時(shí)每個(gè)節(jié)點(diǎn)中又可能存在不同廠家的或同一廠家的不同型號(hào)的ADSL設(shè)備。目前的情況是,各廠家提供的ADSL網(wǎng)管系統(tǒng)只是針對(duì)本身設(shè)備或單個(gè)節(jié)點(diǎn)的ADSL設(shè)備進(jìn)行網(wǎng)絡(luò)管理,而無法對(duì)ISP所有各節(jié)點(diǎn)的不同種類的ADSL設(shè)備進(jìn)行統(tǒng)一管理。筆者對(duì)黑龍江省所采用的ADSL設(shè)備進(jìn)行了分析研究,開發(fā)出一套ADSL網(wǎng)絡(luò)管理系統(tǒng),將全省各節(jié)點(diǎn)的各種ADSL設(shè)備統(tǒng)一到了一個(gè)管理平臺(tái)上。
系統(tǒng)的總體設(shè)計(jì)
為了提高整個(gè)系統(tǒng)的運(yùn)行效率,同時(shí)也為了使系統(tǒng)管理員在訪問網(wǎng)管系統(tǒng)時(shí)有一個(gè)好的視覺效果,我們將ADSL網(wǎng)絡(luò)管理系統(tǒng)分為前臺(tái)和后臺(tái)兩個(gè)部分。前、后臺(tái)程序相對(duì)獨(dú)立運(yùn)行。前臺(tái)程序用HTML語言編寫,調(diào)用后臺(tái)程序的輸出結(jié)果并加入說明。后臺(tái)程序用C語言編寫,負(fù)責(zé)采集數(shù)據(jù)、處理數(shù)據(jù)、生成結(jié)果輸出。另外,為了便于前臺(tái)和后臺(tái)的交互,在系統(tǒng)中采用CGI技術(shù)來顯示ADSL接入設(shè)備的面板。這樣系統(tǒng)管理員在需要調(diào)用此網(wǎng)絡(luò)系統(tǒng)時(shí),在任意計(jì)算機(jī)上調(diào)用瀏覽器就可以看到相應(yīng)ADSL設(shè)備的運(yùn)行情況。
對(duì)于一個(gè)ADSL網(wǎng)絡(luò)管理系統(tǒng)來說,第一步要做的事情就是采集ADSL接入設(shè)備上有關(guān)接入端口當(dāng)前占用情況的原始數(shù)據(jù)。我們利用SNMP協(xié)議來獲得這些數(shù)據(jù),通過開發(fā)基于UDP的SNMP通信程序取得ADSL接入設(shè)備上MIB中的相應(yīng)項(xiàng)。如果沒有一個(gè)唯一對(duì)應(yīng)的MIB項(xiàng)是我們所需要的,還可以通過取得ADSL上每個(gè)接入端口狀態(tài)的方法來最終統(tǒng)計(jì)出所需要的數(shù)據(jù)。
在采集數(shù)據(jù)時(shí)生成兩種庫(kù)文件:一種為.temp文件,另一種為.che文件。這兩種庫(kù)文件都是文本文件。首先將取得的原始數(shù)據(jù)放入每臺(tái)ADSL接入設(shè)備所對(duì)應(yīng)的數(shù)據(jù)庫(kù)中,因?yàn)閷?duì)每臺(tái)ADSL接入設(shè)備來說,其槽位和端口號(hào)是固定的,所以此數(shù)據(jù)庫(kù)可以簡(jiǎn)化為一個(gè)文本文件,其內(nèi)容是順序存放的端口狀態(tài),而文件名則為相應(yīng)ADSL接入設(shè)備的網(wǎng)管IP地址+.temp。這樣,當(dāng)后臺(tái)程序的采集部分執(zhí)行完畢后,對(duì)每臺(tái)ADSL接入設(shè)備就有了一個(gè)唯一對(duì)應(yīng)的庫(kù)文件,文件內(nèi)容為當(dāng)前該設(shè)備各端口的狀態(tài)標(biāo)識(shí),每次后臺(tái)程序執(zhí)行時(shí)這些庫(kù)文件被清空重寫。.che庫(kù)文件存放的內(nèi)容為每天各節(jié)點(diǎn)的占用端口數(shù)及總的占用端口數(shù),每條記錄對(duì)應(yīng)兩個(gè)數(shù)據(jù)項(xiàng),分別為端口數(shù)及所對(duì)應(yīng)的時(shí)間。
在后臺(tái)程序的數(shù)據(jù)處理部分,其輸入為數(shù)據(jù)采集部分的輸出,可統(tǒng)計(jì)出現(xiàn)有設(shè)備的端口占用情況和設(shè)備的運(yùn)行情況。
系統(tǒng)的程序?qū)崿F(xiàn)
1.總體流程
|
2.SNMP通信程序 |
后臺(tái)程序進(jìn)行數(shù)據(jù)采集時(shí)利用基于UDP的SNMP協(xié)議獲取ADSL接入設(shè)備上的端口狀態(tài)信息。利用SNMP協(xié)議進(jìn)行通信的過程如圖2所示。 |
|
本文以華為公司的ADSL設(shè)備為例介紹程序的實(shí)現(xiàn)過程。華為的MA5100提供對(duì)用戶的接入服務(wù),MA5100采用標(biāo)準(zhǔn)插框結(jié)構(gòu)設(shè)計(jì),每框16個(gè)槽位,可插16塊板,其中7塊為ADSL用戶接入板,每塊板上提供16個(gè)端口。 |
有關(guān)端口狀態(tài)的MIB項(xiàng)如下: |
1.3.6.1.4.1.2011.2.6.3.6.3.2.1.1.0.0.0 |
其中,倒數(shù)第三個(gè)0代表機(jī)框號(hào)為0,當(dāng)MA5100為單機(jī)框時(shí),此項(xiàng)為0。倒數(shù)第二個(gè)0代表槽位號(hào)為0,為了獲取一個(gè)設(shè)備上的所有用戶狀態(tài)信息,在此項(xiàng)上分別填入0~6。倒數(shù)第一個(gè)0代表端口號(hào)為0,在程序中應(yīng)依次填入0~15。 |
以上的MIB項(xiàng)有7個(gè)取值,分別代表的含義為:0:激活;1:去激活;2:物理損壞;3:正在激活;4:正在去激活;5:阻塞;6:解阻塞。其中我們?nèi)?和3狀態(tài)為用戶在線狀態(tài)。 |
我們利用adslwalk程序來遍歷MIB樹,該程序每執(zhí)行一次,獲取一塊板上的信息,需執(zhí)行7次獲取一臺(tái)設(shè)備上的所有信息。以下為adslwalk程序的主要部分,程序中的函數(shù)調(diào)用了如圖3所示的一些基本通信函數(shù): |
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程序執(zhí)行時(shí)的格式為: |
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設(shè)備的網(wǎng)管地址。程序執(zhí)行完畢后,生成名為10.10.20.30.temp的文件,文件內(nèi)容為該MA5100的用戶端口狀態(tài)信息。 |
3.CGI程序 |
在本系統(tǒng)中,為了便于前臺(tái)和后臺(tái)之間的交互,筆者采用了CGI技術(shù),用它在WWW中生成MA5100設(shè)備的面板圖。 |
標(biāo)準(zhǔn)的CGI程序是用戶和后臺(tái)的直接交互,而我們所編寫的CGI程序則將.temp庫(kù)文件作為程序輸入部分。 |
以下為本系統(tǒng)中CGI程序的主要部分: |
strcpy(filename,homedir); |
strcat(filename,“10.10.20.30.temp”); |
draw(filename); |
/*下面是繪圖函數(shù)*/ |
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目錄下,當(dāng)管理員按下查看面板圖的按鈕時(shí),系統(tǒng)調(diào)用該程序輸出結(jié)果。在前臺(tái)的HTML文件中我們用以下的語句來調(diào)用CGI程序: |
<H3 ALIGN=left><A HREF=“/cgi-bin/adsltable”>Table</A></H3> |
4.各種圖片的生成程序 |
以Solaris操作系統(tǒng)為例,加載ZBLIB、GDLIB軟件包,就可以在Solaris下用C語言編寫程序,將采集來的數(shù)據(jù)生成JPG、PNG等壓縮格式的圖片。 |
5.后臺(tái)程序的調(diào)度 |
以Solaris操作系統(tǒng)為例,在Solaris中利用Crontab來定期重復(fù)執(zhí)行相關(guān)命令。Crontab命令的定期執(zhí)行是由Cron daemon完成的。Cron daemon實(shí)時(shí)檢查系統(tǒng)的/var/spool/cron/crontabs目錄,根據(jù)指定的時(shí)間運(yùn)行相應(yīng)的程序。 |
Cron daemon根據(jù)每個(gè)Crontab文件中的命令定期運(yùn)行系統(tǒng)任務(wù),Crontab文件的每行代表一條命令,每行開頭是該條命令執(zhí)行的日期和時(shí)間。 |
時(shí)間域的順序?yàn)椋悍、小時(shí)、日期、月、星期。例如: |
0 20 * * 0 ,4 /etc/cron.d/logchecker |
表示每周日、周四晚8點(diǎn)運(yùn)行l(wèi)ogchecker。 |
Crontab存放在/var/spool/cron/crontabs目錄中系統(tǒng)默認(rèn)的Crontab文件中。 |
建立Crontab的過程如下: |
設(shè)置全局變量EDITOR: |
$setenv EDITOR /usr/bin/vi |
建立Crontab文件: |
$crontab -e |
按語法要求,加入要求系統(tǒng)定時(shí)完成的任務(wù)。 |
存盤退出。 |
查看Crontab內(nèi)容用以下命令: |
$crontab -l |
下面是一個(gè)應(yīng)用實(shí)例: |
[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. |
其中第4行為對(duì)ADSL網(wǎng)絡(luò)管理系統(tǒng)后臺(tái)程序的調(diào)度,在每小時(shí)的19分和49分各執(zhí)行一次,也就是每半小時(shí)執(zhí)行一次。
摘自《計(jì)算機(jī)世界》