让我先描述一下我的问题。我使用Sofia SIP进行电话应用,而我使用的SIP代理则使用NAT。这意味着来自代理的传入邀请具有内部代理IP的Contact头(例如10.0.0.1)。这意味着当我从我的应用程序中挂断电话时,Sofia会自动将BYE消息的目的地设置为IP 10.0.0.1,您可以想象它是不可路由的,因此它会失败。
所以我想要做的是将BYE消息的目的地更改为' external'代理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混合起来似乎很难。
任何想法都非常受欢迎
致以最诚挚的问候,
安东尼
答案 0 :(得分:2)
BYE是一个对话内请求,因此它应该跟随Route头,如果它们存在的话。我只是模糊地熟悉索菲亚,但是如果您添加了IP:端口,INVITE实际上是从您旁边的路由集接收的,并在您发送未来的对话内请求时将其添加到路由标头列表中,Sofia应首先通过Route标头路由,然后是RURI(通常来自另一方的Contact)。