在Vovida的基础上实现自己的SIP协议栈②( 七 )



我们来看Diagram.7
1> 在A阶段当启动Redirection Server(RS)的时候 , RS向Provisioning Server(PS)发送SubScribe消息 , 取得合法的用户列表;
2> 在B阶段 , UA端向Marshal Server发送Register消息 , 以确认自己是否在合法用户列表内;
3> 在C阶段 , RS将通过Subscribe/Notify命令对把该用户的呼叫特性列表(呼叫等待 , 呼叫转接 , 语音邮件 , 呼叫前转 , 禁止呼叫等信息)得到该用户的呼叫特性;
我们在Redirection Server这一章内将具体介绍Subscribe/Notify命令对 。
2.6.4 监测线程:
一个调用的RUN方法loadGenThread->run是一个监测线程 , 检查各种回应和请求消息 , 并记录在LOG文件中 。
2.6.5 自动呼叫
在loadGenThread->run后面的程序实现了一个自动在预定时间内发送INVITE消息的过程 , 大家有爱好可以参看OpAutoCall类 , 当在UserAgent::Run()中通过检测Cfg文件 , 通过setLoadGenSignalType(LoadGenStartCall)设定了一个公共变量以后 , 我们可以发现系统将自动进入OpAutoCall操作 , 并且启动INVITE开始呼叫 。

好了 , 通过上面的介绍后我们需要知道如何让系统进入Idle状态 , 在这个状态中系统处于一种"等待"的状态 , 接收本地的命令输入 , 和远端的消息;这个状态是所有后续状态的一个初始阶段 , 在上述程序中我们可以在processSipEvent过程中找到handleCallWaiting子程序 , 就在该过程中让系统进入Idle状态;见下面的程序:
… …
if ( UaConfiguration::instance()->getLoadGenOn() )
{
callInfo->setState
( stateMachine->findState( "StateAutoIdle" ) );
}
else // LoadGen is off
{
if( handleCallWaiting( callInfo ) )
{
return true;
}
… …
(未完待续)

推荐阅读