如何在Sofia SIP中更改SIP BYE消息的目标

时间:2015-07-21 08:26:34

标签: sip sofia-sip

让我先描述一下我的问题。我使用Sofia SIP进行电话应用,而我使用的SIP代理则使用NAT。这意味着来自代理的传入邀请具有内部代理IP的Contact头(例如10.0.0.1)。这意味着当我从我的应用程序中挂断电话时,Sofia会自动将BYE消息的目的地设置为IP 10.0.0.1,您可以想象它是不可路由的,因此它会失败。

所以我想要做的是将BYE消息的目的地更改为' external'代理IP地址。问题是索菲亚似乎不允许我改变SIP消息的目的地;它总是使用收到INVITE时获得的联系。以下是我尝试过的内容:

  1. 为SIPTAG_TO执行硬编码值:

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

  2. 这样做的结果是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());

    2. 这没有效果。

      1. 为SIPTAG_REQUEST_STR执行硬编码值:

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

      2. 这没有效果。

        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());

        2. 再次没效果

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

          似乎我想要做的事情非常简单(并且考虑到那里的NAT配置是必要的)但是它好像索菲亚特别不允许它(如果你检查nua_bye文档那里没有任何东西)相关TAGS记录)。

          我还想过使用索菲亚的低级API之一,比如NTA(而不是NUA),但是将NUA与任何低级API混合起来似乎很难。

          任何想法都非常受欢迎

          致以最诚挚的问候,

          安东尼

1 个答案:

答案 0 :(得分:2)

BYE是一个对话内请求,因此它应该跟随Route头,如果它们存在的话。我只是模糊地熟悉索菲亚,但是如果您添加了IP:端口,INVITE实际上是从您旁边的路由集接收的,并在您发送未来的对话内请​​求时将其添加到路由标头列表中,Sofia应首先通过Route标头路由,然后是RURI(通常来自另一方的Contact)。