OSIP的核心是系统状态机,在不同的情况下,系统处于不同的状态,在某个状态下系统发生了某个动作后,例如接收或发送消息,状态机就会进行相应的跳转。 的状态机对某些行为的响应因状态而异。
由于SIP的复杂性,为了降低代码实现的难度并保证代码模块化,OSIP将整个SIP的实现分为四个状态机。 分别为:
(1) ICT (带invit事件的out处理) ) ) ) ) ) )。
(2) IST (伴随invit事件的in处理) ) )。
(3) NCT (无invit事件退出处理) ) ) ) ) ) ) )。
(4) NST (无invit事件的in处理) ) ) ) ) ) ) ) ) )。
实际上,1和2是一个团队的连接,1负责一个callout,2负责对应的callin。 3和4也是如此,不同之处在于它们负责没有invite (如通告、订阅)的请求。 下面介绍一下这些状态机。
) ICT callout的状态机。 在系统make a call out时,系统位于该状态机上,该状态机处理1xx、2xx、3xxx等消息,系统的状态机围绕这些消息切换状态。
) IST callin的状态机。 系统接收到invite请求后,系统在该状态机下,在该状态机下,系统发送1xx、2xx的消息。 如您所见,状态机1和2负责控制电话呼叫过程,3和4负责其他非呼叫的状态控制。
)3) NCT无invite的out请求的状态机实际上是NOTIFY等启动invit呼叫的其他状态处理。
)4) NST无invite的in请求的状态机与上面的回应不太能交谈。
这四个状态机的实现基本一致。 理解一个,理解其他三个就没什么问题了。 现在详细说明第一个。 其他的请举出一反三。 如果很难看到这些,建议您先查看RTC3261,熟悉SIP呼叫流程。 这可能有助于了解OSIP状态机。
状态机ICT(inviteclientcallout )的说明
1、说明:
本文的作用是描述终端callout的状态控制,它是osip四个状态机中最重要的,它处理callout的各种事件,包括180、200和timeout。 文件中的函数是发送和接收消息的核心处理函数,可服务于状态机的切换。 其他三个状态机也与此类似。
包括文件: fsm.h、ict_fsm.c、ist_fsm.c、ict.c和ist.c。
状态5个状态机:
ICT_PRE_CALLING
ICT_CALLING
ICT_PROCEEDING
ICT_COMPLETED
ICT_TERMINATED
ICT_PRE_CALLING :
调用前的状态,系统处于准备状态。 系统调用osip_transaction_init函数后,系统将初始化并进入此状态。 在这种状态下,当系统调用ict_snd_invite并发送invte请求时,系统会跳至ICT_CALLING状态。
ICT_CALLING :
已成功发送invit请求,但仍没有来自远方的任何响应时,系统处于此状态。 在这种情况下,在timeouta时间到达时,将发送一条消息,以便对方接收请求包。 timeb时间到达后,系统判断对方没有响应,状态直接跳转到ICT_TERMINATED状态,释放资源完成本次调用。
在这种状态下,系统接收到1xx消息后,如果判断对方有响应,系统会跳至ICT_PROCEEDING状态。
ICT_PROCEEDING :
当系统发送invite时,它将接收对方的响应(100 trying ),系统将跳转到此状态。 成功接收200 OK后,系统将跳至ICT_TERMINATED,并视为单个请求已完成。 如果收到3456xxx等请求,系统会跳至ICT_COMPLETED,将ACK发送给对方(有些不需要发送ACK ),设置timeoutd时间,并等待d时间的到来。
ICT_COMPLETED :
当系统接收到3456xx时,系统向对方发送ACK,系统处于此状态,在timeoutd时间到达后,系统跳转到ICT_TERMINATED状态,完成一次呼叫。
ICT_TERMINATED :
完成调用是状态机的最后一个状态。 状态到达这里,表示状态机的结束,表示调用的结束,无论是否成功,最后都到达这个结束状态。
系统状态切换的函数请参照状态图。 图中没有添加其他几个timout事件函数。 需要知道的事情请自己参照文件。
图1 ICT状态机
图2 sip完全通话捕获
图3 sip呼叫拒绝捕捉包