1

我在启动媒体会话并将其与我的 SIP 客户端结合时遇到问题。我设计了一个递归 SIP 客户端,它根据 RFC 中记录的可接受序列和我阅读的示例,重用相同的请求模板将下一个请求发送到服务器。据我所知,SIP 部分工作正常,可以很好地注册服务器邀请并进行身份验证。我还没有完成对客户端的任何调用,因为需要填充内容标头(我还没有,所以我从服务器得到一个 503,我猜这没问题)。

很长一段时间我不知道从哪里开始媒体会话,慢慢学会了如何使用JMF,我已经构建了一个处理RTP传输的对象,现在我站在十字路口,在一个一方面我有我的 SIP 信令,但它需要 SDP 内容标头来完成邀请,另一方面我有知道如何 p2p 的 RTP。

为了完成我的设计,我需要您帮助解决以下问题:

  1. 是否有一种简单的//一种简单的//一种将音频/视频格式从 JMF 转换为 SDP 媒体标头的实施方法?甚至是一个生成器,我可以输入内容头的所有参数,它会快速生成一个内容头,还是我必须自己实现这个?

  2. 一旦我完成了 SDK 的构建并且 SIP 启动并运行并且我从服务器获得了 OK 响应(在响铃之后),我如何启动媒体会话?如何根据我在 SIP 邀请中发送的呼叫者详细信息连接 p2p?

  3. 如果 2 是正确的,那么如何连接到陆线?陆线是否知道一旦他们将 OK 发送回服务器,他们会在特定端口上侦听/启动 RTP 会话?

还是我把一切都弄错了?:-/

我真的很感谢我能得到的任何帮助,我到处寻找答案,但他们并不清楚,他们忽略了问题 2,就好像这是一件显而易见的事情,但对我来说,事实并非如此。

在此先感谢亚当·泽哈维。

添加:

首先感谢您的回复以及您花时间帮助我。

我会回到问题2:

一旦您收到 Ok 响应,您就会知道 SIP 用户代理服务器 (UAS) 正在侦听的 IP 套接字(您的意思是 ADDRESS:PORT 正确吗?)以及它接受并可以开始发送您的 RTP 的编解码器。

好吧,我明白了,我想知道另一件事,在我向 UAS 发送 RTP 数据包的这段对话期间,UAS 用作两个 UAC 之间的桥梁。

现在...我可以使用 SIP 实例化会话,然后将客户端信息从一台计算机发送到另一台计算机,并在两台计算机之间建立 P2P,无需任何中间人(UAS),然后处理 SIP 会话吗?

我希望我现在能更好地解释我自己...

谢谢,亚当。

4

1 回答 1

4

对于1,我对JMF一无所知,因此无法直接回答,但SDP实际上并不是一个复杂的标准,不像SIP那样,所以构造一个SDP数据包应该不那么困难。构建 SDP 数据包所需的最低限度是您提供的编解码器和您接受 RTP 的 IP 套接字。

对于 2,一旦您收到 Ok 响应,您将知道 SIP 用户代理服务器 (UAS) 正在侦听的 IP 套接字以及它接受的编解码器并可以开始发送您的 RTP。同时,您应该开始从 UAS 接收 RTP,因为它会在发送 Ok 的同时开始发送。当然,您还需要发送一个 SIP ACK 请求以响应 Ok 响应,否则某些 UAS 将假定响应没有通过,并且在一段时间后将终止呼叫。如果您刚刚开始编写自己的 SIP 堆栈,那么还有很长的路要走!

对于 3,是的,虽然固定电话实际上是指 SIP 到 PSTN 网关(PSTN 端将类似于 ISDN、SSL 或模拟)。PSTN 网关的 SIP 端与任何其他 SIP UAS 相同,一旦它接受 INVITE 请求,它将开始发送 RTP tp 请求中指定的套接字,同样将开始在它放置在 Ok 中的套接字上侦听 RTP将发送回您的 SIP 客户端的响应。

更新

现在...我可以使用 SIP 实例化会话,然后将客户端信息从一台计算机发送到另一台计算机,并在两台计算机之间建立 P2P,无需任何中间人(UAS),然后处理 SIP 会话吗?

答案是肯定的,但您有点混淆了术语。已建立的 SIP 呼叫称为会话,并且始终位于用户代理客户端 (UAC) 和用户代理服务器 (UAS) 之间。每个 SIP 代理都应该能够充当 UAC 或 UAS 的角色,这两个角色之间的主要区别在于 UAC 发起呼叫而 UAS 应答它。一个特定的 SIP 设备对于它发起的呼叫将扮演 UAC 角色,对于它应答的呼叫将扮演 UAS 角色。

为什么这个 UAC 和 UAS 描述相关?因为所有 SIP 通信都是点对点的。SIP 不是客户端/服务器协议。这是一个点对点协议。现在它确实变得令人困惑,因为您将拥有运行 SIP 代理服务器或 SIP PSTN网关的 VoIP 提供商,这使得 SIP 看起来好像确实在客户端-服务器模型上运行,但事实并非如此。

所以我认为你真正想问的问题是 UAC-to-B2BUA-to-UAS 之间的 SIP 呼叫(实际上是两个单独的呼叫或 SIP 会话:UAC-to-UAS/UAC-to-UAS)让媒体绕过 B2BUA,而是直接在 UAC 和 UAS 之间传输。这个问题的答案是肯定的。像 Asterisk 这样的 B2BUA 有一个名为 canreinvite 的 SIP 配置选项,如果设置为 yes,它将导致它在应答后向呼叫的任一端发送 re-INVITE,以使 RTP 直接在呼叫端点之间流动,而不是通过自身桥接,当然如果需要编解码器转码、录制或等效功能,它不会尝试重新邀请。一种不同的方法是传统的 SIP 代理方法,例如 OpenSER 使用的方法 s 根本不是为桥接媒体而设计的,通过它的所有呼叫将始终导致 RTP 直接位于呼叫两端的 SIP 设备之间。工作方式是 OpenSER 将简单地将它从 UAC 接收到的请求转发到 UAS,除了添加和/或修改额外的一两个 SIP 标头之外,INVITE 请求就像 UAC 直接将其发送到 UAS .

都清如泥?这里有一些可以帮助您的进一步阅读的链接。

技术邀请- 非常好的 SIP 场景示例,

RFC5359 会话发起协议服务示例- 更多示例,

SIP Sorcery 论坛- 我运行的公共服务的论坛站点,如果您应该有更深入的 SIP 问题,一些熟悉 SIP 事务的人会经常光顾。

于 2010-05-27T00:52:34.507 回答