gpt4 book ai didi

ios - PJSIP 不响应 401 的身份验证

转载 作者:行者123 更新时间:2023-11-28 21:14:18 49 4
gpt4 key购买 nike

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

更奇怪的是,在极少数情况下,它确实有效。就像正在发生某种竞争条件一样,但这都存在于 PJSIP 本身中。因为我只打电话...

pjsua_acc_add(&accountConfig, PJ_TRUE, &accID);

然后 PJSIP 库做他们的事情。

这是数据包捕获的片段。10.200.0.72 是我的 Asterisk 服务器。 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

这是我实现此目的的 OBJ-C 代码...

- (void) startAndRegisterOnServer:(NSString *)sipDomain withUserName:(NSString *)sipUser andPassword:(NSString *)password success:(void (^)(void))success failure:(void (^)(int errorCode, NSString *errorMessage))failure
{
pj_status_t status;

status = pjsua_create();

if (status != PJ_SUCCESS)
{
failure (status, @"Error in pjsua_create");

return;
}

// Setup Config and Initialize

pjsua_config config;
pjsua_config_default (&config);

config.cb.on_incoming_call = &on_incoming_call;
config.cb.on_call_media_state = &on_call_media_state;
config.cb.on_call_state = &on_call_state;
config.cb.on_reg_state2 = &on_reg_state2;

pjsua_logging_config logConfig;
pjsua_logging_config_default(&logConfig);
logConfig.console_level = 5;

status = pjsua_init(&config, &logConfig, NULL);

if (status != PJ_SUCCESS)
{
failure (status, @"Error in pjsua_init");

return;
}

// Add UDP transport

pjsua_transport_config udpTransportConfig;
pjsua_transport_config_default(&udpTransportConfig);
udpTransportConfig.port = 5080;

status = pjsua_transport_create(PJSIP_TRANSPORT_UDP, &udpTransportConfig, NULL);

if (status != PJ_SUCCESS)
{
failure (status, @"Error adding UDP transport");

return;
}

// Add TCP transport.

pjsua_transport_config tcpTransportConfig;
pjsua_transport_config_default(&tcpTransportConfig);
tcpTransportConfig.port = 5080;

status = pjsua_transport_create(PJSIP_TRANSPORT_TCP, &tcpTransportConfig, NULL);

if (status != PJ_SUCCESS)
{
failure (status, @"Error adding TCP transport");

return;
}

// Startup PJSUA

status = pjsua_start();

if (status != PJ_SUCCESS)
{
failure (status, @"Error starting PJSUA");

return;
}

// Register with SIP Server

pjsua_acc_config accountConfig;
pjsua_acc_config_default(&accountConfig);

// Account ID

char sipAccount [MAX_SIP_ACCOUNT_LENGTH];
sprintf (sipAccount, "sip:%s@%s", [sipUser UTF8String], [sipDomain UTF8String]);
accountConfig.id = pj_str(sipAccount);

// Register URI

char regUri[MAX_SIP_REGISTER_URI_LENGTH];
sprintf(regUri, "sip:%s", [sipDomain UTF8String]);
accountConfig.reg_uri = pj_str(regUri);

// Set the credentials in accountConfig

accountConfig.cred_count = 1;
accountConfig.cred_info[0].scheme = pj_str("digest");
accountConfig.cred_info[0].realm = pj_str("asterisk");
accountConfig.cred_info[0].username = pj_str((char *)[sipUser UTF8String]);
accountConfig.cred_info[0].data_type = PJSIP_CRED_DATA_PLAIN_PASSWD;
accountConfig.cred_info[0].data = pj_str((char *)[password UTF8String]);

pjsua_acc_id accID;

status = pjsua_acc_add(&accountConfig, PJ_TRUE, &accID);

[PJSIPInterfaceManager sharedInstance].accountID = accID;

if (status != PJ_SUCCESS)
{
failure (status, @"Error registering account with server");

return;
}

success();
}

有什么想法吗?再次在极少数情况下我可以让它工作,但它就像 50 次中的 1 次。


**更新**


所以经过大量的故障排除。我相信这可能与 NAT 相关。我有两台服务器。一个是我的网络内部,这是这个例子所基于的 (10.200.0.72) 和一个外部服务器。但是我在两台服务器上都遇到了问题。下面是我使用我的外部 Asterisk 服务器连夜进行的测试。我让我的 iOS 客户端运行了一整夜,仍然无法注册。它设置为默认的 5 分钟重试。这是因为它一直在重新发送相同的数据包,因为 CSeq 没有​​递增。然后半夜客户端终于连上了。

在日志中我注意到了这一点......

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

请注意,我编辑了我的外部 Asterisk 服务器的 IP 和我的公共(public) IP。

您会在第二行看到 PJSIP 客户端注意到我的 IP 已更改。实际上并没有,设备保留了 10.200.154.118。但出于某种原因,它突然开始在数据包的 VIA 行中为我的路由器发送我的公共(public) IP。然后你可以在下一行看到它注册成功。

这是数据包捕获中的 VIA 线路...

来自:

Via: SIP/2.0/UDP 10.200.154.118:5080;rport;branch=z9hG4bKPjegwWD-UEDhH3c5cShdumEEbKvfmK45Zl

收件人:

Via: SIP/2.0/UDP [MY EXTERNAL IP]:31943;rport;branch=z9hG4bKPjxcKgVfSngqxxTy7MnGhZU5Y3RrjpczNr

此外,CSeq 编号也最终递增,并且已发送授权 header 。

然后大约 3 小时 20 分钟后,它再次回到失败状态。然而它仍在使用我的外部 IP(它没有恢复到它的 10 地址。)这是在服务器发送一连串的 OPTIONS 消息之后。大约连续 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

老实说,我不知道这个 OPTION 消息是关于什么的。但是在连续大约 20 个之后,随后的 REGISTER 失败并继续这样做。

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

有什么见解吗?

最佳答案

不久前我在 PJSIP 工作过。我将您的启动代码与我的启动代码进行了比较,这里有一些差异。不确定是否有帮助。

在顶部我做了一个:

    if (pjsua_acc_get_count() > 0)
{
[self unregisterAccount];
}

一点点:

    accountConfig.reg_timeout          = 110;
accountConfig.ka_interval = 5;
accountConfig.allow_contact_rewrite = 0;

最后,这是 unregisterAccount 方法:

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

我希望这会有所帮助,但我想不会。您并不孤单,PJSIP 和 SIP 通常很难在每种情况下工作。祝你成功!

如果没有任何帮助,我猜 PJSIP 的论坛还在工作吗?

关于ios - PJSIP 不响应 401 的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41846403/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com