让我先描述一下我的问题。我将 Sofia SIP 用于电话应用程序,并且我使用的 SIP 代理位于 NAT 后面。这意味着来自代理的传入邀请具有内部代理 IP(例如 10.0.0.1)作为联系人标头。这意味着当我从我的应用程序中挂断电话时,Sofia 会自动将 IP 10.0.0.1 设置为 BYE 消息的目的地,正如您可以想象的那样,它是不可路由的,因此它失败了。
所以我想要做的是将 BYE 消息的目的地更改为“外部”代理 IP 地址。问题是 Sofia 似乎不允许我更改 SIP 消息的目的地;它总是使用收到邀请时获得的联系方式。这是我尝试过的:
为 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
将硬编码值强制为 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());
这没有效果。
为 SIPTAG_REQUEST_STR 强制执行硬编码值:
nua_bye(op->op_handle, SIPTAG_REQUEST_STR("BYE sip:alice@54.15.123.11 SIP/2.0"), TAG_END());
这没有效果。
做了同样的事情,但通过事务句柄:
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 混合使用。
任何想法都非常受欢迎
此致,
安东尼斯