让我先描述一下我的问题.我正在使用Sofia SIP作为电话应用程序,而我正在使用的SIP代理正在使用NAT.这意味着来自代理的传入邀请具有内部代理IP的Contact头(例如10.0.0.1).这意味着当我从我的应用程序中挂断电话时,Sofia会自动将BYE消息的目的地设置为IP 10.0.0.1,您可以想象它是不可路由的,因此它会失败.
所以我想要做的是将BYE消息的目的地更改为“外部”代理IP地址.问题是索菲亚似乎不允许我更改SIP消息的目的地;它总是使用收到INVITE时获得的联系.这是我尝试过的:
>为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).
我还想过使用索菲亚的低级API之一,比如NTA(而不是NUA),但是将NUA与任何低级API混合起来似乎很难.
任何想法都非常受欢迎
最好的祝福,
安东尼
最佳答案 BYE是一个对话内请求,因此它应该跟随Route头,如果它们存在的话.我只是模糊地熟悉Sofia,但是如果你添加了IP:端口,INVITE实际上是从你身边的路由集接收的,并在你发送未来的对话内请求时将它添加到Route头列表中,Sofia应该路由首先是Route头,然后是RURI(通常来自另一方的Contact).