物理端点上电注册分析

//该函数为ipPhoneRegisterPhysTermAsync函数处理流程中最后的流程,主要用于上电后
//线路自动发起SIP注册。
sipPhoneRegisterPhysTermAsyncStep
	RvCCTerminal* t ;
	
	//创建sip终端对象
t= rvSipProviderRegisterTerm(sipProvider, mdmTerm, id, type, termProperties);
	rvCCProviderSipCreateTerminal(x, mdmTerm, type, id, termProperties);
		//构建sip终端对象
		rvCCTerminalSipConstruct(t, x, mdmTerm, id, termProperties, provider->alloc);
			//从termProperties获取线路配置,如果不存在,则从sipProvider
			//中获取全局性的配置。
			term->provider = p;
			term->alloc = a;
			term->mdmXTerm = mdmTerm->xTerm; //sip终端关联模拟线路终端
			……
			
			//term.networkRegisterState = 
			// RV_TERM_NETWORK_REG_STATE_UNREGISTERED
			rvCCTerminalSipSetRegState(term,
				RV_TERM_NETWORK_REG_STATE_UNREGISTERED);
			
			//term.toolkitRegisterState = RV_TERM_TOOLKIT_REG_STATE_NONE
			rvCCTerminalSipSetToolkitRegisterState(term,
				RV_TERM_TOOLKIT_REG_STATE_NONE);
			
			//x->terminal = term;	//当前新建的sip终端对象
			//x->audioTermState = RV_CCAUDIOTERM_PASSIVE;
			//x->clbks = clbks;		//NULL
			rvCCTerminalInit(xTerm, term, NULL);
			
			//这三个参数值直接从SIP管理对象的公共配置中获取
			rvCCTerminalSipSetUnregisterExpires( term, sipControl->unregisterExpires);
			rvCCTerminalSipSetClientRegisterExpires(term ,
sipControl->clientRegisterExpires);
			term->registerBeforeExpiresPercent =
				sipControl->registerBeforeExpiresPercent;
			
			//创建注册超时定时器,该定时器的回调函数为
			//registerTimerExpire
			regTimout = rvCCTerminalSipGetRegisterTimeout( term);
			IppTimerConstruct(&term->registerTimer, regTimout, registerTimerExpire,
(void *)xTerm);
			
			//创建sip stack注册客户端对象,并将句柄存储在当前sip终端对中
			rvSipControlRegClientCreateObject( p, xTerm, userScheme, term->localPort, 
			&term->regClientObject);
				//sipMgr. Contact = sipTerm->terminalId
				rvSipControlSetContact(sipMgr,sipTerm->terminalId);
				
				//使用sip stack创建一个注册客户端对象,其中该对象的应用者为
				//当前的xTerm终端对象新创建的sip终端对象。
				RvSipRegClientMgrCreateRegClient(hRegClientMgr,
					(RvSipAppRegClientHandle)xTerm, regClientObj)
				
				//初始化sip stack创建的注册客户端对象
				buildRegClientObject(regClientObj, localAddress, sipMgr->contact,
				expires,scheme, port, sipTerm)
					//构建contactStr字符串
					//构建toStr字符串
					
					//向注册客户端对象设置to字段
					rvSipControlRegClientSetTo(*hRegClient,toStr);
					
					//构建fromStr字符串
					//构建expiresStr字符串
					//构建registrarStr请求行的url字符串
					
					//如果配置了外部代理,则向注册客户端设置外部代理信息
					
					//设置注册客户端对象分离标记,应用程序自身管理call-id字段
					RvSipRegClientDetachFromMgr(*hRegClient);
					
					//获取from、Expires、hContact字段对象句柄
					RvSipRegClientGetNewPartyHeaderHandle(*hRegClient, &hFrom);
					RvSipRegClientGetNewExpiresHeaderHandle(*hRegClient,
					&hExpires);
					RvSipRegClientGetNewContactHeaderHandle(*hRegClient,
&hContact)

//通过上面组成的字符串,通过解析器设置对应的字段对象
					RvSipPartyHeaderParse(hFrom,RV_FALSE, fromStr);
					RvSipContactHeaderParse(hContact, contactStr);
					RvSipExpiresHeaderParse(hExpires, expiresStr);
					
					//将hFrom、hContact、hExpires对象设置到注册客户端对象中
					RvSipRegClientSetFromHeader(*hRegClient, hFrom);
					RvSipRegClientSetContactHeader(*hRegClient, hContact);
					RvSipRegClientSetExpiresHeader(*hRegClient, hExpires);
					
					//向注册客户端对象设置注册请求url
					RvSipRegClientGetNewAddressHandle(*hRegClient, 
						RVSIP_ADDRTYPE_URL,&hRegistrar);
					RvSipAddrParse(hRegistrar, registrarStr);
					rvSipControlSetTransportType(hRegistrar, termTransport);
					RvSipRegClientSetRegistrar(*hRegClient, hRegistrar);
					
					//使用sipExtClbks.regClientCreatedCB回调通知MTF用户层,当
					//注册终端对象已经构建完成,是否用户进行其它处理。
					RvIppSipExtRegClientCreatedCB(*hRegClient);
		
		//将新建的sip终端对象加入到sipProvider的终端列表中
		rvCCProviderSipAddTerminal(provider, t);

//如果用户配置了自动注册,则自动发起注册请求
if ((ipPhone != NULL) && (sipProviderImpl->autoRegister == RV_TRUE))
	//发起注册请求
	sipPhoneRegisterTermToNetwork(mdmTerm, id, type);
		//获取网络provider对象
		p = rvCCBasePhoneGetNetProvider();
		
		//通过用户帐号从sip provider对象中获取已经创建的终端对象
		xTerm = rvCCProviderSipFindTerminalById(p, termId);
		
		//获取sip终端对象
		term = rvCCTerminalSipGetImpl(xTerm);
		
		//获取sip管理对象
		sipControl = rvCCSipPhoneGetSipMgr();
		
		//关联线路终端对象到sip终端对象
		term->mdmXTerm = mdmTerm->xTerm;
		
		//控制注册
		rvSipControlRegisterClient(term);
			//获取sip satack注册客户端句柄
			hRegClient  =rvCCTerminalSipGetRegClientObject(sipTerm);
			
			//更新Expire字段
			rvSipControlRegClientSetExpire(hRegClient, nExpire);
			
			//sipTerm.authRetriesCount = 0
			rvCCTerminalSipSetAuthRetriesCount(sipTerm, 0);
			
			//发起注册
			rvSipControlRegClientSend(hRegClient);
				//获取当前sip stack的注册客户端句柄状态,如果是属于在进行中的					//状态,则直接返回,忽略本次注册处理。
				RvSipRegClientGetCurrentState (hRegClient, &state);
				if ((state != RVSIP_REG_CLIENT_STATE_IDLE) &&……)
					return;
				
				//如果收到服务器401|407要求终端协带鉴权则进行此流程,当前上
				//电发的注册流程不会进行此状态处理。
				if(state == RVSIP_REG_CLIENT_STATE_UNAUTHENTICATED)
					//no thing
				else
					//调用sip stack api将注册请求发出。
					RvSipRegClientRegister(hRegClient);
			
			//如果注册过程中出现网络问题,或者SIP服务器为域名,但没有可用的
			//DNS服务,则检查用户是否设置了循环注册的相关配
//置(persistentRegisterEnabled和persistentRegisterRetryInterval),如果
//用户设置了,则启动重注册定时器,经过persistentRegisterRetryInterval
//周期后再次发起注册。并设置已经启动重新注册的标记。
			if  ((status == RV_ERROR_NETWORK_PROBLEM) || 
(status == ARES_ENDOFSERVERS))
				if (rvSipPersistInRegistering(sipTerm))
					regTimerReStarted = RV_TRUE;
			
			//如果上面条件没有触发周期重注册定时器,则这里仍然启动重注册定时
			//器,只是该定时器的超时时间参考注册周期配置参数的百分比。
			if (regTimerReStarted == RV_FALSE)
				timeout = rvCCTerminalSipGetRegisterTimeout(sipTerm);
				IppTimerStart(&sipTerm->registerTimer,
					IPP_TIMER_RESTART_IF_STARTED, timeout);
		
		//更新正确注册的状态
		//term.networkRegisterState = RV_TERM_NETWORK_REG_TYPE_REGISTERING
		rvCCTerminalSipSetRegType(term, 
			RV_TERM_NETWORK_REG_TYPE_REGISTERING);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值