第五课 一个基于IP插口的ISUP服务器例子
3. 实现细节
ISUP服务器软件结构
多线程ISUP服务器
客户端处理框图
总体图
数据结构
所有通信的数据包都有一个固定的格式,其中包括数据包的固定头部和信息载荷。包大小固定为MAX_PSIZE+96。
数据包结构定义如下:
typedef struct ISrvPkt_s {
ISrvPktHdr hdr;
U8 payload[MAX_PSIZE];
} ISrvPkt;
数据包的头部结构定义如下:
typedef struct ISrvPktHdr_s {
U16 size;
U16 type;
U32 ctahd;
U32 subtype;
} ISrvPktHdr;
其中:size 为16位的数据包有效包大小(包括头部)。
Type 为16位的包类型,有2个值:
SC_DATA ISUP服务器发给客户端的数据。
CS_DATA ISUP客户端发给服务器的数据。
Ctahd 为32位的CT access句柄。
Subtype 为32位的子类型,目前有2个值:
ST_INCOMING_CALL 呼入;
ST_OUTGOING_CALL 呼出;
信息载荷有两类,一为隶属载荷,它指明信息隶属的目标信令点(DPC)和电路号(CIC)。定义如下:
typedef struct ISrvAttachPayload_s {
U32 CIC;
U32 DPC;
} ISrvAttachPayload;
第二类为号码载荷,包含呼叫的主被叫号码,定义如下:
typedef struct ISrvNumbersPayload_s {
char calling_number[MAX_SIZE+1];
char called_number[MAX_SIZE+1];
} ISrvNumbersPayload;
映射表
Circuit |
Sockfd |
Ctahd |
CIC |
DPC |
1 |
5 |
0x80000001 |
1 |
1.1.1 |
2 |
6 |
0x80000002 |
2 |
1.1.1 |
3 |
7 |
0x80000003 |
3 |
1.1.1 |
4 |
8 |
0x80000001 |
1 |
1.1.2 |
5 |
9 |
0x80000002 |
2 |
1.1.2 |
4. 如何和ISUP服务器配合完成呼叫
提供的客户端接口函数
DWORD NMSAPI ISUPServerConnect(char *ip_addr,char *logfilename);
DWORD NMSAPI ISUPServerAttach(CTAHD ctahd, unsigned long CIC, unsigned long DPC);
DWORD NMSAPI ISUPServerPlaceCall( CTAHD ctahd, char *calling_num, char *called_num);
DWORD NMSAPI ISUPServerAcceptCall(CTAHD ctahd);
DWORD NMSAPI ISUPServerAnswerCall(CTAHD ctahd);
DWORD NMSAPI ISUPServerReleaseCall(CTAHD ctahd);
DWORD NMSAPI ISUPServerRejectCall(CTAHD ctahd);
DWORD NMSAPI ISUPServerReset(CTAHD ctahd);
DWORD NMSAPI ISUPServerBlockCalls(CTAHD ctahd);
DWORD NMSAPI ISUPServerUnblockCalls(CTAHD ctahd);
呼入流程(确认并应答)
呼出流程(远端应答)
呼叫释放流程(由客户端程序释放)
呼叫释放流程(由远端SS7交换机释放)
阻塞呼叫流程(由客户端程序发出阻塞)
阻塞呼叫流程(由远端SS7交换机发出阻塞)
5. 技术提示
高低字节顺序说明:
通过插口发送数据之前和接收数据之后,要调用ntohs( ), ntohl( ), htons( ), htonl( )函数来转换高低字节顺序。
采用BSD插口API以便于移植。
采用POSIX多线程机制以便于移植。
用户自定义的CTA_EVENT接收触发事件,在客户端中被集成到CTA事件处理循环之中,以便于集中处理。
客户端使用nocc协议。
如果不采用单独创建异步线程来处理ISUP消息,也可以采用另一个方法:调用ctaRegisterWaitObject.来把当前线程挂起,等待ISUP消息的到来,直到ISUP消息到来后激活线程。
6. 结论
现在让我们总结一下上面实现的ISUP服务器:
首先,它是一个建立在NMS SS7支持的ISUP协议层基础上的多线程服务器。它提供了基于TCP协议插口的API函数。它是跨平台的,同时支持Solaris和NT。
但是,这个服务器只支持ISUP协议,不支持SS7中其它协议层。它只是一个演示程序,没有经过完整的测试,不够强壮。程序中用到的API函数(ISUPxxxx)也不是NMS SS7提供的标准API函数。
另外,是使用TCP还是使用UDP的问题,也没有经过论证,有待实践中作进一步确定。
相关资源
IETF(因特网工程任务组)网站:www.ietf.org
IETF是开发SS7/IP标准的主要组织,Sigtran组是专门从事SS7/IP开发的。
Rfc2960:这是SCTP协议的详细说明书。
draft-ietf-sigtran-m3ua-10:这是MTP3用户适应层协议。
介绍SS7/IP有关知识及产品:www.ss7oip.com
SS7/IP有关新闻:www.intellinet-tech.com/news
附相关书籍:
<<rfc2960>>;
<<draft-ietf-sigtran-m3ua-10>>;
<<tutorial_ss7_ip_interworking>>;