其主要流程為:
初始化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!");
}