前言: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
小弟学疏才浅,如果错误之处尽情指出。
网友评论