當前位置:編程學習大全網 - 源碼下載 - 畢業設計 SIP協議的實現

畢業設計 SIP協議的實現

我們先進行壹個簡單的純SIP信令(不帶語音連接建立)的UAC的SIP終端的程序開發的試驗(即壹個只能作為主叫不能作為被叫的的SIP軟電話模型),我們創建壹個MFC應用程序,對話框模式,照上面的說明,設置工程包含我們上面得到的oSIP的相關開發庫及SDK的壹些開發庫,並且由於默認LIBC的沖突,需要排除MSVCRT[D]開發庫(其中D代表Debug模式下,沒有D表示Release模式下),直接使用eXosip的幾個主要函數就可以創建壹個基本的SIP軟電話模型。

其主要流程為:

初始化eXosip庫-啟動事件監聽線程-向SIP Proxy註冊-向某SIP終端(電話號碼)發起呼叫-建立連接-結束連接

初始化代碼:

int ret = 0;

ret = eXosip_init ();

eXosip_set_user_agent("##YouToo0.1");

if(0 != ret)

{

AfxMessageBox("Couldn't initialize eXosip!\n");

return false;

}

ret = eXosip_listen_addr (IPPROTO_UDP, NULL, 0, AF_INET, 0);

if(0 != ret)

{

eXosip_quit ();

AfxMessageBox("Couldn't initialize transport layer!\n");

return false;

}

啟動事件監聽線程:

AfxBeginThread(sip_uac,(void *)this);

向SIP Proxy註冊:

eXosip_clear_authentication_info();

eXosip_add_authentication_info(uname, uname, upwd, "md5", NULL);

real_send_register(30); /* 自定義函數代碼請見源碼 */

發起呼叫(構建假的SDP描述,實際軟電話使用它構建RTP媒體連接):

osip_message_t *invite = NULL; /* 呼叫發起消息體 */

int i = eXosip_call_build_initial_invite (&invite, dest_call, source_call, NULL, "## YouToo test demo!");

if (i != 0)

{

AfxMessageBox("Intial INVITE failed!\n");

}

char localip[128];

eXosip_guess_localip (AF_INET, localip, 128);

snprintf (tmp, 4096,

"v=0\r\n"

"o=josua 0 0 IN IP4 %s\r\n"

"s=conversation\r\n"

"c=IN IP4 %s\r\n"

"t=0 0\r\n"

"m=audio %s RTP/AVP 0 8 101\r\n"

"a=rtpmap:0 PCMU/8000\r\n"

"a=rtpmap:8 PCMA/8000\r\n"

"a=rtpmap:101 telephone-event/8000\r\n"

"a=fmtp:101 0-11\r\n", localip, localip, "9900");

osip_message_set_body (invite, tmp, strlen(tmp));

osip_message_set_content_type (invite, "application/sdp");

eXosip_lock ();

i = eXosip_call_send_initial_invite (invite);

eXosip_unlock ();

掛斷或取消通話:

int ret;

ret = eXosip_call_terminate(call_id, dialog_id);

if(0 != ret)

{

AfxMessageBox("hangup/terminate Failed!");

}

  • 上一篇:關於用C#寫貪吃蛇的問題
  • 下一篇:OA考勤管理中的排班如何設置
  • copyright 2024編程學習大全網