4

让我先描述一下我的问题。我将 Sofia SIP 用于电话应用程序,并且我使用的 SIP 代理位于 NAT 后面。这意味着来自代理的传入邀请具有内部代理 IP(例如 10.0.0.1)作为联系人标头。这意味着当我从我的应用程序中挂断电话时,Sofia 会自动将 IP 10.0.0.1 设置为 BYE 消息的目的地,正如您可以想象的那样,它是不可路由的,因此它失败了。

所以我想要做的是将 BYE 消息的目的地更改为“外部”代理 IP 地址。问题是 Sofia 似乎不允许我更改 SIP 消息的目的地;它总是使用收到邀请时获得的联系方式。这是我尝试过的:

  1. 为 SIPTAG_TO 强制执行硬编码值:

    nua_bye(op->op_handle, SIPTAG_TO(sip_to_make(ssc->ssc_home, "sip:alice@54.15.123.11")), TAG_END());

结果是 To 标头已使用外部 ip 更新,但 SIP 消息仍发往内部代理 ip

  1. 将硬编码值强制为 NUTAG_URL:

    sip_to_t * to = sip_to_make(ssc->ssc_home, "sip:alice@54.15.123.11");

    ua_bye(op->op_handle, NUTAG_URL(to->a_url), TAG_END());

这没有效果。

  1. 为 SIPTAG_REQUEST_STR 强制执行硬编码值:

    nua_bye(op->op_handle, SIPTAG_REQUEST_STR("BYE sip:alice@54.15.123.11 SIP/2.0"), TAG_END());

这没有效果。

  1. 做了同样的事情,但通过事务句柄:

    nua_set_hparams(op->op_handle,SIPTAG_REQUEST_STR("BYE sip:alice@54.15.123.11 SIP/2.0"), TAG_NULL());

    nua_bye(op->op_handle, TAG_END());

又没效果

然后,当传入的 INVITE 从代理到达并且可能会更改联系人时,我想早一点去,因为这是发送后续 BYE 的地方,但再次没有运气:尝试通过 nua_set_hparams 更新它对全局没有效果带有 nua_set_params 的参数。

似乎我想做的事情非常简单(考虑到那里的 NAT 配置,这是必要的),但似乎索非亚明确禁止它(如果您查看 nua_bye 文档,则没有任何相关的 TAGS 文档记录)。

我还考虑过使用 Sofia 的一种较低级别的 API,例如 NTA(而不是 NUA),但似乎很难将 NUA 与任何较低级别的 API 混合使用。

任何想法都非常受欢迎

此致,

安东尼斯

4

1 回答 1

2

BYE 是一个对话框中的请求,因此它应该跟随 Route 标头(如果存在)。我只是对 Sofia 有点熟悉,但是如果您将 IP:port 添加到您身边的路由集,并在您发送未来的对话内请​​求时将其添加到 Route 标头列表中,Sofia 应该路由首先是 Route 标头,然后是 RURI(通常来自对方的 Contact)。

于 2015-08-01T18:03:12.370 回答