第五課 一個基于IP插口的ISUP服務器例子
3. 實現細節(jié)
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服務器發(fā)給客戶端的數據。
CS_DATA ISUP客戶端發(fā)給服務器的數據。
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交換機釋放)

阻塞呼叫流程(由客戶端程序發(fā)出阻塞)

阻塞呼叫流程(由遠端SS7交換機發(fā)出阻塞)

5. 技術提示
高低字節(jié)順序說明:
通過插口發(fā)送數據之前和接收數據之后,要調用ntohs( ), ntohl( ), htons( ), htonl( )函數來轉換高低字節(jié)順序。
采用BSD插口API以便于移植。
采用POSIX多線程機制以便于移植。
用戶自定義的CTA_EVENT接收觸發(fā)事件,在客戶端中被集成到CTA事件處理循環(huán)之中,以便于集中處理。
客戶端使用nocc協議。
如果不采用單獨創(chuàng)建異步線程來處理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是開發(fā)SS7/IP標準的主要組織,Sigtran組是專門從事SS7/IP開發(fā)的。
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>>;
江津市| 白水县| 华蓥市| 郑州市| 旬邑县| 乌鲁木齐县| 六安市| 乾安县| 温宿县| 成武县| 张家港市| 黄山市| 依兰县| 阳山县| 平潭县| 寿阳县| 涿鹿县| 沽源县| 宜阳县| 黄梅县| 瑞丽市| 新巴尔虎左旗| 周口市| 合山市| 颍上县| 宣汉县| 富宁县| 屏东县| 浪卡子县| 永兴县| 玛纳斯县| 林口县| 礼泉县| 德江县| 嘉兴市| 永春县| 大兴区| 丰都县| 永兴县| 永宁县| 海宁市|