作 者:尚楠 张治中 杨抗 余银凤
在CAP协议描述中,以localValue,length,operator-code,errorcode分别对应BER编码中的TLV,组成树状数据结构图[1],具体解码设计将在下面分析。
3.3.2解码器实现方案
在通信测试仪表中主要是对协议及信令的PDU进行操作,为满足对PDU的公共操作我们制定了CPdu基类,主要实现对PDU的创建、删除、合并、内存管理、长度检查、指针操作等基本功能。在继承CPdu类的基础上,我们派生出CPduCap类,在类CPduCap中设定外部接口函数intDeeode(CString&res),完成详细解码过程,并通过引用传递的方式将解码结果置于CString类型的字符串内,便于主控方调用解码结果。返回值结果定义如下:1:非本层PDU,不操作res;0:成功解码;1:本层PDU,解码出错,错误信息加到结果字符串中。
由于ASN.1语法的特点,Decode(CString&res)函数采用树状遍历嵌套调用的方式进行解码,直至解到BER的基础函数为止。
在基础解码函数中,我们大量使用C++标准模板库中的模板类:容器std::vector。vector是一个多功能的,能够操作多种数据结构和算法的模板类和函数库,在ASN.1复杂数据机构的环境下,vector的使用方便了对各种数据类型进行读取、存储、转换操作。
详细解码的实现是对通信协议进行深层次分析,以及统计、CDR合成的基础,下面主要关注CAPCDR合成的实现。
3.3.3呼叫合成器实现方案
呼叫合成器的主要功能就是根据到达的帧信息和呼叫信息,将帧消息按呼叫归类,即把消息ID加入到相应的CDR记录中,并在呼叫结束时通知CDR缓存。CDR(calldatarecord)在PSTN中表示呼叫数据记录,现在延伸意思为一个完整的流程,CDR合成是上述功能的基础,对网络中消息按信令流程进行归类,并用索引方式把这些消息联系到一起,然后才便于完成诸如呼叫跟踪和呼损统计等高级功能。CDR合成算法主要是根据一些关键参数进行查找、匹配来确定是否属于同一个消息流程,因此在这个过程中,需要一些临时存储方式来保存没有匹配到的消息,在内存分配上比较复杂,涉及动态分配内存[5]。
移动智能网应用部分(CAP)是在7号信令的SCCP/TCAP之上的,即CAP为TCAP的用户(也称TC用户),直接与TCAP的成分子层相连。CAP使用TCAP所提供的TC请求原语将要发送的CAP消息传送至TCAP成分子层,然后再通过TCAP的事物处理子层、SCCP以及MTP将消息发到对端,或者使用TCAP所提供的指示原语接收对端发来的CAP消息。
TCAP有两个重要概念:对话和操作。在网络中一对节点之间使用TCAP进行的所有通信都被结构化为对话。例如,为处理一个智能呼叫而在SSP和SCP之间进行的所有通信可构成一个对话。在对话过程中交换的信息元素称为操作,CAP协议的消息即存放在这些信息元素中传输。操作由源TC用户调用,请求目的地TC用户执行该操作指定的动作。在这个过程中,每个成份处理TC原语均带有一个事务ID(也称对话ID),成份子层收到此原语后,就将收到的对话ID与其相同的所有成份分配给这一对话。因此,我们在CAP的CDR过程中,以Transac-tionID作为关键字CDRID在数据结构中进行查找,匹配,确定惟一的CDR流程。TransactionID又分源事务ID和目的事务ID,分别存在于不同的TC原语中。
在呼叫合成实现中,最主要有两个方法:
(1)设定CDR缓存的方法voidSetCdrBuffer(CAPCDRBUF*pBuf):其中CAPCDR BUF是包含CCapCDR的CDR缓存模板类,此函数指定了CDR记录缓存的位置。
(2)CDR处理函数:voidHandle(constCallInfoCap&CapInfo,constNgnPktInfo& PktInfo)。他是进行呼叫合成的核心,也是设计的关键。他有两个参数,分别是该协议呼叫信息和数据帧信息。其基本流程如图4所示。
其中,判断某CDR是否已缓存,通知CDR缓存该CDR已结束和向缓存中添加新的CDR都需要调用CDR缓存模板类的方法,对于CAP协议的CDR子类:CCapCDR,声明一个CAPCDR缓存类型方法如下:ty-pedefCCallBufCAPCDR BUF。
在缓存操作中的具体实现如下:
(1)查询某CDR是否已缓存,利用CDR缓存的Search方法:
newCdr.nLinkID=nLinkld:
//设定关联属性(根据协议类型增加)
_tcscpy(newCdr.CallID,Caplnfo.CallID);
CCapCDR*pFind=mpCdrBuf=->Search(newCdr);
//查询该CDR是否已存在
(2)向缓存中添加新的CDR:使用InsertNewCDR方法:
CCapCDR*pFind=mpCdrBuf->InsertNewCDR(newCdr);
(3)通知缓存某CDR已结束:
boolbReturn=mpCdrlBuf->CallCompleted(*pFind);CDR呼叫其他相关分析在此不再赘述。
4软件运行实现结果
在模块的整个开发流程中,每一步都要进行软件的测试工作,以保证整个模块开发工作的正确性。下面是软件实测后进行CDR合成的结果,可以从图5中看到,软件实现了CAP的CDR功能,点击单条消息名称可以看到消息的关键数据,在此不再进行演示。
5结语
采用面向对象的思想,通过C++语言,我们实现了CAP软件模块。在模块开发流程结束后,通过现场测试,该软件模块完全符合中国移动《软交换测试仪表测试规范(征求稿)》中对移动智能网测试的要求[6],目前该软件模块已运用于商用通信测试仪表中。