【问题标题】:PJSIP VOIP call not connected using SIP2SIP.info serverPJSIP VOIP 呼叫未使用 SIP2SIP.info 服务器连接
【发布时间】:2014-03-01 06:25:26
【问题描述】:

我正在使用 PJSIP 进行语音通话。当我使用我们的服务器时,一切都很好,即通话连接,通信。但是当我使用 SIP2SIP.INFO 服务器时。注册成功,但通话未接通。我在 SIP2SIP.info 中看到了没有呼出或呼入的日志。 所以呼叫不是发起的。

    char cfg_reg_uri[] = "sip:sip2sip.info";
    char cfg_cred_realm[] = "sip2sip.info";
    char cfg_cred_scheme[]="digest";

    pjsua_acc_config cfg;
    pjsua_acc_config_default(&cfg);
    cfg.id = pj_str(cfg_id);
    cfg.reg_uri = pj_str(cfg_reg_uri);
    cfg.cred_count = 1;
    cfg.cred_info[0].realm = pj_str(cfg_cred_realm);
    cfg.cred_info[0].scheme = pj_str(cfg_cred_scheme);
    cfg.cred_info[0].username = pj_str(cfg_cred_username);
    cfg.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
    cfg.cred_info[0].data = pj_str(cfg_cred_password);
    status = pjsua_acc_add(&cfg, PJ_TRUE, &_acc_id);

我注意到我们需要在 sip2sip 中使用名为“proxy.sipthor.net”的出站代理。 但很困惑如何在 pjsip 代码中使用。

请高手帮忙。

【问题讨论】:

  • 你是如何连接本地的,我试过注册成功,但通话没有连接。我用过

标签: android sip voip pjsip


【解决方案1】:

如果您阅读 Sip2Sip 设备配置 page,它会声明:

" SIP 设备必须始终执行 SIP 标准 RFC3263 中定义的 DNS 查找(NAPTR + SRV + A DNS 查找)"

PJSIP 支持 DNS SRV 查找。

在 PJSUA 中,如果您未在 SIP URL 中提供端口号,它只会进行 DNS SRV 查找。

"sip:xxx@sip2sip.info" 将首先尝试进行 DNS SRV 记录查找,然后故障转移到 DNS A/C 名称查找。

"sip:xxx@sip2sip.info:5060" 只会进行 DNS A/C 名称查找。

PJSUA 不支持automatically 的是故障转移支持,他们说:

“我们一直建议在应用层实现故障转移机制。”

如果您想要“快速简单”的设置,您需要将outbound_proxy 设置为“proxy.sipthor.net”。例如

    cfg.outbound_proxy_cnt = 1;
    cfg.outbound_proxy[0] = pj_str("sip:proxy.sipthor.net:5060");

如果您想要一个更强大的解决方案,您需要使用pjsip's SRV resolution 函数来解析 sip2sip.info srv 记录,例如:“_sip._udp.sip2sip.info”,然后使用结果设置 outbound_proxy 记录。

代码有点复杂。

pjsip_resolver_t* resolver_;

...

status = pjsip_resolver_create( pool, &resolver_ );

...

pjsip_host_info host;
host.flag = PJSIP_TRANSPORT_DATAGRAM; // is using UDP, see pjsip_transport_flags_e
host.type = PJSIP_TRANSPORT_UDP; // if using UDP, see pjsip_transport_type_e
host.addr.host = pj_str("sip2sip.info");
host.addr.port = 5060;

pjsip_resolve(resolver_, pool, &host, token, resolver_cb_func);

...


static void resolver_cb_func( pj_status_t status, void *token, const struct pjsip_server_addresses *addr)
{
    ...
            // use results to fill in the outbound_proxy
}

您还可以进一步支持故障转移,但看起来 sip2sip 在 DNS SRV 记录中没有多个 sip 服务器,因此目前不会使用。如果他们添加更多内容,它将变得更加有用。

_sip._udp.sip2sip.info 服务器:fritz.box 地址:fd00::2665:11ff:fef9:ec51
非权威回答:
_sip._udp.sip2sip.info SRV 服务位置:
优先级 = 100
重量 = 100
端口 = 5060
svr 主机名 = proxy.sipthor.net
sip2sip.info 名称服务器 = ns2.dns-hosting.info sip2sip.info 名称服务器 = ns1.dns-hosting.info sip2sip.info 域名服务器 = ns7.dns-hosting.info

Sip2Sip 也支持 STUN 设置,所以我也会在帐户上设置 STUN 设置:

cfg.stun_srv_cnt = 1;
cfg.stun_srv[0] = pj_str("sip2sip.info");

由于您的示例似乎没有提供它应该工作的端口信息。要进一步诊断,需要查看 pjsip 日志输出。

【讨论】:

  • 如何使用 pjsip_resolve 执行同步查找?出于某种原因,pj_gethostbyname 对我不起作用,我想使用自定义名称服务器来使用 pjsip_resolve。
  • pjsip 没有为 pjsip_resolve 提供同步 API。您应该能够使用 promise / future (c++ 11) 或互斥锁(例如 pthread 互斥锁)将其转换为同步 API
猜你喜欢
  • 2015-05-23
  • 2018-08-29
  • 1970-01-01
  • 2016-06-21
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多