美文网首页iOS --Linphone
Linphone实现简单的拨打呼叫

Linphone实现简单的拨打呼叫

作者: 384b68c260d2 | 来源:发表于2017-07-21 15:19 被阅读449次

前言:linphoneSDK虽然没有文档说明,使用起来其实很简单。我们简单的实现一个拨打呼叫的过程。

一、初始化LinphoneCore

//初始化manager单例
 LinphoneManager *manager = [LinphoneManager instance];
if (![LinphoneManager isLcReady]) {//判断linphonecore是否已经启动
//调用linphoneCore
        [[LinphoneManager instance] startLinphoneCore];
    }

[LinphoneManager isLcReady] 新版本的LinphoneManager有的是没有此方法的,可以手动添加,此方法意义不大,主要是为了判断core是否已经初始化

//判断是否准备就绪
+ (BOOL)isLcReady {
    return theLinphoneCore != nil;
}

二、注册SIP服务器

//配置linphone注册sip
- (void)addProxyConfig:(NSString*)username password:(NSString*)pwd domain:(NSString*)domain proxy:(NSString *)proxy{
    //进行空值判断
    if(username==nil||
       pwd==nil||
       domain==nil||
       proxy==nil||
       [username isEqualToString:@""]||
       [pwd isEqualToString:@""]||
       [domain isEqualToString:@""]){//此处少检查了一个proxy的值(目的是有时候本地服务器无法连接上,不设置代理即可)
        NSLog(@"在注册SIP过程中 下列值有的为空 [%@][%@][%@][%@]",username,pwd,domain,proxy);
        return;
    }
    //判断linphoneAPI是否已初始化
    if (![LinphoneManager isLcReady]) {
        [LinphoneManager instance];
    }
    //获取linphoneCore
    LinphoneCore *lc = [LinphoneManager getLc];
    //配置音频段
    linphone_core_set_audio_port_range(lc, 10000, 30000);
    //配置视频段
    linphone_core_set_video_port_range(lc, 30001, 50000);
    //获取代理配置
    LinphoneProxyConfig *proxyCfg = linphone_core_create_proxy_config(lc);
    //归一化用户名
    char normalizedUserName[256];
    //设置代理中的归一化用户名
    linphone_proxy_config_normalize_number(proxyCfg, [username cStringUsingEncoding:[NSString defaultCStringEncoding]], normalizedUserName, sizeof(normalizedUserName));
    //通过代理获取身份设置
     const char* identity = linphone_proxy_config_get_identity(proxyCfg);
    //如果代理身份为空
    if( !identity || !*identity ) {
        identity = "sip:user@example.com";
    }
    //通过身份  获取地址
    LinphoneAddress* linphoneAddress = linphone_address_new(identity);
    //写入归一化的用户名
    linphone_address_set_username(linphoneAddress, normalizedUserName);
    
    if ((!proxy || [proxy length] <1 ) && domain) {//如果proxy没有或者proxyd的长度小于1
        linphone_proxy_config_set_server_addr(proxyCfg, [domain UTF8String]);
    } else {
        //配置格式化的proxy
        proxy = [NSString stringWithFormat:@"<sip:%@;transport=tcp>",proxy] ;
//        proxy = [NSString stringWithFormat:@"sip:%@",proxy];//备用项
        //配置服务器地址
        linphone_proxy_config_set_server_addr(proxyCfg, [proxy UTF8String]);
    }
    //设置地址的主机段
    linphone_address_set_domain(linphoneAddress, [domain UTF8String]);
    //通过新生成的地址获取新的身份
    identity = linphone_address_as_string_uri_only(linphoneAddress);
    //再将新的身份信息写入
    linphone_proxy_config_set_identity(proxyCfg, identity);
    //    设置注册间隔时间为默认660秒,测试增加
    linphone_proxy_config_set_expires(proxyCfg,660);
  
    //配置身份验证信息
    LinphoneAuthInfo* info = linphone_auth_info_new([username UTF8String]
                                                    , NULL, [pwd UTF8String]
                                                    , NULL
                                                    , NULL
                                                    ,linphone_proxy_config_get_domain(proxyCfg));
    //配置默认代理
    [self setDefaultSettings:proxyCfg];
    //清空代理冗余配置
    [self clearProxyConfig];
    
    //配置代理  开启注册
    linphone_proxy_config_enable_register(proxyCfg, true);
    //添加身份验证
    linphone_core_add_auth_info(lc, info);
    //配置代理
    linphone_core_add_proxy_config(lc, proxyCfg);
    //设置默认代理地址
    linphone_core_set_default_proxy(lc, proxyCfg);
    //设置双音多频
    linphone_core_set_use_info_for_dtmf(lc, true);    
}

方法传参示例

  [regManager addProxyConfig:@"你的SIP账户" password:@"你的SIP密码" domain:@"你的SIP服务器地址" proxy:@"你的SIP服务器地址:你的SIP服务所使用的端口"];
//默认端口5060 proxy在默认端口情况下可以不做配置(不绝对,有些情况下配置了无法连接,有些情况下必须配置)
  [regManager addProxyConfig:@"你的SIP账户" password:@"你的SIP密码" domain:@"你的SIP服务器地址" proxy:@""];

三、拨打电话

拨打电话这里我只写入非常简单的拨打电话,不做更多的电话状态判断,后面我会写一篇专门讲解linphone电话状态的文章。

- (void)callOut{
//你要拨打的SIP账号
    NSString *phone = @"1003";
//他所在的sip服务器地址
    NSString *domin = @"192.168.5.208";
// 通话地址格式格式 sip:账户@主机地址
    NSString *address = [NSString stringWithFormat:@"sip:%@@%@",phone,domin];
//通过address字符串 得到linphoneAddress
    LinphoneAddress *linphoneAddress = linphone_address_new([address cStringUsingEncoding:[NSString defaultCStringEncoding]]);
//传入地址 实现拨打
    [[LinphoneManager instance] call:linphoneAddress];
}

四、接听电话

接听电话这里要做一个简单的状态判断
首先注册状态监听

//注册电话事件监听
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(callUpdateEvent:)
                                                 name:kLinphoneCallUpdate
                                               object:nil];

状态处理

- (void)callUpdateEvent:(NSNotification*)notif {
//获取当前正在进行的call
    LinphoneCall *acall = [[notif.userInfo objectForKey: @"call"] pointerValue];
  //获取当前call的状态
    LinphoneCallState astate = [[notif.userInfo objectForKey: @"state"] intValue];
//传入call和状态进行处理
        [self callUpdate:acall state:astate];
}
//这里将call和状态定义成全局变量或者属性,方便其他方法获取值  此处仅为很简单的状态判断
- (void)callUpdate:(LinphoneCall *)acall state:(LinphoneCallState)astate {
    if(astate == LinphoneCallEnd || astate == LinphoneCallError) { //如果当前电话处于 挂断或者 出错状态
        NSLog(@"挂断电话");
        self.theCallSate = 0;
        self.call = nil;
        return;
    }
    if (self.theCallSate == 1) {
        NSLog(@"正在拨打电话");
    }else{
        NSLog(@"电话来了");
        
    }
//获取这通电话
    self.call = acall;
}

最后接电话方法

- (void)callIn{
    if (self.call) {
//此处为老版本manager中接电话方法
//        [[LinphoneManager instance] acceptCall:self.call];
        [[LinphoneManager instance] acceptCall:self.call evenWithVideo:NO];
    }else{
        NSLog(@"没电话");
    }
}

最后

linphone官方sip服务器地址 sip.linphone.org 端口 5060

小弟学疏才浅,如果错误之处尽情指出。

相关文章

  • Linphone实现简单的拨打呼叫

    前言:linphoneSDK虽然没有文档说明,使用起来其实很简单。我们简单的实现一个拨打呼叫的过程。 一、初始化L...

  • linphone呼叫流程

    首先是jni入口:linphonecore_jni.cc -> linphone_core_invite_addr...

  • FreeSwitch接通30s左右就挂断

    设备呼叫linphone,设备挂断但是通话没有结束,linphone到了30s左右才挂断的问题,一开始以为是pj...

  • 快速移植Linphone到自己的项目

    首先我们来看Linphone的简单介绍: Linphone for smartphones, tablets an...

  • iOS linphone 405Method not allow

    iOS linphone进行语音通话时出现以下错误:1.拨打方 拨出电话,收到405 Method not all...

  • 修改linphone-sdk-android-第四篇

    背景 在使用linphone-sdk-android过程中,发现当有一起呼叫在通话中时,又收到一起呼叫,会莫名其妙...

  • 呼叫中心的学习

    1.呼叫中心的定义 指用户拨打一个电话号码接入呼叫中心后,就能收到呼叫中心任务提示音(通过自动语音应答系统或者人工...

  • 开启读书模式

    您好,您拨打的电话已开启读书模式,有事,请在听到“嘟”的一声后留言,有急事的,请直接拨打人工服务,上门呼叫…… 嘿...

  • 拉黑你电话的一定不是真朋友

    拨打你的电话,响了四五声后,显示呼叫失败,再打过去,还是呼叫失败!怎么回事儿?难道是这个地方信号不好? 在试了三次...

  • pjsip开发——Call

    呼叫使用Call来实现,一般根据需要我们需要自定义Call的实现 在具体实现类中,通过重写呼叫回调,用于处理与呼叫...

网友评论

    本文标题:Linphone实现简单的拨打呼叫

    本文链接:https://www.haomeiwen.com/subject/alkekxtx.html