由于IP更改,PJSIP ios在获得随机数后未尝试重新注册

时间:2019-06-26 13:55:18

标签: ios sip voip pjsip

我正在尝试使用同一(https://github.com/petester42/pjsip-ios)的cocoapod端口为ios实现PJSIP。我正在尝试使用Kamailio(4.4.x)将帐户注册到托管在Google云上的SIP服务器。图书馆正在尝试注册自己,但是在此期间每次IP都被更改。我正在使用摘要式身份验证机制,在获得摘要后,它不会重试注册。

因此,我查看了PJSIP(https://trac.pjsip.org/repos/wiki/IPAddressChange#Approach1:Restarteverything)的 IPAddressChange 的文档,并说对IP进行更改的直接方法是销毁所有内容并重新启动所有内容。因此,为了获取网络更改事件,我正在使用 Reachability 。我如何测试IP是否更改。库本身在日志中说,检测到帐户0的 IP地址更改(192.168.100.143:5060-> 103.78.19.70:5060)。更新注册(使用方法4),为什么图书馆的默认后备机制不起作用?

该如何处理?

我的代码如下:

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更改是我无法注册的原因。是吗?

0 个答案:

没有答案