三、工作过程
1、系统初始化过程。
在OSIP工作之前,必须先初始化,主要有以下几个部分:
(1)系统资源申请,包括资源和链表的处理。
函数:osip_init()
(2)设置系统CALLBACK函数
osip_set_cb_send_message ();//系统的信令发送函数,在这个函数中,要完成信令包的向外发送功能。这个函数在后面会详细的讲。
osip_set_kill_transaction_callback();//设置四个状态机下消息传输失败的处理函数。
osip_set_message_callback();//设置各种状态机下各种事件发生后用户的回调,注意:你可以只设置你需要的,对你不关心的,你可以不设置,那么这些事件发生的时候,系统就不会处理。比如你可以不对1XX消息处理,那么你不对挂1xx事件对挂就可以了。
(3)打开接收远端消息接收通道。
打开通道就是保证远方的消息能够顺利的被本地接收到,然后交给SIPCORE处理,它包括以下几个步骤
Step1:监听端口
打开SIP端口SOCKET,然后监听此端口,如5060。但目前SIP被封杀,所以建议您换一个。需要注意的是,SIP支持TCP和UDP两种方式,请注意这两种方式的不同。
Step2:解析消息
接收到消息后,调用osip_parse函数,来完成对消息包的解析。这个函数完成后,消息就从普通信令消息分解成了OSIP2自己可以理解的消息事件。osip_parse函数在srcosipparser2,应该说是比较复杂的,需要的时候可以自己看代码,但我的建议是,在不需要的时候,没有看这些代码的必要,这些代码中,只有你在深入的时候,才需要理解,如果您是初学,似乎没有这个必要。
Step3:将消息送给SIPCORE处理
解析后的消息,系统调用osip_find_transaction_and_add_event函数,把消息发送给和此消息相关的处理事务(或者说session),如果系统中没有和这个消息相关的session(也就是说是个新的request),那么此时将新建立一个session(或者说transaction,因为在不同层面有不同理解),用于处理新的事务。实际上,这个session创立的过程也就是一个新的系统状态机的建立过程,根据这个消息的种类,osip_transaction_init负责初始化,建立一个新的和种类对应的状态机(四种状态机中的一种),然后调用osip_transaction_add_event把消息扔给这个刚建立起来的状态机处理。一个新的状态机也就开始运做。
到此,OSIP就已经正常工作,可以接收网络来的消息。
2、一个呼叫过程。
下面通过一对呼叫的连接过程说明OSIP的消息的整个处理过程。假设终端A呼叫终端B,两方都是用的OSIPCORE。注意:阅读以下的东西的时候我认为你已经理解了我上面说的东西,并且对OSIP的状态机有了一个比较完整的理解,如果不理解,请先阅读另一篇文挡:osip2的状态机分析。
Stp1:A生成一个Invite消息
这个过程是大家都熟悉的过程,也就是利用本地信息,组建一个SIP包的过程,需要注意的是:rtp流的本地接收发送端口是在这里就建立的,然后放到SDP中。
Step2:A把生成的消息交给核心处理。
首先系统调用osip_transaction_init ,产生一个新的状态机。在发送invite请求的时候,这个状态机是ICT(带invite的client端状态机)。状态机产生后,系统调用函数把消息扔给状态机处理,osip_transaction_add_event负责把消息插到队列中。
Step3:A的ICT状态机调用ict_snd_invite函数发送invite包给对方,状态机自身从初始状态跳转到calling状态,等待对方回应,并设置响应的A超时和B超时,当A超时到达的时候,向对方重发一次数据包,并且把A的时间增加一倍(最长为4S,如果超过4S,将不再增加)。当B时间到达后,系统认为对方没有响应,则释放资源,结束本次操作。
Step4:B的信令监听端口接收到此invite请求包,调用osip_parse函数,来完成对消息包的解析,然后系统调用osip_find_transaction_and_add_event函数来试图把此消息包插入已经存在的session的传输队列(比如系统还有另外一个呼叫),当系统发现当前信令包并不属于已经存在的session的时候,系统认为之是一个新的呼叫过程,因此,系统调用osip_transaction_init函数建立一个新的状态机来处理这个session,这个状态机也就是IST(带invie的server状态机),然后把信令消息插到新状态机的事件列表中,供其处理。
Step5:B的IST处理A的invite请求,自身的状态机从IST_PRE_PROCEEDING跳转到IST_PROCEEDING状态,并发送100消息给对方,调用用户设置的回调函数来完成用户收到请求时候的处理。注意,B应该发两次1XX消息给对方,一个是100,一个是180。因为这两个类似就不写了,下面的状态也一样。
Step6:A收到1xx的回应,自身从ICT_CALLING状态跳转到ICT_PROCEEDING状态,并调用用户的回调函数来完成用户的要求。注意,A会收到B过来的两次1XX消息,参考step5的说明。
Step7:B的用户认可,可以接收A的此次呼叫,B发送调用ist_snd_2xx函数,发送200OK消息给A,B的状态机IST从IST_PROCEEDINGIST_TERMINATED。完成一次IST的服务。
Step8:A接收到2000K,状态机跳转到ICT_TERMINATED状态,完成一个ICT服务。