PJSIP ios не пытается перерегистрировать после получения одноразового номера из-за изменения IP - PullRequest
0 голосов
/ 26 июня 2019

Я пытаюсь реализовать 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 - причина, по которой я не могу зарегистрироваться.Это так?

...