0

我想知道任何人都可以向我指出一个关于如何构建 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 客户端上也收到“音频设备错误” .

有人有什么想法吗?

4

3 回答 3

2

问题可能非常简单:您似乎忘记了“a=sendrecv”之后的换行符。:-)

无论如何,这里有一个建议:出于测试目的,您最好使用工具而不是直接进入并编写协议的一部分。您可以为此目的使用sipp,它是测试 SIP 网络的绝佳工具。除此之外,您当然可以只嗅探两个工作 SIP 设备之间的网络流量,看看它与您的流量有何不同。

编辑:

我之前错过了这个:您应该省略a=fmtp:97 mode=20,因为会话描述这样无效:您只能对媒体行中提到的编解码器使用格式参数属性。编解码器通过有效载荷类型编号(0=PCMU,8=PCMA,18=G723,...)来识别。一些编解码器没有正式分配的编号,对于这些应该使用动态范围 96-127:用户代理可以通过rtpmap属性在此范围内自由分配编号。因此,除非您指定 97 所指的编解码器,否则其他用户代理无法知道格式参数应应用于哪个编解码器。

于 2010-02-15T17:56:33.037 回答
1

Paprika 是对的: a=fmtp:97 mode=20 完全是错误的(看起来它是 iLBC 编解码器产品的一部分)。您没有提供编解码器 97,而是提供了编解码器 0 (PCMU)。

请注意, a=fmtp:97 不应该伤害你,它只是虚假的。

最可能的问题是您不是 sip.ciceronetworks.com - 即您的 c= 行(和 m= 行)说“将我的媒体发送到 sip.ciceronetworks.com 的端口 6002”。我怀疑您的 PC 的 IP 地址与 sip.ciceronetworks.com 不同,和/或您和另一端之间有防火墙/NAT。

这可能不是您的问题,但是根据来自RFC 4566的规范, o= 行是错误的:

o=<username> <sess-id> <sess-version> <nettype> <addrtype> <unicast-address>

让 VoIP 发挥作用并不像 RFC 或说明书解释所暗示的那么简单......

于 2010-02-26T21:31:45.407 回答
1

我找到了一篇关于 SDP(会话描述协议)的好文章。它还与称为 Ozeki VoIP SIP SDK 的 SDK 相关。例如,如果您将这些东西结合起来,您将能够创建一个软电话。

还有一个关于 SDP 的简要概述。

在 VoIP SIP 呼叫中使用 SDP 对那些希望开发自己的软件电话或网络电话应用程序或您想要的应用程序的人来说是一个有趣的话题。

SDP 描述多媒体通信会话,用于会话公告、会话邀请和参数协商。

使用 SDK 可以减轻很多负担,因为它具有灵活性和高兼容性。

有关 SDP 与 SDK 连接以构建自己的应用程序的更多信息,如果您使用 Google 搜索,您可以查看上述文章:“在 VoIP SIP 呼叫中使用 SDP”

于 2012-04-17T06:42:05.920 回答