2015-07-21 234 views
4

让我首先描述我的问题。我使用Sofia SIP作为电话应用程序,而我使用的SIP代理位于NAT后面。这意味着来自代理的传入邀请将内部代理IP(例如10.0.0.1)作为Contact标头。这意味着当我从应用程序中挂断电话时,Sofia会自动设置IP地址为10.0.0.1的IP地址,如您所想象的那样,IP地址不可路由,因此会失败。如何在Sofia SIP中更改SIP BYE消息的目的地

所以我想要做的是将BYE消息的目的地更改为'外部'代理IP地址。问题是索非亚似乎不允许我改变SIP消息的目的地;它总是使用它在接收INVITE时获得的联系人。以下是我已经试过:

  1. 强制施行SIPTAG_TO硬编码的值:

    nua_bye(OP-> op_handle, SIPTAG_TO(sip_to_make(ssc-> ssc_home,“SIP:[email protected] “)), TAG_END());

这样做的结果是,To头用外部IP但SIP消息更新仍在注定到内部代理IP

  • 强制AA硬编码值为NUTAG_URL:

    sip_to_t * to = sip_to_make(ssc-> ssc_home,“sip:[email protected]”); (op-> op_handle, NUTAG_URL(to> a_url), TAG_END());

  • 这没有效果。

  • 强制硬编码值SIPTAG_REQUEST_STR:

    nua_bye(OP-> op_handle, SIPTAG_REQUEST_STR( “BYE SIP:[email protected] SIP/2.0”), TAG_END());

  • 这是没有效果的。

  • 没有相同的,但通过事务句柄:

    nua_set_hparams(OP-> op_handle,SIPTAG_REQUEST_STR( “BYE SIP:[email protected] SIP/2.0”) ,TAG_NULL());

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

  • 同样没有效果

    后来我想过要去早一点当传入的邀请代理赶到,也许改变的接触,因为这是随后的BYE被发送,但同样没有运气:试图通过nua_set_hparams更新它对nua_set_params的全局参数没有影响。

    似乎我想要做的事非常简单(并且必要时考虑到NAT配置),但它似乎是索非亚明确禁止它(如果您检查nua_bye文档没有任何相关的TAGS文档)。

    我也想过使用Sofia的低级API之一,如NTA(而不是NUA),但将NUA与任何低级API混合似乎很难。

    任何想法非常欢迎

    最好的问候更多,

    安东尼

    回答

    2

    轮空是在对话中的请求,所以它应该遵循的Route头,如果它们存在。我只是模糊地熟悉索非亚,但如果你添加了IP:端口,那么INVITE实际上是从你身边的路由集接收到的,并且当你发送将来的对话请求时将它添加到路由头的列表中,索非亚应该路由首先通过Route头部,然后是RURI(通常从另一侧的联系人派生)。

    +0

    非常感谢答案;现在我找到了一种解决方法,通过将出站代理传递给索非亚的nua_create。一旦我获得了一些空闲时间,我也会尝试测试这个,并且让它知道它是否工作 – atsakiridis