我正在尝试为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.how改变这个属性是否正常工作?我能看到没有区别吗?
答案 0 :(得分:1)
此选项仅在pjsip客户端位于某种NAT之后启动。
即。 [pjsip客户端/例如10.0.100] - > [NAT /例如1.2.3.4] - > [SIP服务器/例如2.3.4.5]
当PJSIP向sip服务器注册“联系”地址10.0.100:5060时,SIP服务器将发回一个回复,说明它来自1.2.3.4 :(因为NAT)。
这是allow_contact_rewrite启动并取消注册注册并将其重新注册到1.2.3.4:联系地址的时候。
为什么这样做是为了如果sip代理服务器需要联系/发送请求到SIP UAS,它使用联系头标题地址。
此功能“假设”许多NAT支持hole punching以保持联系地址在一段时间内有效。
另一种选择是设置STUN,以便PJSIP可以提前找出这些信息,以便在注册之前“知道”外部IP地址(尽管有对称的NAT可以使STUN无用)。
所有这些选项都是尝试进行设置,以便在发生“事件”(例如电话)时,可以通过互联网从SIP代理服务器联系客户端到pjsip客户端。
我个人没有发现这些设置都没有获得SIP Porxy服务器可以连接的联系地址。
来自我使用的互联网客户端的最佳设置是始终仅使用TCP(无UDP)。在pjsip中启用rport和TCP keep-alive。只要sip服务器尊重rport并且tcp / ip连接保持活动状态,那么一切正常(即sip代理可以向现有开放TCP套接字发送请求)。
这就留下了两个端点之间的媒体连接问题,你必须依靠ICE / STUN / TURN / NAT打孔才能实现这一点。