西安单位网站建设,个人公司网页如何设计,高端医疗网站模板免费下载,服务好质量好的app开发用yate2实现软VoIP语音通话(SIP协议)
阳光男孩 发表于 2009-01-08
2009年1月7日#xff0c;工业与信息化部发放了三张3G牌照#xff0c;标志着中国进入了通信技术的新时代。3G的重要特性之一是高速数据链路#xff0c;移动上网速度大大提高。同时#xff0c;中国移动也大…用yate2实现软VoIP语音通话(SIP协议)
阳光男孩 发表于 2009-01-08
2009年1月7日工业与信息化部发放了三张3G牌照标志着中国进入了通信技术的新时代。3G的重要特性之一是高速数据链路移动上网速度大大提高。同时中国移动也大幅下调了2G网络GPRS上网的资费。可是语音通话费用仍然按兵不动。作为永远处于弱势的用户我们却可以通过VoIP网络电话自己实现免费语音通话。
网络电话是下一代网络(NGN)的重要应用之一。“下一代网络”是指10年以后的网络全部基于软交换(Softswitch)技术。但是拨打VoIP免费网络电话并不需要在等待10年。基于现有的TCP/IP网络我们已经可以使用开源的VoIP软件实现PC-to-PC的免费语音通话。注这里的“免费”是指不需要支付传统语音通话费用ADSL/FTTB/3G等上网接入仍然是需要费用的
下面我将介绍如何用yate2软件搭建VoIP服务器并用SIP协议完成语音通话。在我的实例中使用了局域网内的3台PCWindows操作系统接在同一个集线器上并不是广域网或3G接入。 yate2建立VoIP服务器
Yate Yet Another Telephony Engine是一款开源的VoIP网络电话软件。它可以作为服务器、也可以作为客户端使用。yate2可以在Linux下运行、也可以在Windows下运行。yate2下载地址 VoIP服务器可以干什么 客户端使用各自的用户名和密码登录到服务器上 用户通过“电话号码”拨叫另一用户 服务器负责转发拨叫请求及此后的其他控制信令 服务器可以转发话音数据包
建立服务器这一步不是必须的。yate2支持两个客户端通过IP地址直接连接而不需要建立服务器。如果你需要支持较多的用户能够互相通话通常要建立服务器如果只有2个用户则可以采用直连方式。 建立VoIP服务器的前提条件 一台计算机作为服务器 服务器通常需要拥有固定的公网IP地址 服务器上不能再运行客户端也就是说客户端、服务器不能同时启动否则会冲突 用yate2搭建VoIP服务器的步骤 下载并安装yate2最好完全安装所有组件仅30MB 打开yate2安装目录的conf.d子目录 将regfile.conf.sample复制一份改名为regfile.conf打开作下列修改 找到 ;auth100 、 ;register100 、 ;route100 三行分别去掉前面的分号 对需要建立的每一个用户在文件末尾增加两行 [用户名] password密码 例如建立用户sunny密码为870212则写成 [sunny] password870212 这样yate2服务器就有了身份认证功能 将regexroute.conf.sample复制一份改名为regexroute.conf打开作下列修改 找到 [default] 在后面增加一行 ${username}^$-;errornoauth 这样未登录的用户就不能拨打电话 对需要建立的每一个电话号码在刚才插入处之后增加一行 ^电话号码$return;called用户名 例如当有人拨打号码15900941215就呼叫用户sunny则写成 ^15900941215$return;calledsunny 这样yate2服务器就有了电话路由功能 开始-管理工具-服务重新启动Yet Another Telephony Engine服务
如果服务成功启动、没有错误提示你已经正确建立了最简单的yate2网络电话服务器。 通过yate2服务器打电话
再次提醒不能在运行yate2服务器的计算机上打开yate2客户端软件否则是无法正常运行的。 开始-Yate-Yate Client启动yate2客户端 Accounts页-New打开新建帐户对话框填写各项目 Protocolsip Use provider不要选择 Account可以随意输入 Username用户名后面留空 Password密码 Server服务器的IP地址 点击OK后Status应该会显示“Registered” Calls页Account前面填写的account名称然后输入另一个用户的电话号码点击Call就可以打电话了 如果有电话打进来选中它并点击Take the call就可以接听 点击Hangup挂断 yate2直连打电话
如果只有2个用户需要相互通话就不必劳神建立VoIP服务器了(何况服务器还要占据一台计算机)。yate2支持直连通话配置方法如下 被叫用户只需开启Yate Client当然要在防火墙中允许它不需要配置 主叫用户Accounts页-New打开新建帐户对话框填写各项目 Protocolsip Use provider不要选择 Account可以随意输入 Username留空 Password留空 Server被叫用户的IP地址 点击OK后Status并不会显示“Registered”但是这没有关系 主叫用户Calls页Account前面填写的account名称然后随便输入一个号码点击Call就可以打电话了 被叫用户选中打进来的电话并点击Take the call就可以接听 点击Hangup挂断 SIP协议
yate2支持SIP、H.323、jabber、iax等多种VoIP协议而先前我选择的是SIP协议。SIP协议定义了一组VoIP网络电话信令传输层基于UDP协议、端口号为5060SIP只提供控制信令并不负责语音数据的编码和传输。 通过yate2服务器通话SIP协议分析
我用Wireshark抓包分析了一次通话过程。这次通话的情况如下 服务器192.168.1.50 主叫方192.168.1.183用户名u1电话号码1 被叫方192.168.1.101用户名u2电话号码2 通话过程主叫方拨打号码2被叫接听稍后由主叫挂断
说明主叫方192.168.1.183 服务器192.168.1.50服务器192.168.1.50 被叫方192.168.1.101其他头部信息发起呼叫 INVITE sip:2192.168.1.50 没有Authorization头Call-ID:2126492930192.168.1.50 100 Trying 缺少认证 401 Unauthorized 包含WWW-Authenticate头放弃呼叫 ACK sip:2192.168.1.50 发起呼叫 INVITE sip:2192.168.1.50 From:sip:u1192.168.1.50;tag1542144666 包含Authorization头Max-Forwards:20Call-ID:2126492930192.168.1.50 100 Trying 转发呼叫 INVITE sip:u2192.168.1.50From:sip:u1192.168.1.50;tag831312670 没有Authorization头Max-Forwards:19Call-ID:495687575192.168.1.50 100 Trying 振铃 180 Ringing 转发振铃 180 Ringing 接听 200 OK 确认 ACK sip:u2192.168.1.50From:sip:u1192.168.1.50;tag831312670转发接听 200 OK 确认 ACK sip:2192.168.1.50 From:sip:u1192.168.1.50;tag1542144666上面的过程建立了主叫方-服务器、服务器-被叫方的两个VoIP电话连接主叫方不知道被叫方的用户名和IP地址被叫方知道主叫方的用户名、但不知道IP地址现在出现大量的双向RTP数据包封装了语音数据甚至可以解码并窃听语音内容使用随机高端口在SIP协议的INVITE、200两种报文中用SDP协议声明了RTP使用的UDP端口、语音编码方式等经过服务器转发挂断 BYE sip:2192.168.1.50:5060 Reason:SIP;textUser hangup主叫方已经停止发送和接收RTP数据包而被叫方的RTP包仍然不断经服务器转发到达主叫方回应ICMP Port unreachable消息。 100 Trying 401 Unauthorized 挂断 BYE sip:2192.168.1.50:5060 这次带上Authorization头 100 Trying 同意挂断 200 OK 通知被叫挂断 BYE sip:u2192.168.1.101:5060 服务器也停止接收RTP数据包而被叫方的RTP包仍然不断到达服务器回应ICMP Port unreachable消息。 100 Trying 同意挂断 200 OK 登录(Register)与退出(Unregister)假设有人拨打电话号码1。根据regexroute.conf服务器知道号码1对应于用户u1。那么服务器怎么知道u1的IP地址呢这就需要通过接收登录与退出消息来记录用户状态。 登录 REGISTER sip:192.168.1.50 Contact:sip:u1192.168.1.183:5060 Expires:600 To:sip:u1192.168.1.50 退出 REGISTER sip:192.168.1.50 Contact:sip:u1192.168.1.183:5060 Expires:0 To:sip:u1192.168.1.50 两者的区别就是Expires0表示退出非0表示登录 如果缺少身份认证服务器会返回401通过身份认证后服务器返回200 yate2直连通话SIP协议分析
直接贴出Wireshark的自动分析结果吧Statistics-VoIP Calls-Graph就可以看到
|Time | 192.168.1.101 | 192.168.1.183 | |3.985 | INVITE SDP |SIP From: sip:anonymous192.168.1.183 To:sip:0192.168.1.183 | |(5060) ------------------ (5060) | |4.004 | 100 Trying| |SIP Status | |(5060) ------------------ (5060) | |4.035 | 180 Ringing |SIP Status | |(5060) ------------------ (5060) | |11.818 | 200 OK SDP |SIP Status | |(5060) ------------------ (5060) | |11.826 | ACK | |SIP Request | |(5060) ------------------ (5060) | |11.857 | RTP (g711U) |RTP Num packets:281 Duration:5.597s SSRC:0x1726C94E | |(27392) ------------------ (27824) | |11.954 | RTP (g711U) |RTP Num packets:280 Duration:5.550s SSRC:0x7805579C | |(27392) ------------------ (27824) | |17.495 | BYE | |SIP Request | |(5060) ------------------ (5060) | |17.514 | 100 Trying| |SIP Status | |(5060) ------------------ (5060) | |17.526 | 200 OK | |SIP Status | |(5060) ------------------ (5060) |
与经过服务器的通话相比直连通话就显得非常简单了没有身份认证过程不需要转发信令与RTP数据