//该函数为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);
物理端点上电注册分析
最新推荐文章于 2023-12-05 14:15:55 发布