我想知道是否有人能指出我如何构建SDP消息的好教程。
我已经阅读了基础知识,可以构建和理解参数,但我似乎无法让它工作。
我要么在这里得到一个不可接受的答复,要么根本没有回复,这是在我获得100次尝试和180次回铃之后。
所以我的SIP工作,但它不喜欢SDP数据。
目前的构造如下:
String sdpData = "v=0\r\n"
+ "o=- 019078020 0"
+ " IN IP4 sip.ciceronetworks.com\r\n" + "s=MySession\r\n"
+ "c=IN IP4 sip.ciceronetworks.com\r\n"
+ "t=0 0\r\n" + "m=audio 6002 RTP/AVP 0\r\n"
+ "a=sendrecv\r\n" + "a=rtpmap:0 PCMU/8000\r\n" + "a=ptime:20\r\n"+ "a=fmtp:97 mode=20\r\n";
byte[] contents = sdpData.getBytes();
request.setContent(contents, contentTypeHeader);
虽然我喜欢100次尝试然后180次响铃但是当我接受另一端的呼叫时我什么都没有回来,它似乎只是崩溃,我也在PC客户端上得到“音频设备错误”我试着打电话。
任何想法?
答案 0 :(得分:2)
问题可能非常简单:您似乎忘记了“a = sendrecv”之后的换行符。 : - )
无论如何,这是一个建议: 出于测试目的,您可能最好使用工具而不是直接跳入并编写协议的一部分。您可以使用sipp来实现此目的,它是测试SIP网络的绝佳工具。除此之外,您当然可以嗅探两个正在运行的SIP设备之间的网络流量,看看它与您的流量有何不同。
编辑:
之前我错过了这个:
您应省略a=fmtp:97 mode=20
,因为会话描述无效:您只能对媒体行中提到的编解码器使用format参数属性。通过有效载荷类型编号识别编解码器(0 = PCMU,8 = PCMA,18 = G723,......)。某些编解码器没有正式分配的编号,因此应使用动态范围96-127:用户代理可以通过rtpmap
属性自由分配此范围内的编号。因此,除非您指定97表示哪个编解码器,否则其他用户代理无法知道应该将格式参数应用于哪个编解码器。
答案 1 :(得分:1)
Paprika是对的:a = fmtp:97模式= 20是完全错误的(看起来它是iLBC编解码器提供的一部分)。您没有提供编解码器97,您提供了编解码器0(PCMU)。
请注意,a = fmtp:97不应该伤害你,这只是假的。
最可能的问题是你不是sip.ciceronetworks.com - 即你的c = line(和m = line)说“将我的媒体发送到sip.ciceronetworks.com上的端口6002”。我怀疑你的PC的IP地址与sip.ciceronetworks.com不同,和/或你和另一端之间有防火墙/ NAT。
这可能不是你的问题,但根据规范o = line是错误的 来自RFC 4566:
o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>
让VoIP工作并不像RFC或手册解释所暗示的那么简单......
答案 2 :(得分:1)
我发现了一篇处理SDP(会话描述协议)的好文章。它还与称为Ozeki VoIP SIP SDK的SDK有关。如果你结合这些东西,你就可以创建一个软电话。
还有一个关于SDP的简要总结。
在VoIP SIP呼叫中使用SDP对于那些希望开发自己的软电话或网络电话应用程序或您想要的人来说是一个有趣的话题。
SDP描述了用于会话通知,会话邀请和参数协商的多媒体通信会话。
使用SDK可以承担很大的负担,从一个人的角度来看,灵活性和高兼容性得到保证。
有关与SDK相关的SDP以构建自己的应用程序的更多信息,如果您使用Google,可以查看上述文章:“在VoIP SIP呼叫中使用SDP”