Ios PJSIP未通过对401的身份验证进行响应

Ios PJSIP未通过对401的身份验证进行响应,ios,asterisk,pjsip,Ios,Asterisk,Pjsip,我正在尝试让PJSIP在我的iOS项目中工作,以连接到我的Asterisk服务器。我用wireshark做了一个数据包捕获,由于某种原因PJSIP没有像它应该做的那样响应401挑战 更奇怪的是,这是一个罕见的场合,它确实有效。就像有某种竞赛条件在进行,但这一切都存在于PJSIP本身。因为我所说的是 pjsua_acc_add(&accountConfig, PJ_TRUE, &accID); 然后PJSIP库完成它们的工作 下面是数据包捕获的一个片段。。10.200.0.72是

我正在尝试让PJSIP在我的iOS项目中工作,以连接到我的Asterisk服务器。我用wireshark做了一个数据包捕获,由于某种原因PJSIP没有像它应该做的那样响应401挑战

更奇怪的是,这是一个罕见的场合,它确实有效。就像有某种竞赛条件在进行,但这一切都存在于PJSIP本身。因为我所说的是

pjsua_acc_add(&accountConfig, PJ_TRUE, &accID);
然后PJSIP库完成它们的工作

下面是数据包捕获的一个片段。。10.200.0.72是我的星号服务器。10.200.154.118是我的测试iOS设备

REGISTER sip:10.200.0.72 SIP/2.0
Via: SIP/2.0/UDP 10.200.154.118:5080;rport;branch=z9hG4bKPjLjNBXVcaqqPqYVtTR2GDEQJhhGYG7Fo3
Max-Forwards: 70
From: <sip:110@10.200.0.72>;tag=JgDAcidZf0Ew-Jqgei0Am3Znyl2SEFg.
To: <sip:110@10.200.0.72>
Call-ID: hTMu0Vi.Kte6PntnMJdxQmeBWtKdXZd0
CSeq: 59555 REGISTER
Contact: <sip:110@10.200.154.118:5080;ob>
Expires: 300
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Content-Length:  0

REGISTER sip:10.200.0.72 SIP/2.0
Via: SIP/2.0/UDP 10.200.154.118:5080;rport;branch=z9hG4bKPjLjNBXVcaqqPqYVtTR2GDEQJhhGYG7Fo3
Max-Forwards: 70
From: <sip:110@10.200.0.72>;tag=JgDAcidZf0Ew-Jqgei0Am3Znyl2SEFg.
To: <sip:110@10.200.0.72>
Call-ID: hTMu0Vi.Kte6PntnMJdxQmeBWtKdXZd0
CSeq: 59555 REGISTER
Contact: <sip:110@10.200.154.118:5080;ob>
Expires: 300
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Content-Length:  0

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 10.200.154.118:5080;rport=5080;received=10.200.154.118;branch=z9hG4bKPjLjNBXVcaqqPqYVtTR2GDEQJhhGYG7Fo3
Call-ID: hTMu0Vi.Kte6PntnMJdxQmeBWtKdXZd0
From: <sip:110@10.200.0.72>;tag=JgDAcidZf0Ew-Jqgei0Am3Znyl2SEFg.
To: <sip:110@10.200.0.72>;tag=z9hG4bKPjLjNBXVcaqqPqYVtTR2GDEQJhhGYG7Fo3
CSeq: 59555 REGISTER
WWW-Authenticate: Digest  realm="asterisk",nonce="1485330086/50f04167f65383db99f5c0cf17651984",opaque="73b3a6a8599485f8",algorithm=md5,qop="auth"
Server: FPBX-13.0.190.11(13.12.1)
Content-Length:  0

SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 10.200.154.118:5080;rport=5080;received=10.200.154.118;branch=z9hG4bKPjLjNBXVcaqqPqYVtTR2GDEQJhhGYG7Fo3
Call-ID: hTMu0Vi.Kte6PntnMJdxQmeBWtKdXZd0
From: <sip:110@10.200.0.72>;tag=JgDAcidZf0Ew-Jqgei0Am3Znyl2SEFg.
To: <sip:110@10.200.0.72>;tag=z9hG4bKPjLjNBXVcaqqPqYVtTR2GDEQJhhGYG7Fo3
CSeq: 59555 REGISTER
WWW-Authenticate: Digest  realm="asterisk",nonce="1485330086/50f04167f65383db99f5c0cf17651984",opaque="73b3a6a8599485f8",algorithm=md5,qop="auth"
Server: FPBX-13.0.190.11(13.12.1)
Content-Length:  0
有什么想法吗?在一个罕见的情况下,我可以让它工作,但它就像是50次中的1次


**更新**
所以经过很多的故障排除。我相信这可能与NAT有关。我有两台服务器。一个是我的网络内部,这就是本例所基于的(10.200.0.72)和一个外部服务器。但是,我在两台服务器上都遇到了问题。下面是我使用外部星号服务器进行的测试。我让我的iOS客户端运行了一夜,仍然无法注册。它被设置为默认的5分钟重试。如果它只是一直重新发送相同的数据包,因为CSeq没有增加。然后在半夜,客户终于联系到了。p> 在日志中,我注意到

04:19:22.706    pjsua_acc.c  ...SIP registration failed, status=408 (Request Timeout)
04:24:20.767    pjsua_acc.c  ....IP address change detected for account 0 (10.200.154.118:5080 --> [MY EXTERNAL IP]:31943). Updating registration (using method 4)
04:24:20.810    pjsua_acc.c  ....sip:100@[EXTERNAL ASTERISK IP]: registration success, status=200 (OK), will re-register in 300 seconds
请注意,我编辑了我的外部星号服务器的IP和我的公共IP

您将在第二行看到,PJSIP客户机注意到我的IP发生了变化。实际上没有,设备保留了10.200.154.118。但出于某种原因,它突然开始通过数据包的VIA线路向我的路由器发送我的公共IP。然后您可以在下一行看到它成功注册

这是来自数据包捕获的VIA线路

发件人:

致:

此外,CSeq编号也最终增加,并发送该授权标头

大约3小时20分钟后,它又回到失败状态。但它仍然在使用我的外部IP(它没有恢复到它的10地址)。这是在服务器发送了一系列选项消息之后。大约连续20次客户没有回复

OPTIONS sip:100@[MY EXTERNAL IP]:31943;ob SIP/2.0
Via: SIP/2.0/UDP [EXTERNAL ASTERISK IP]:5060;branch=z9hG4bK6128eaf9;rport
Max-Forwards: 70
From: "Unknown" <sip:Unknown@[EXTERNAL ASTERISK IP]>;tag=as165c224d
To: <sip:100@[MY EXTERNAL IP]:31943;ob>
Contact: <sip:Unknown@[EXTERNAL ASTERISK IP]:5060>
Call-ID: 341a15d536c3a3b45a73567056e34b6b@[EXTERNAL ASTERISK IP]:5060
CSeq: 102 OPTIONS
User-Agent: Mozilla
Date: Fri, 27 Jan 2017 14:45:48 GMT
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Content-Length: 0
选项sip:100@[MY EXTERNAL IP]:31943;ob SIP/2.0
Via:SIP/2.0/UDP[外部星号IP]:5060;分支=z9hG4bK6128eaf9;港口
最大前锋:70
来自:“未知”;标签=as165c224d
致:
联系人:
呼叫ID:341a15d536c3a3b45a73567056e34b6b@[外部星号IP]:5060
CSeq:102个选项
用户代理:Mozilla
日期:2017年1月27日星期五14:45:48 GMT
允许:邀请、确认、取消、选项、再见、参考、订阅、通知、信息、发布、消息
支持:替换、定时器
内容长度:0
我真的不知道这个选项信息是关于什么的。但在连续进行了大约20次之后,随后的寄存器失败并继续失败

我还注意到了一些事情。端口从客户端上的静态5080侦听端口更改为随机动态端口。您将在两条VIA线中看到这一点。这让我想到,即使我在网络中看到数据包,它也无法到达客户端,因为它没有在该端口上侦听?我应该在客户端上设置任何配置来解决这个问题吗


有什么见解吗

不久前我和PJSIP合作过。我比较了你的启动代码和我的代码,这里有一些不同之处。我不确定这是否有用

在顶部,我做了一个:

    if (pjsua_acc_get_count() > 0)
    {
        [self unregisterAccount];
    }
有点沮丧:

    accountConfig.reg_timeout          = 110;
    accountConfig.ka_interval           = 5;
    accountConfig.allow_contact_rewrite = 0;
最后,这里是
注销帐户的方法:

- (void)unregisterAccount
{    
    @synchronized(self)
    {
        pj_status_t status;
        unsigned    count;

        [self registerThread];

        count = pjsua_acc_get_count();

        if (count > 0)
        {
            pjsua_acc_info* info = calloc(count, sizeof(pjsua_acc_info));

            for (int n = 0; n < count; n++)
            {
                status = pjsua_acc_enum_info(info, &count);

                if (status == PJ_SUCCESS)
                {
                    status = pjsua_acc_del(info[n].id);
                    if (status != PJ_SUCCESS)
                    {
                        NSLog(@"Unregister unsuccessful");
                    }
                }
            }

            free(info);
        }

        accountId = -1;
    }
}
-(作废)注销帐户
{    
@同步(自)
{
pj_状态_t状态;
无符号计数;
[自注册线程];
count=pjsua_acc_get_count();
如果(计数>0)
{
pjsua_acc_info*info=calloc(计数、大小(pjsua_acc_info));
对于(int n=0;n
我希望这会有帮助,但我想不会。并非只有您一人,PJSIP和SIP通常在每个场景中都非常棘手。祝你成功


如果没有什么帮助的话,我想PJSIP的论坛仍然在工作?

我在PJSIP工作了一段时间。我比较了你的启动代码和我的代码,这里有一些不同之处。我不确定这是否有用

在顶部,我做了一个:

    if (pjsua_acc_get_count() > 0)
    {
        [self unregisterAccount];
    }
有点沮丧:

    accountConfig.reg_timeout          = 110;
    accountConfig.ka_interval           = 5;
    accountConfig.allow_contact_rewrite = 0;
最后,这里是
注销帐户的方法:

- (void)unregisterAccount
{    
    @synchronized(self)
    {
        pj_status_t status;
        unsigned    count;

        [self registerThread];

        count = pjsua_acc_get_count();

        if (count > 0)
        {
            pjsua_acc_info* info = calloc(count, sizeof(pjsua_acc_info));

            for (int n = 0; n < count; n++)
            {
                status = pjsua_acc_enum_info(info, &count);

                if (status == PJ_SUCCESS)
                {
                    status = pjsua_acc_del(info[n].id);
                    if (status != PJ_SUCCESS)
                    {
                        NSLog(@"Unregister unsuccessful");
                    }
                }
            }

            free(info);
        }

        accountId = -1;
    }
}
-(作废)注销帐户
{    
@同步(自)
{
pj_状态_t状态;
无符号计数;
[自注册线程];
count=pjsua_acc_get_count();
如果(计数>0)
{
pjsua_acc_info*info=calloc(计数、大小(pjsua_acc_info));
对于(int n=0;n
我希望这会有帮助,但我想不会。并非只有您一人,PJSIP和SIP通常在每个场景中都非常棘手。祝你成功


如果没有任何帮助,我想PJSIP的论坛仍在运行?

所以这个故事的目的是确保您的网络是最新的。我的WIFI设置是专业级的,但已经过时了。升级