1

我正在尝试为 android 构建 pjsip VoIP 应用程序。这是针对帐户配置中使用的属性给出的以下描述。

/**
     * This option is used to update the transport address and the Contact
     * header of REGISTER request. When this option is  enabled, the library 
     * will keep track of the public IP address from the response of REGISTER
     * request. Once it detects that the address has changed, it will 
     * unregister current Contact, update the Contact with transport address
     * learned from Via header, and register a new Contact to the registrar.
     * This will also update the public name of UDP transport if STUN is
     * configured. 
     *
     * See also contact_rewrite_method field.
     *
     * Default: 1 (yes)
     */
    pj_bool_t allow_contact_rewrite;


到目前为止,通过地址仅由 pjsip 更改。这个属性究竟是如何工作的?我看不出有什么区别??

4

1 回答 1

1

此选项仅在 pjsip 客户端位于某种NAT之后才生效。

即 [pjsip 客户端 / 例如 10.0.100] -> [NAT / 例如 1.2.3.4] -> [SIP 服务器 / 例如 2.3.4.5]

当 PJSIP 使用“联系人”地址 10.0.100:5060 向 sip 服务器注册时,SIP 服务器将返回一个响应,说明它来自 1.2.3.4:(因为 NAT)。

这是 allow_contact_rewrite 启动并取消注册并使用 1.2.3.4: 联系地址重新注册的时候。

这样做的原因是,如果 sip 代理服务器需要联系/发送请求到 SIP UAS,它会使用联系标头地址。

此功能“假设”许多 NAT 支持打孔以保持联系地址在一段时间内有效。

另一种选择是设置 STUN,以便 PJSIP 可以提前找出此信息,以便它在注册之前“知道”外部 IP 地址(尽管有对称 NAT 可以使 STUN 无用)。

所有这些选项都是为了尝试进行设置,以便当“事件”发生(例如电话呼叫)时,可以通过互联网从 SIP 代理服务器与 pjsip 客户端联系客户端。

就我个人而言,我发现这些设置都无法获得可通过 SIP Porxy 服务器连接的联系地址。

来自我使用的 Internet 客户端的最佳设置是始终仅使用 TCP(无 UDP)。在 pjsip 中启用 rport 和 TCP keep-alive。只要 sip 服务器尊重 rport 并且 tcp/ip 连接保持活动状态,那么一切正常(即 sip 代理可以通过现有打开的 TCP 套接字发送请求)。

这只是留下了两个端点之间的媒体连接问题,您必须依靠 ICE/STUN/TURN/NAT 打孔来实现这一点。

于 2018-01-24T17:53:58.677 回答