基于多线程的NGN综合接入网关测试系统的设计与实现
2008-03-17
作者:廖 薇, 刘锦高
摘 要: 针对目前接入网关测试系统" title="测试系统">测试系统的测试速度较慢的现状,运用多线程技术,设计了一种新的接入网关测试系统,主要介绍了本测试系统的整体设计,着重讲述了其多线程测试的实现,通过测试比较,证明了这种多线程接入网关测试系统在速度及性能上有很大的优势。
关键词: 多线程 NGN 接入网 网关 线路测试
随着电信事业跨越式的发展和通信技术的不断进步,各地电信局在原有交换机容量及出局线对都不能满足用户装机需求的情况下,如何提高和完善电信服务质量已经成为电信业面临的一个重要问题。传统的112集中受理系统只受理交换机直接接出的用户业务。随着电信技术的不断发展和接入网技术的日趋成熟,网络接入设备解决了城乡电信用户对通信的需求,接入网逐渐成为电信网上用户接入的主流[1]。
传统程控电话网采用的是外接测试头" title="测试头">测试头。如果进行话机测试,由于此时用户线与测试头建立的是金属线连接,对用户的振铃通话完全由测试头内的振铃电路和通话电路完成,用户馈电、铃流都由测试头控制,语音处理也在测试头中完成,局端的话机接在测试头上,与交换机或接入设备本身无关。而使用内置测试功能时,与用户的交互只能通过打电话的方式建立,并利用接入设备本身的通用振铃和语音电路。因此进行话机测试时,需先打通电话,才能进行振铃和话机测试。故采用内置测试方案,交互测试不能沿用测试头测试的流程。本文设计的正是这样一种内线测试方案。
本系统可以多线程地进行测试。对于不同网元的测试,允许并行进行,不需要等待结果返回后再开始新的测试;允许接收多条测试指令,对不同NE的测试也可以并行进行,在测试过程中可以接收和执行新的测试命令。
1 系统概况
本测试系统如图1所示,大容量综合接入" title="综合接入">综合接入网关(AG)可以连接到网管中心的网管系统上,该系统同时具备网元管理功能和业务管理功能。模块Agent 112可以对其所管辖的综合接入网关进行窄带线路测试" title="线路测试">线路测试,Agent 112与112中心之间通过协议转换器112MD 实现对接。
与外接测试头不同的是,112中心可通过IP网发命令到112MD的 Socket接口来实现线路测试功能,而传统的程控电话网的外置测试系统中,还需单独组建测试头的网管通道。
1.1 主要测试功能
综合接入网关实现的本测试系统符合电总112集中测试协议和接口规范[2]。
用户线路测试主要包括内线测试(电路测试)、外线测试(线路测试)以及配合测试(终端测试)三部分,各地具体的要求也是在此基础进行添加的。
(1)电路测试:包括拨号音测试、馈电电压测试、回路电流测试等。
(2)线路测试:包括群测(12项外线测试)、测用户线路交流电压值(AB、AG、BG)、测用户线路直流电压值(AB、AG、BG)、测用户环路直流电流值(AB)、测用户环路电阻值(AB)、测用户线路绝缘电阻值(AB、AG、BG)、测用户线路电容值(AB、AG、BG)以及测用户线路阻抗(AB、AG、BG)等。
(3)终端测试:包括对被测用户振铃、测试用户话机双音频特性或脉冲特性、对用户话机送嗥鸣音等。
1.2 工作过程
112中心在TS处设置数据,使所有综合接入网关的用户都通过112MD(相当于一个新增的CS)来测试。112测试由人工坐席或AVR(自动应答器)发起,TS收到测试请求后,如果是综合接入网关的用户,则会向112MD发出测试请求,112MD收到测试请求后,通过Agent 112的测试接口向相应的综合接入网关发送测试命令,网关测试完毕后将测试结果" title="测试结果">测试结果反馈给Agent 112,再由112MD进行协议转换后发送给TS,至此完成一次测试过程。
2 系统设计及实现
2.1 总体设计
本系统主要包括112MD、Agent、综合接入网关和用户终端等模块[3]。
112MD是一个协议转换器,测试中心发送112标准请求时,112MD负责接收并将协议转换成1355标准,再发送给Agent 112;Agent 112主要负责转化基于1355SAP的线路测试需求和结果并调用RAMI ,即进行命令分析,根据对应的测试命令对综合接入网关进行相应的测试;综合接入网关可以使一个单一节点向一个地区提供多种接入业务。
网管系统与本测试系统的接口通信协议采用TCP/IP协议。低层协议推荐使用x.25和ATM,也可以根据实际情况选用其他支持IP的低层协议[4]。
2.2 多线程的实现
多线程测试是在Agent 112模块中实现的。该模块的程序代码以WIN2000为平台,用VC++6.0编写[5]。Agent 112模块包含1355SAP Entity、Agent 112 Proxy、Log Record Module(日志记录模块)、Core Process Module(内核进程模块)和DN Translator Service(DN转换服务)五个部分,如图2所示。
1355SAP Entity实现了Agent Socket接入点接口。当Agent 运行时,它与调解设备进行通信,从解调设备获取LT需求并返回结果。在这个模块中还有一个缓冲区用来保存MD中的数据。当其收到线路测试需求时,首先验证此需求的有效性。如果有效,它便在核心程序模块中调用接口函数以启动测试程序。
内核进程模块是此应用软件的主要模块,它控制了整个测试程序,同时负责创建1355SAP Entity、日志记录模块,以及启动proxy的object,通过测试数据执行测试。
日志文档 是Agent 112和Topological View的共同点。Agent 112通过在日志文档中记录的所有关于被请求的测试(包括错误)信息来追踪测试。同时,通过Main View,操作者可以查看这些日志文档。当Agent 112启动时,它便会核对日志文档。如果日志文档不存在,便建立log file。如果已经存在,便打开以记录。记录的最大数量为1 000。如果超过该范围,便写在第一条记录上。
Agent 112 Proxy是一个独立程序,而且它也是一个短周期的进程。这就意味着当Agent收到有效的LT需求时它开始运行,返回结果时,它便关闭。
在Agent 112 Proxy与NE之间,使用了一个私有接口RAMI。RAMI是一系列的PRC调用。
2.2.1 类CAgent 112 Main
这个类与核心程序模块的软件架构是一致的。
client thread 启动,此class instance便被创建。它管理着整个线路控制程序。socket connection关闭,它便会被一起删掉。
2.2.2 Agent 112 Proxy
Agent 112 Proxy负责与NE通信。它通过C而不是C++实现。它的功能是进行线路测试。消息程序流程图如图3所示。
线路测试开始,Agent 112便启动Agent 112 Proxy并通过Windows Message发送测试命令,然后,Windows Message通过CCPE与NE通信,发送测试命令给NE,几秒钟后,NE通知Windows Message测试完成,Agent 112 Proxy收到,并从NE得到结果,把结果通过Windows Message送到Agent 112,最后Agent 112 Proxy自己结束。
2.2.3 类CTestReport
对于每个NE的测试,都可以启动一个独立的线程TestThread进行测试,并等待接收测试报告。
线程中主要包含了一个CTestReport类型的对象。CTestReport类是CAgent112Main类的子类。由于测试和等待结果的功能改在子线程中实现,所以,原有的类结构模型也不再适用。但是由于功能间的数据耦合紧密,所以采用了继承的方式分割。CTestReport类的成员保存了测试命令的有关指数和测试结果的相关信息。CTestReport类还提供了两个成员函数PerformTest()和ResultReport(),分别实现进行测试和返回测试结果的功能。使用数组pLTObject[m_Index]存储指向该类的对象指针,方便在结果返回时能够找到对应的对象。而pLTObject的索引号与NE名在InTestNE[NENum]中的索引号一致,由m_Index表示。
pLTObject [m_Index]= pTestReport;
在得到返回的测试结果时,逐一进行比较,找到对应的对象:
for(i=0;i
if(((Agent112_MESSAGE_LT_RESULT *)(pResultData->lpData))->agent112Obj_ptr
==(DWORD) pLTObject[i])
{
pLTObject[i]->
ResultArrived((Agent112_MESSAGE_LT_RESULT *)(pResultData->lpData));
break;
}
}
在进行测试时,因等待测试结果需要一定的时间,在这个过程中线程将会挂起,直到结果到来才被解挂。
由于测试由单线程变为多线程,需要处理一些同步机制。在将一些测试参数传递至子线程时,要保证在传递之前这些信息不能被改动,可以利用信号量来进行同步。再一次使用对象时首先需要进行判断,然后赋值,最后释放资源[6]。
if(WaitForSingleObject(hBuffWaiting,60000)
//for synchronization
== WAIT_TIMEOUT)
SetEvent(hBuffWaiting);
另外,有些命令由多个子命令组成。在第一个子命令还未完成时,第二个子命令应处于等待状态,故而使用dwWaitResult=WaitForSingleObject(pLTObject[i]->GetHandle(),500); 来实现。
通过NE名找到对应的测试线程,所以,首先需要找到NE名,在这种情况下,创建函数GetNEName()来获得NE名。
在CAgent112Main类中增加HANDLE m_hTestThread用来记录线程的句柄,以便在测试结果返回时能够找到对应的线程。
增加一个数组InTestNE[i]记录正在进行测试的NE名。该数组在生成线程之前用来检测NE是否符合要求。如果要测试的NE名已经存在,说明该NE已经在进行测试,暂时不能接受新的测试命令,这条命令将会被驳回,返回一个rcode=53的错误;反之,认为该NE符合要求,将会为其启动测试线程,进行测试,并且在InTestNE[i]找到空位置,存储该NE名。
针对这种情况,新增加一种错误信息,即53号错误信息。
Agent 112_MESSAGE_ERROR*NEBusy=new Agent 112_MESSAGE_ERROR;
NEBusy->rcode = 53;
pAgent112 Main->ReturnError(TOE_NE,NEBusy);
在C1355SAP->ReturnEorror()中,加入处理过程,并进行错误处理。
if(pError->rcode==53)
sprintf(szTemp,"TOE,NE,%d,\"NE in Testing\"",pError->rcode);
在启动测试线程后,需要将由AnalyzeCMD()得到的信息从主线程传递至子线程,所以对于C1355SAP类型的数据采用赋值重用的方式封装。这样
C1355SAP & C1355SAP::operator=(const C1355SAP& c1355sap)
CAgent112Main的析构函数~CAgent112Main()的实现发生改变。在单线程测试时,CAgent112Main类对象pAgent112Main生命周期结束时,一轮测试结束,socket可以关闭,所以可以将closesocket放在析构函数~CAgent112Main()中实现。但是在多线程测试时,某一个NE测试结束并不能代表连接的结束,socket也不能关闭,所以,closesocket改在停止测试时实现。
在接收命令部分,允许多条指令的同时输入。引入一个数组m_CommandBuff记录输入的多条命令,ComIndex指示正在进行测试的命令的索引,ComNum表示一次读入的命令数。这个命令数不一定就是一次发送的命令的条数,它还与接收指令的Buff大小有关。它只能表示Agent 112一次从112MD收到的命令的条数。
在测试部分,将启用新的线程,并发的执行测试功能不影响新的命令的接收。
3 测试比较
在传统的单线程测试过程中,每次只能发给Agent 112一个测试指令,并且只有在Agent 112发回测试结果后才能发送下一条命令。在等待测试结果的过程中,计算机处于闲置状态,不能对其他的NE进行测试。而在本系统中,允许同时接收多条测试指令,并且对不同NE的测试可以并发进行,在进行测试的过程中,可以接收和执行新的测试命令。但是对同一个NE,一次只允许一条命令进行测试。经过测试比较两种情况分别如图4所示。
在发送命令时,打开一个超级终端,连接到本机127.0.0.1:9009端口。写好一个文本,例如命名为112command.txt,然后写入命令:
INVOKEID=900 FEEDVOL TYPE=1:AGNENAME="ne0" AGNEIP=10.8.127.217 RACKNO=1 FRMNO=1 SLOTNO=8 PORTNO=4;
最后在超级终端-传送-发送文本文件,选取此文件发送过去。测试结果会显示在112MD和超级终端界面中。
本文设计了一种基于多线程的NGN综合接入网关测试系统,其在测试速度和性能方面较之单线程测试系统有很大的提高,是目前发展的热点。
参考文献
[1]孔小斌,章萍.接入网112线路测试技术与实现[J].电信科学,2000,(6):36-38.
[2]接入网112电总规范. 中国电信,1999,(6).
[3]赵慧玲,叶华.以软交换为核心的下一代网络技术[M].北京:人民邮电出版社,2002:30-56.
[4]W. RICHARD STEVENS. TCP/IP Illustrated Volume1:The Protocols[M].北京:机械工业出版社,2005:20-100.
[5]黄维通. Visual C++面向对象与可视化程序设计[M].北京:清华大学出版社,2000:10-250.
[6]Jeffrey Richter.Windows 高级编程指南[M].北京:清华大学出版社,2001:47-59.