sip呼叫信令过程
invite发出会话请求,100临时回应通知对方我已经收到请求,180表示我正在处理左边的话机响铃,182表示正在排队处理请求(这个场景我没有见过),200就是完成能力协商相应invite请求,ACK表示已经接收到对端的能力打开通道发送码流,bye就是结束通话了,200是对bye的回应。
毕业设计 SIP协议的实现我们先进行一个简单的纯SIP信令(不带语音连接建立)的UAC的SIP终端的程序开发的试验(即一个只能作为主叫不能作为被叫的的SIP软电话模型),我们创建一个MFC应用程序,对话框模式,照上面的说明,设置工程包含我们上面得到的oSIP的相关开发库及SDK的一些开发库,并且由于默认LIBC的冲突,需要排除MSVCRT[D]开发库(其中D代表Debug模式下,没有D表示Release模式下),直接使用eXosip的几个主要函数就可以创建一个基本的SIP软电话模型。
其主要流程为:
初始化eXosip库-启动事件监听线程-向SIP Proxy注册-向某SIP终端(电话号码)发起呼叫-建立连接-结束连接
初始化代码:
ret = 0;
= eXosip_init ();
eXosip_set_user_agent("##YouToo0.1");
!= ret)
{
AfxMessageBox("Couldn't initialize eXosip!\n");
return false;
}
= eXosip_listen_addr (IPPROTO_UDP, NULL, 0, AF_INET, 0);
!= ret)
{
eXosip_quit ();
AfxMessageBox("Couldn't initialize transport layer!\n");
return false;
}
启动事件监听线程:
AfxBeginThread(sip_uac,(void *)this);
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; /* 呼叫发起消息体 */
i = eXosip_call_build_initial_invite (&invite, dest_call, source_call, NULL, "## YouToo test demo!");
(i != 0)
{
AfxMessageBox("Intial INVITE failed!\n");
}
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"
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 ();
eXosip_call_send_initial_invite (invite);
eXosip_unlock ();
挂断或取消通话:
ret;
= eXosip_call_terminate(call_id, dialog_id);
!= ret)
{
AfxMessageBox("hangup/terminate Failed!");
}
求大神讲解SIP协议的直接呼叫流程示意图,尤其是被叫方的五次响应(100,180,182...)分别代表什么以下是SIP协议中文版内容,应该对你有帮助,在百度文库中有相关文件,可以自行查找:
(尝试)
尝试响应(100)表明下一跳服务器已经收到该请求,但是对这次呼叫的并未进行具体的处理。
其他临时响应一样,该响应使UAC 停止重发INVITE 请求。与其他的临时性响应不同,该相应不能使用
有状态服务器前转。
(振铃)
收到INVITE 请求之后用该响应通知用户,该响应也可以在发起一个本地回铃。
(呼叫正在转发)
服务器可以使用该状态码表示该呼叫正被前转到另外一组终点。
(排队)
如果被叫方正忙,服务器可以将本次呼叫放于队列中等待而非拒绝它。当被叫空闲时,将返回适当
的最终响应。该响应中可包含一个关于呼叫状态的原因短语。服务器可以向主叫发出多个182 响应来
更新呼叫等待的状态。
(会话进行)
该响应用来传递关于呼叫进程的信息。其中包括原因短语、头字段、消息体来描述呼叫进程更详细
1 200 (成功)
该响应表示请求成功。与响应一起返回的信息取决于请求中使用的方法。
添加微信尽享优惠
15630121999