sip呼叫信令过程

来源:转载互联网 时间:2023-09-05 22:00:00

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

添加微信
版权声明:此文版权归原作者所有,若有来源错误或者侵犯您的合法权益,您可Email:report_xhlks@foxmail.com与我们取得联系,我们将及时进行处理。

分类栏目

微信号复制成功

打开微信,点击右上角"+"号,添加朋友,粘贴微信号,搜索即可!