用yate2实现软VoIP语音通话(SIP协议)

用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台PC,Windows操作系统,接在同一个集线器上,并不是广域网或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,打开作下列修改: 
找到
;auth=100

;register=100

;route=100
三行,分别去掉前面的分号
对需要建立的每一个用户,在文件末尾增加两行:
[用户名]
password=密码 
例如建立用户sunny,密码为870212,则写成:
[sunny]
password=870212 
这样,yate2服务器就有了身份认证功能
将regexroute.conf.sample复制一份,改名为regexroute.conf,打开作下列修改: 
找到
[default]
,在后面增加一行
${username}^$=-;error=noauth
这样未登录的用户就不能拨打电话
对需要建立的每一个电话号码,在刚才插入处之后增加一行
^电话号码$=return;called=用户名
例如当有人拨打号码15900941215,就呼叫用户sunny,则写成:
^15900941215$=return;called=sunny
这样,yate2服务器就有了电话路由功能
开始-管理工具-服务,重新启动Yet Another Telephony Engine服务

如果服务成功启动、没有错误提示,你已经正确建立了最简单的yate2网络电话服务器。


通过yate2服务器打电话

再次提醒,不能在运行yate2服务器的计算机上打开yate2客户端软件,否则是无法正常运行的。


开始-Yate-Yate Client,启动yate2客户端
Accounts页-New,打开新建帐户对话框,填写各项目: 
Protocol=sip
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,打开新建帐户对话框,填写各项目: 
Protocol=sip
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协议、端口号为5060;SIP只提供控制信令,并不负责语音数据的编码和传输。


通过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:2@192.168.1.50 没有Authorization头,Call-ID:2126492930@192.168.1.50
 <= 100 Trying  
缺少认证<= 401 Unauthorized 包含WWW-Authenticate头
放弃呼叫=> ACK sip:2@192.168.1.50  
发起呼叫=> INVITE sip:2@192.168.1.50 From:<sip:u1@192.168.1.50>;tag=1542144666 ,包含Authorization头,Max-Forwards:20,Call-ID:2126492930@192.168.1.50
 <= 100 Trying  
转发呼叫 => INVITE sip:u2@192.168.1.50From:<sip:u1@192.168.1.50>;tag=831312670 ,没有Authorization头,Max-Forwards:19,Call-ID:495687575@192.168.1.50
  <= 100 Trying 
振铃 <= 180 Ringing 
转发振铃<= 180 Ringing  
接听 <= 200 OK 
确认 => ACK sip:u2@192.168.1.50From:<sip:u1@192.168.1.50>;tag=831312670
转发接听<= 200 OK  
确认=> ACK sip:2@192.168.1.50 From:<sip:u1@192.168.1.50>;tag=1542144666
上面的过程,建立了主叫方-服务器、服务器-被叫方的两个VoIP电话连接;主叫方不知道被叫方的用户名和IP地址,被叫方知道主叫方的用户名、但不知道IP地址
现在出现大量的双向RTP数据包,封装了语音数据(甚至可以解码并窃听语音内容);使用随机高端口(在SIP协议的INVITE、200两种报文中,用SDP协议声明了RTP使用的UDP端口、语音编码方式等),经过服务器转发
挂断=> BYE sip:2@192.168.1.50:5060 Reason:SIP;text="User hangup"
主叫方已经停止发送和接收RTP数据包,而被叫方的RTP包仍然不断经服务器转发到达,主叫方回应ICMP Port unreachable消息。
 <= 100 Trying  
 <= 401 Unauthorized  
挂断=> BYE sip:2@192.168.1.50:5060 这次带上Authorization头
 <= 100 Trying  
同意挂断<= 200 OK  
通知被叫挂断 => BYE sip:u2@192.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:u1@192.168.1.183:5060>
Expires:600
To:<sip:u1@192.168.1.50>
退出:
REGISTER sip:192.168.1.50
Contact:<sip:u1@192.168.1.183:5060>
Expires:0
To:<sip:u1@192.168.1.50>
两者的区别就是Expires,0表示退出,非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:anonymous@192.168.1.183 To:sip:0@192.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数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434613.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

避免頁面重復提交3/15

在用戶做資料錄入操作時時常會反映重復記錄出現,經過了解是針對新手或者性子急的用戶在儲存時多次點擊引起 有效處理方法:新增一textbox,對儲存按鈕的onclick增設js代碼:btnsave.Attributes.Add("onclick", "var tb15document.getElementById(Textbox15);var nu…

java 日志设计_Java日志设计实践(3) - 开发篇

1.选择恰当的日志级别2.输出明确的提示文字和充分的现场信息3.输出内容一行搞定&#xff0c;不要换行4.其他1.选择恰当的日志级别选择日志级别时需要遵循一些通用规范&#xff0c;不可随意定义log4j的日志级别&#xff0c;由低到高排列&#xff1a;all trace debug info warn e…

ConfigurationManager.AppSettings[] ConfigurationManager智能显示不出来

解决办法&#xff1a;在项目中添加System.Configuration引用。转载于:https://www.cnblogs.com/2008freestyle/archive/2012/03/15/2398046.html

java5的递归算法_java递归算法 java面试题(5)

Java语言是一种具有动态性的解释型语言&#xff0c;类(class)只有被加载到JVM后才能运行。当运行指定程序时&#xff0c;JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中&#xff0c;并组织成为一个完整的Java应用程序。这个加载过程是由类加载器完成&#xff0c…

OpenGL ES 2.0 for iPhone Tutorial

来源&#xff1a;http://www.raywenderlich.com/3664/opengl-es-2-0-for-iphone-tutorial If youre new here, you may want to subscribe to my RSS feed or follow me on Twitter. Thanks for visiting! Learn how to use OpenGL ES 2.0 from the ground up! OpenGL ES is th…

java种子填充_种子填充实例运行出问题

种子填充实例运行出问题import java.awt.*;import java.applet.*;import java.awt.image.ImageProducer;import java.awt.image.MemoryImageSource;import java.util.Stack;public class scanseed extends Applet {private static final long serialVersionUID 1L;int redColo…

Mdi悬浮子窗体不超过主窗体边界

//1.设置父窗体(主窗体)的AutoScrollMinSize大于父窗体的Size//例如主窗体(400,400), AutoScrollMinSize(500,500)//2.设置主窗体的IsMdiContainer为true private void Form2_Load(object sender, EventArgs e) {//悬浮窗体 Form3 f3 new Form3();//…

Ubuntu 12.04 root用户登录设置

Ubuntu 12.04默认是不允许root登录的&#xff0c;在登录窗口只能看到普通用户和访客登录。以普通身份登陆Ubuntu后我们需要做一些修改,普通用户登录后&#xff0c;修改系统配置文件需要切换到超级用户模式,在终端窗口里面输入: sudo -s.然后输入普通用户登陆的密码&#xff0c…

java codepointbefore_Java StringBuilder codePointBefore()方法与示例

StringBuilder类codePointBefore()方法codePointBefore()方法在java.lang包中可用。codePointBefore()方法用于表示给定索引和数组索引从0到length()-1开始的Unicode代码点。codePointBefore()方法是一种非静态方法&#xff0c;仅可通过类对象访问&#xff0c;如果尝试使用类名…

随机交换检验数据挖掘结果-assessing data mining result via swap randomization

转载自己的博客&#xff1a; http://blog.csdn.net/lgnlgn/article/details/5936945 数据挖掘中一个重要的研究议题是确定发现的模式或模型是否显著。虽然传统统计方法已经早已用以进行显著性检验&#xff0c;但是在数据挖掘领域这一方法却没有得到足够的重视。在本文中提出采…

sip中的100trying到底有啥用

SIP是一种类似HTTP的基于请求响应的协议。理想情况下&#xff0c;请求被发出后&#xff0c;应该无任何延迟的传回响应。但是这是理想情况&#xff0c;有些时候接收端收到请求后进行处理需要一定的延迟&#xff0c;这个延迟是不一定的&#xff0c;SIP中有一个超时机制&#xff0…

java幂等性原理_Java接口幂等性设计原理解析

在微服务架构下&#xff0c;我们在完成一个订单流程时经常遇到下面的场景&#xff1a;一个订单创建接口&#xff0c;第一次调用超时了&#xff0c;然后调用方重试了一次在订单创建时&#xff0c;我们需要去扣减库存&#xff0c;这时接口发生了超时&#xff0c;调用方重试了一次…

intent几种传值数组、对象、集合(Array,Object,List)

1.Array private ArrayList<String> checkListnew ArrayList<String>();Intent intentnew Intent(mytext.this,show.class);intent.putStringArrayListExtra("list", checkList);startActivity(intent);调用 Intent intentthis.getIntent();ArrayList&l…

.mod.c 是什么文件

我们可以为代码清单4.1的模板编写一个简单的Makefile&#xff1a; obj-m : hello.o 并使用如下命令编译Hello World模块&#xff1a; make -C /usr/src/linux-2.6.15.5/ M/driver_study/ modules 如果当前处于模块所在的目录&#xff0c;则以下命令与上述命令同等&#xff1a…

java web Jersey_使用CXF和Jersey框架来进行Java的WebService编程

CXFCXF是在xfire的基础上实现的。1)首先呢&#xff0c;还是包的问题&#xff0c;在http://cxf.apache.org/download.html这里可以下到最新版的CXF&#xff0c;当然&#xff0c;我用的是最新版的。接下来还是那句废话&#xff0c;建WEB项目&#xff0c;放入JAR包。而JAR包我们就…

Binding是WPF的核心,WPF的常用数据源绑定有四种

Binding是WPF的核心&#xff0c;WPF的数据源有以下几种&#xff1a; 1、ADO.NET中的DataTable 2、xml数据源 3、object数据源 4、元素控件属性 详细说明见链接&#xff1a;http://www.cnblogs.com/linlf03/archive/2011/09/06/2168440.html 转载于:https://www.cnblogs.com/jun…

对 Linux 新手非常有用的 20 个命令

你打算从Windows换到Linux上来&#xff0c;还是你刚好换到Linux上来&#xff1f;哎哟&#xff01;&#xff01;&#xff01;我说什么呢&#xff0c;是什么原因你就出现在我的世界里了。从我以往的经验来说&#xff0c;当我刚使用Linux&#xff0c;命令&#xff0c;终端啊什么的…

java float什么类型数据类型_Java中的Float和double数据类型

浮点数据类型是单精度32位IEEE 754浮点数,双数据类型是双精度64位IEEE 754浮点数.这是什么意思&#xff1f;什么时候应该使用float而不是double,反之亦然&#xff1f;解决方法:总结一下&#xff1a;> float以32位表示,带有1个符号位,8位指数和23位有效数字(或者从科学数字符…

S3C2440与SDRAM的地址连线分析

S3C2440有27根地址线ADDR[26:0]&#xff0c;8根片选信号ngcs0-ngcs7,对应bank0-bank7&#xff0c;当访问bankx的地址空间&#xff0c;ngcsx引脚为低电平&#xff0c;选中外设。 2^272^7 * 2^10 * 2^10 128Mbyte 8*128Mbyte 1Gbyte 所以S3C2440总的寻址空间是1Gbyte。 市面…

java方法有excel实现_Java实现EXCEL操作(1)

Java实现EXCEL操作(1)1、实现方法&#xff1a;现在有三种方法去实现&#xff1a;jxl 、poi 、 FastExcel&#xff1a;97~2003在这里只讲poi实现方法。poi的包可以去Apache官网上去下载&#xff1a;http://poi.apache.org/download.html2、poi实现【1】低版本的导入导出方法&…