第五課 一個(gè)基于IP插口的ISUP服務(wù)器例子
3. 實(shí)現(xiàn)細(xì)節(jié)
ISUP服務(wù)器軟件結(jié)構(gòu)
多線程ISUP服務(wù)器
客戶端處理框圖
總體圖
數(shù)據(jù)結(jié)構(gòu)
所有通信的數(shù)據(jù)包都有一個(gè)固定的格式,其中包括數(shù)據(jù)包的固定頭部和信息載荷。包大小固定為MAX_PSIZE+96。
數(shù)據(jù)包結(jié)構(gòu)定義如下:
typedef struct ISrvPkt_s {
ISrvPktHdr hdr;
U8 payload[MAX_PSIZE];
} ISrvPkt;
數(shù)據(jù)包的頭部結(jié)構(gòu)定義如下:
typedef struct ISrvPktHdr_s {
U16 size;
U16 type;
U32 ctahd;
U32 subtype;
} ISrvPktHdr;
其中:size 為16位的數(shù)據(jù)包有效包大。ò^部)。
Type 為16位的包類型,有2個(gè)值:
SC_DATA ISUP服務(wù)器發(fā)給客戶端的數(shù)據(jù)。
CS_DATA ISUP客戶端發(fā)給服務(wù)器的數(shù)據(jù)。
Ctahd 為32位的CT access句柄。
Subtype 為32位的子類型,目前有2個(gè)值:
ST_INCOMING_CALL 呼入;
ST_OUTGOING_CALL 呼出;
信息載荷有兩類,一為隸屬載荷,它指明信息隸屬的目標(biāo)信令點(diǎn)(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服務(wù)器配合完成呼叫
提供的客戶端接口函數(shù)
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);
呼入流程(確認(rèn)并應(yīng)答)
呼出流程(遠(yuǎn)端應(yīng)答)
呼叫釋放流程(由客戶端程序釋放)
呼叫釋放流程(由遠(yuǎn)端SS7交換機(jī)釋放)
阻塞呼叫流程(由客戶端程序發(fā)出阻塞)
阻塞呼叫流程(由遠(yuǎn)端SS7交換機(jī)發(fā)出阻塞)
5. 技術(shù)提示
高低字節(jié)順序說明:
通過插口發(fā)送數(shù)據(jù)之前和接收數(shù)據(jù)之后,要調(diào)用ntohs( ), ntohl( ), htons( ), htonl( )函數(shù)來轉(zhuǎn)換高低字節(jié)順序。
采用BSD插口API以便于移植。
采用POSIX多線程機(jī)制以便于移植。
用戶自定義的CTA_EVENT接收觸發(fā)事件,在客戶端中被集成到CTA事件處理循環(huán)之中,以便于集中處理。
客戶端使用nocc協(xié)議。
如果不采用單獨(dú)創(chuàng)建異步線程來處理ISUP消息,也可以采用另一個(gè)方法:調(diào)用ctaRegisterWaitObject.來把當(dāng)前線程掛起,等待ISUP消息的到來,直到ISUP消息到來后激活線程。
6. 結(jié)論
現(xiàn)在讓我們總結(jié)一下上面實(shí)現(xiàn)的ISUP服務(wù)器:
首先,它是一個(gè)建立在NMS SS7支持的ISUP協(xié)議層基礎(chǔ)上的多線程服務(wù)器。它提供了基于TCP協(xié)議插口的API函數(shù)。它是跨平臺的,同時(shí)支持Solaris和NT。
但是,這個(gè)服務(wù)器只支持ISUP協(xié)議,不支持SS7中其它協(xié)議層。它只是一個(gè)演示程序,沒有經(jīng)過完整的測試,不夠強(qiáng)壯。程序中用到的API函數(shù)(ISUPxxxx)也不是NMS SS7提供的標(biāo)準(zhǔn)API函數(shù)。
另外,是使用TCP還是使用UDP的問題,也沒有經(jīng)過論證,有待實(shí)踐中作進(jìn)一步確定。
相關(guān)資源
IETF(因特網(wǎng)工程任務(wù)組)網(wǎng)站:www.ietf.org
IETF是開發(fā)SS7/IP標(biāo)準(zhǔn)的主要組織,Sigtran組是專門從事SS7/IP開發(fā)的。
Rfc2960:這是SCTP協(xié)議的詳細(xì)說明書。
draft-ietf-sigtran-m3ua-10:這是MTP3用戶適應(yīng)層協(xié)議。
介紹SS7/IP有關(guān)知識及產(chǎn)品:www.ss7oip.com
SS7/IP有關(guān)新聞:www.intellinet-tech.com/news
附相關(guān)書籍:
<<rfc2960>>;
<<draft-ietf-sigtran-m3ua-10>>;
<<tutorial_ss7_ip_interworking>>;