Я пытаюсь реализовать PJSIP для ios, используя тот же порт cocoapod (https://github.com/petester42/pjsip-ios). Я пытаюсь зарегистрировать учетную запись на моем SIP-сервере, который размещен в облаке Google с помощью Kamailio (4.4.x).Библиотека пытается зарегистрироваться сама, но во время этого каждый раз, когда меняется IP-адрес. Я использую механизм дайджест-аутентификации, для которого после получения одноразового номера она не повторяет попытку регистрации.
Поэтому я заглянул в документ IPAddressChange из PJSIP (https://trac.pjsip.org/repos/wiki/IPAddressChange#Approach1:Restarteverything) и там говорится об изменении IP, прямой путь - уничтожить все и перезапустить все. Поэтому для получения события изменения сети я использую Reachability . Как проверить, изменился ли IP или нет. В журнале сама библиотека говорит Обнаружено изменение IP-адреса для учетной записи 0 (192.168.100.143:5060 -> 103.78.19.70:5060). Обновление регистрации (используя метод 4) , так почему механизм резервирования по умолчанию библиотеки не работает?
Как я могу справиться с этимcase?
Мой код выглядит так:
func setupSIP(){
var status = pj_status_t()
pjsua_create()
var ua_cfg:pjsua_config = pjsua_config()
var log_cfg:pjsua_logging_config = pjsua_logging_config()
var media_cfg:pjsua_media_config = pjsua_media_config()
pjsua_config_default(&ua_cfg);
pjsua_logging_config_default(&log_cfg);
pjsua_media_config_default(&media_cfg);
pjsua_init(&ua_cfg, &log_cfg, &media_cfg);
var transportConfig:pjsua_transport_config = pjsua_transport_config()
pjsua_transport_config_default(&transportConfig);
transportConfig.port = 5060;
pjsua_transport_create(PJSIP_TRANSPORT_UDP, &transportConfig, nil);
//pjsua_transport_create(PJSIP_TRANSPORT_TCP, &transportConfig, nil);
status = pjsua_start();
var acc_cfg = pjsua_acc_config()
var accountId = pjsua_acc_id()
pjsua_acc_config_default(&acc_cfg);
acc_cfg.id = giveStruct(string: "sip:1001@105.131.142.101")
acc_cfg.reg_uri = giveStruct(string: "sip:105.131.142.101:5060")
acc_cfg.cred_count = 1;
acc_cfg.cred_info.0.realm = giveStruct(string: "*")
acc_cfg.cred_info.0.scheme = giveStruct(string: "digest")
acc_cfg.cred_info.0.username = giveStruct(string: "1001")
acc_cfg.cred_info.0.data_type = 0;
acc_cfg.cred_info.0.data = giveStruct(string: "1001")
acc_cfg.reg_timeout = 1000
acc_cfg.ka_interval = 5
acc_cfg.register_on_acc_add = 1
pjsua_acc_add(&acc_cfg,1, &accountId)
//print(res)
}
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
self.reach = Reachability.forInternetConnection()
// Tell the reachability that we DON'T want to be reachable on 3G/EDGE/CDMA
self.reach!.reachableOnWWAN = false
// Here we set up a NSNotification observer. The Reachability that caused the notification
// is passed in the object parameter
NotificationCenter.default.addObserver(
self,
selector: #selector(reachabilityChanged),
name: NSNotification.Name.reachabilityChanged,
object: nil
)
self.reach!.startNotifier()
self.setupSIP()
return true
}
@objc func reachabilityChanged(notification: NSNotification) {
if self.reach!.isReachableViaWiFi() || self.reach!.isReachableViaWWAN() {
print("Service available!!!")
} else {
print("No service available!!!")
}
pjsua_destroy()
self.setupSIP()
}
журнал выглядит так:
19:07:15.820 pjsua_core.c ...TX 488 bytes Request msg REGISTER/cseq=26388 (tdta0x104049400) to UDP 105.131.142.101:5060:
REGISTER sip:105.131.142.101:5060 SIP/2.0
Via: SIP/2.0/UDP 192.168.100.143:5060;rport;branch=z9hG4bKPj4J5tZU4KgWii.znUwydBLgJchV699zm7
Max-Forwards: 70
From: <sip:105.131.142.101>;tag=vhaOo652Ovn9Ligxr6-jEFNiClvjvpcj
To: <sip:105.131.142.101>
Call-ID: TNuFgpAt-pPBoCLumKswBsOTETZTYdvj
CSeq: 26388 REGISTER
Contact: <sip:192.168.100.143:5060;ob>
Expires: 1000
Allow: PRACK, INVITE, ACK, BYE, CANCEL, UPDATE, INFO, SUBSCRIBE, NOTIFY, REFER, MESSAGE, OPTIONS
Content-Length: 0
--end msg--
19:07:15.820 pjsua_acc.c ..Acc 0: Registration sent
19:07:15.938 pjsua_core.c .RX 501 bytes Response msg 401/REGISTER/cseq=26388 (rdata0x10404a828) from UDP 105.131.142.101:5060:
SIP/2.0 401 Unauthorized
Via: SIP/2.0/UDP 192.168.100.143:5060;rport=5060;branch=z9hG4bKPj4J5tZU4KgWii.znUwydBLgJchV699zm7;received=103.78.19.70
From: <sip:105.131.142.101>;tag=vhaOo652Ovn9Ligxr6-jEFNiClvjvpcj
To: <sip:105.131.142.101>;tag=b27e1a1d33761e85846fc98f5f3a7e58.1511
Call-ID: TNuFgpAt-pPBoCLumKswBsOTETZTYdvj
CSeq: 26388 REGISTER
WWW-Authenticate: Digest realm="105.131.142.101", nonce="XRN2N10TdQspViwWHFKrPESgdCBqaa1P"
Server: kamailio (4.4.7 (x86_64/linux))
Content-Length: 0
--end msg--
19:07:15.939 pjsua_acc.c ....IP address change detected for account 0 (192.168.100.143:5060 --> 103.78.19.70:5060). Updating registration (using method 4)
19:07:15.939 sip_auth_clien ...Unable to set auth for tdta0x104049400: can not find credential for 105.131.142.101/Digest
19:07:15.939 pjsua_acc.c ....SIP registration error: No suitable credential (PJSIP_ENOCREDENTIAL) [status=171101]
Основная проблема в том, что я не могу зарегистрироваться дажеесли переданные учетные данные верны.Я могу зарегистрироваться с linphone с тем же именем пользователя и паролем.Так что я полагаю, что изменение IP - причина, по которой я не могу зарегистрироваться.Это так?