[SOS]SIP软电话PC客户端,能打通手机但是双方都听不到声音。。。。。

sipPhone222 2010-03-03 09:31:31
使用PC客户端拨打普通手机,手机端可以震铃,
但是接通后双方都听不到声音;
PC客户端也听不到手机端的彩铃声音;
感觉把PC客户端和手机接通后,他们就可以正常通话;

PC客户端使用从网上下载的软件;
自己主要写软交换服务器,负责收发客户端的指令,
以及支持SIP协议的落地网关的指令;


大概处理流程如下:
架设PC客户端内网IP:192.168.1.1;
软交换服务器IP:1.1.1.1;
落地网关IP:2.2.2.2;
---------------
192.168.1.1--->1.1.1.1 发送Register请求
192.168.1.1<---1.1.1.1 回复未认证
192.168.1.1--->1.1.1.1 重新发送Register请求
192.168.1.1<---1.1.1.1 回复200 OK
---------------
192.168.1.1--->1.1.1.1 发送Invite请求
192.168.1.1<---1.1.1.1 回复100 Try
192.168.1.1<---1.1.1.1 回复183 Session
---------------
192.168.1.1--->2.2.2.2 转发Invite请求
1.1.1.1<---2.2.2.2 回复100 Try
192.168.1.1<---1.1.1.1 转发100 Try
1.1.1.1<---2.2.2.2 回复180 Ring
192.168.1.1<---1.1.1.1 转发180 Ring
---------------
1.1.1.1<---2.2.2.2 回复200 OK
1.1.1.1--->2.2.2.2 回复ACK
192.168.1.1<---1.1.1.1 转发200 OK
192.168.1.1--->1.1.1.1 回复ACK
---------------
是否需要解决NAT问题才能实现语音的传输?
是否不解决NAT问题就不能传输RTP语音包?
...全文
828 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
gewentang 2011-10-11
  • 打赏
  • 举报
回复
楼上解决了吗?
空无 2011-10-02
  • 打赏
  • 举报
回复
想问楼主,如何实现PC软电话拨打移动手机号码?大概怎么搭建这样的一个平台呢?谢谢~~
sipPhone222 2010-03-03
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20090331/11/71484294-8164-4ad8-baf7-5aaf3078d856.html



如果单纯的捕捉语音然后通过UDP进行传送,就可以用SOCKET就可以做到。用SIP进行简单文本通信,我在网上看到的一个例子,也能看明白,但是我不会通过SIP进行语音的传送。SIP服务器用的SERVLET,客户端继承自SipListener。
Java code */
public void sendMessage(String to, String message) throws ParseException,
InvalidArgumentException, SipException {

SipURI from = addressFactory.createSipURI(getUsername(), getHost()
+ ":" + getPort());
Address fromNameAddress = addressFactory.createAddress(from);
fromNameAddress.setDisplayName(getUsername());
FromHeader fromHeader = headerFactory.createFromHeader(fromNameAddress,
"textclientv1.0");

String username = to.substring(to.indexOf(":") + 1, to.indexOf("@"));
String address = to.substring(to.indexOf("@") + 1);

SipURI toAddress = addressFactory.createSipURI(username, address);
Address toNameAddress = addressFactory.createAddress(toAddress);
toNameAddress.setDisplayName(username);
ToHeader toHeader = headerFactory.createToHeader(toNameAddress, null);

SipURI requestURI = addressFactory.createSipURI(username, address);
requestURI.setTransportParam("udp");

ArrayList viaHeaders = new ArrayList();
ViaHeader viaHeader = headerFactory.createViaHeader(getHost(),
getPort(), "udp", null);
viaHeaders.add(viaHeader);

CallIdHeader callIdHeader = sipProvider.getNewCallId();

CSeqHeader cSeqHeader = headerFactory.createCSeqHeader(1,
Request.MESSAGE);

MaxForwardsHeader maxForwards = headerFactory
.createMaxForwardsHeader(70);

Request request = messageFactory.createRequest(requestURI,
Request.MESSAGE, callIdHeader, cSeqHeader, fromHeader,
toHeader, viaHeaders, maxForwards);

SipURI contactURI = addressFactory.createSipURI(getUsername(),
getHost());
contactURI.setPort(getPort());
Address contactAddress = addressFactory.createAddress(contactURI);
contactAddress.setDisplayName(getUsername());
ContactHeader contactHeader = headerFactory
.createContactHeader(contactAddress);
request.addHeader(contactHeader);

ContentTypeHeader contentTypeHeader = headerFactory
.createContentTypeHeader("text", "plain");
request.setContent(message, contentTypeHeader);

sipProvider.sendRequest(request);
}

这是发送文本的代码,如何发送语音块呢。还有SIP SERVLET端要做什么处理。谢谢谢谢!
sipPhone222 2010-03-03
  • 打赏
  • 举报
回复
(1)不处理穿越NAT的问题,能否收发语音包呢?

(2)语音包如何接收和转发啊?
sipPhone222 2010-03-03
  • 打赏
  • 举报
回复
(1)如果不解决NAT穿越问题,在服务器端添加转发语音包的功能,是否可以听到声音?

(2)解决NAT穿越问题,是不是用来绑定PC客户端的内网端口和公网端口的对应关系?

假设PC客户端内网IP:192.168.1.1; 对应公网IP:211.3.3.3;

rtp启动时,穿过NAT时端口会发生改变;
Via: SIP/2.0/UDP 192.168.1.1:PORT_01;
sniffer抓包工具中211.3.3.3对应的端口PORT_02;
SOCKADDR_IN(用来找客户端的地址和端口)中有个端口PORT_03;

解决NAT问题是主要把这三个端口给绑定在一起么?
感觉这三个端口一般不相同。。。
michaelnami 2010-03-03
  • 打赏
  • 举报
回复
光有逻辑转发有什么用 声音数据包不用转发吗
sipPhone222 2010-03-03
  • 打赏
  • 举报
回复
处理逻辑重新发一下:
假设PC客户端内网IP:192.168.1.1;
软交换服务器IP:1.1.1.1;
落地网关IP:2.2.2.2;
---------------
192.168.1.1--->1.1.1.1 发送Register请求
192.168.1.1<---1.1.1.1 回复未认证
192.168.1.1--->1.1.1.1 重新发送Register请求
192.168.1.1<---1.1.1.1 回复200 OK
---------------
192.168.1.1<---1.1.1.1 回复100 Try
192.168.1.1<---1.1.1.1 回复183 Session
//到这里正常情况下,PC客户端应该能听到手机的彩铃声音。。。。
---------------
//PC客户端拨打手机时,发送Invite请求
192.168.1.1--->1.1.1.1 发送Invite请求
192.168.1.1--->2.2.2.2 转发Invite请求
1.1.1.1<---2.2.2.2 回复100 Try
192.168.1.1<---1.1.1.1 转发100 Try
//手机端开始震铃
1.1.1.1<---2.2.2.2 回复180 Ring
192.168.1.1<---1.1.1.1 转发180 Ring
---------------
//被叫抓起电话
1.1.1.1<---2.2.2.2 回复200 OK
1.1.1.1--->2.2.2.2 回复ACK
192.168.1.1<---1.1.1.1 转发200 OK
192.168.1.1--->1.1.1.1 回复ACK
---------------
是否需要解决NAT问题才能实现语音的传输?
是否不解决NAT问题就不能传输RTP语音包?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧