oSIP协议桟浅析(3)

2019-04-13 23:04

oSIP协议栈浅析

c connection_add(),connection_get(),nettype_get(), addrtype_get(),addr_get(),addr_multicast_ttl_get(), addr_multicast_int_get() bandwidth_add(),bwtype_get(),bandwidth_get() time_descr_add(),start_time_get(),stop_time_get() repeat_add(),repeat_get() adjustments_set(),adjustments_get() key_set(),keytype_get(),keydata_get() attribute_add(),att_field_get(),att_value_get() media_add(),media_get(),port_get(),number_of_port_get(), proto_get(),payload_add(),payload_get(), b t r z k a m

另外,oSIP还包含对SDP包的一些基本操作[set(), get(), init(), parse(), 2char(), free(), clone()],及对各类type的init()和free()操作

2.3.3 URL Parser

这里的URL是指SIP中的URI,URI有很多参数格式,在RFC3261中列举了一些比较例子:

The URIs within each of the following sets are equivalent: sip:alice@atlanta.com;transport=TCP sip:alice@AtLanTa.CoM;Transport=tcp

sip:carol@chicago.com

sip:carol@chicago.com;newparam=5 sip:carol@chicago.com;security=on

sip:biloxi.com;transport=tcp;method=REGISTER?to=sip:bob@biloxi.com sip:biloxi.com;method=REGISTER;transport=tcp?to=sip:bob@biloxi.com

sip:alice@atlanta.com?subject=project x&priority=urgent sip:alice@atlanta.com?priority=urgent&subject=project x

The URIs within each of the following sets are not equivalent:

SIP:ALICE@AtLanTa.CoM;Transport=udp (different usernames) sip:alice@AtLanTa.CoM;Transport=UDP

sip:bob@biloxi.com (can resolve to different ports) sip:bob@biloxi.com:5060

Page 10

oSIP协议栈浅析

sip:bob@biloxi.com (can resolve to different transports) sip:bob@biloxi.com;transport=udp

sip:bob@biloxi.com (can resolve to different port and transports) sip:bob@biloxi.com:6000;transport=tcp

sip:carol@chicago.com (different header component) sip:carol@chicago.com?Subject=next meeting

sip:bob@phone21.boxesbybob.com (even though that's what

sip:bob@192.0.2.4 phone21.boxesbybob.com resolves to)

在oSIP中处理SIP URI有比较多的操作函数提供,主要有对

host,port,username,password, scheme的get()和set(),以及对参数的初始化设置和剖析处理。详细函数名称请参考源代码中的url.h。

2.4 工具(Facilities)模块

2.4.1 SDP negotiator

SDP协商工具(SDP negotiator)帮助end point提供协商codec等功能

2.4.2 Dialog management

对话管理工具(Dialog management)是oSIP提供的一个比较强大的辅助工具,主要用于有能力应答呼叫的end point。

对话管理工具(Dialog management)能够帮助记录请求和响应消息,利用这

个工具使end point能够快速准确的作出应答。

3. oSIP特点

3.1 oSIP的优点

? Osip没有给开发者限定在特定的某个执行模式下,能够使开发者选定一

个比较适合自己的模式。

? Osip的各个模块是相对清晰、独立的,因而去掉某个模块时也比较容易。

Page 11

oSIP协议栈浅析

? Osip的解析器提供了较为完善的API,包含了消息的构造、修改和产生

等。

3.2 oSIP的缺点

?

oSIP目前版本源代码结构、定义比较混乱,并且缺乏文档,阅读比较困难;该问题将在oSIP2中得到改善。

?

oSIP不提供任何快速产生请求消息和响应消息的方法,所有请求消息和响应消息的形成必须调用一组sip message api来手动组装完成,关于这方面的缺陷,osip作者可能在以后会开发一个eXoSIP的API来完成。

?

由于oSIP结构简单,外围相关模块需要用户自己开发,如SIP消息的接收和发送,RTP/RTCP的语音数据的处理等。

4. oSIP应用结构图

Receive/Send SIP Messages Receive/Send RTP/RTCP ⑦ B Main thread Application ② Transaction Context 解析器模块 SIP parser URL parser SDP parser ⑤ A ④ Finite State Machines 状态机模块 ⑥ ③ ① oSIP Instance 工具模块(可选项) Dialogue Facilities SDP negotiation Facilities oSIP模块 图4-1 oSIP应用

Page 12

oSIP协议栈浅析

其中: ①:初始化oSIP和注册CALL BACK函数; ②:添加事件A; ③:执行事务 ④:取消事件A ⑤:解析消息 ⑥:触发CALL BACK函数 ⑦:接收/发送消息 A:保存状态 B:接收/发送语音包

5. oSIP使用概述

5.1 初始化oSIP

在使用oSIP前必须先初始化oSIP,主要调用函数osip_global_init()和osip_init(),具体操作代码如下:

osip_t *osip;

// initialise internal element first

if (0!=osip_global_init())

return -1;

// allocate a global osip element.

if (0!=osip_init(&osip))

return -1;

5.2 注册CALL BACK函数

需要注册的call back函数主要包含发送消息、结束事务、发送失败、4个状态机(ICT、NICT、IST、NIST)相关函数。 注册发送消息的CALL BACK函数:

osip_setcb_send_message(osip, &application_cb_snd_message); 注册结束事务的CALL BACK函数:

osip_setcb_ict_kill_transaction(osip,&application_cb_ict_kill_transaction);

osip_setcb_ist_kill_transaction(osip,&application_cb_ist_kill_transaction);

osip_setcb_nict_kill_transaction(osip,&application_cb_nict_kill_transaction);

osip_setcb_nist_kill_transaction(osip,&application_cb_nist_kill_transaction);

Page 13

oSIP协议栈浅析

注册发送失败的CALL BACK函数:

osip_setcb_ict_transport_error(osip,&application_cb_transport_error); osip_setcb_ist_transport_error(osip,&application_cb_transport_error); osip_setcb_nict_transport_error(osip,&application_cb_transport_error); osip_setcb_nist_transport_error(osip,&application_cb_transport_error);

注册ICT、NICT、IST、NIST CALL BACK函数

osip_setcb_ict_2xx_received2(osip,&application_cb_rcvresp_retransmission); osip_setcb_ict_3456xx_received2(osip,&application_cb_rcvresp_retransmission); osip_setcb_ict_invite_sent2(osip,&application_cb_sndreq_retransmission); osip_setcb_ist_2xx_sent2(osip,&application_cb_sndresp_retransmission); osip_setcb_ist_3456xx_sent2(osip,&application_cb_sndresp_retransmission); osip_setcb_ist_invite_received2(osip,&application_cb_rcvreq_retransmission); osip_setcb_nict_2xx_received2(osip,&application_cb_rcvresp_retransmission); osip_setcb_nict_3456xx_received2(osip,&application_cb_rcvresp_retransmission); osip_setcb_nict_request_sent2(osip,&application_cb_sndreq_retransmission); osip_setcb_nist_2xx_sent2(osip,&application_cb_sndresp_retransmission); osip_setcb_nist_3456xx_sent2(osip,&application_cb_sndresp_retransmission); osip_setcb_nist_request_received2(osip,&application_cb_rcvreq_retransmission); osip_setcb_ict_invite_sent (osip,&application_cb_sndinvite); osip_setcb_ict_ack_sent (osip,&application_cb_sndack); osip_setcb_nict_register_sent(osip,&application_cb_sndregister); osip_setcb_nict_bye_sent (osip,&application_cb_sndbye); osip_setcb_nict_cancel_sent (osip,&application_cb_sndcancel); osip_setcb_nict_info_sent (osip,&application_cb_sndinfo); osip_setcb_nict_options_sent (osip,&application_cb_sndoptions); osip_setcb_nict_subscribe_sent (osip,&application_cb_sndoptions); osip_setcb_nict_notify_sent (osip,&application_cb_sndoptions);

osip_setcb_nict_unknown_sent(osip,&application_cb_sndunkrequest); osip_setcb_ict_1xx_received(osip,&application_cb_rcv1xx); osip_setcb_ict_2xx_received(osip,&application_cb_rcv2xx); osip_setcb_ict_3xx_received(osip,&application_cb_rcv3xx); osip_setcb_ict_4xx_received(osip,&application_cb_rcv4xx); osip_setcb_ict_5xx_received(osip,&application_cb_rcv5xx); osip_setcb_ict_6xx_received(osip,&application_cb_rcv6xx); osip_setcb_ist_1xx_sent(osip,&application_cb_snd1xx); osip_setcb_ist_2xx_sent(osip,&application_cb_snd2xx); osip_setcb_ist_3xx_sent(osip,&application_cb_snd3xx); osip_setcb_ist_4xx_sent(osip,&application_cb_snd4xx); osip_setcb_ist_5xx_sent(osip,&application_cb_snd5xx);

Page 14

oSIP协议栈浅析

osip_setcb_ist_6xx_sent(osip,&application_cb_snd6xx);

osip_setcb_nict_1xx_received(osip,&application_cb_rcv1xx); osip_setcb_nict_2xx_received(osip,&application_cb_rcv2xx); osip_setcb_nict_3xx_received(osip,&application_cb_rcv3xx); osip_setcb_nict_4xx_received(osip,&application_cb_rcv4xx); osip_setcb_nict_5xx_received(osip,&application_cb_rcv5xx); osip_setcb_nict_6xx_received(osip,&application_cb_rcv6xx); osip_setcb_nist_1xx_sent(osip,&application_cb_snd1xx); osip_setcb_nist_2xx_sent(osip,&application_cb_snd2xx); osip_setcb_nist_3xx_sent(osip,&application_cb_snd3xx); osip_setcb_nist_4xx_sent(osip,&application_cb_snd4xx); osip_setcb_nist_5xx_sent(osip,&application_cb_snd5xx); osip_setcb_nist_6xx_sent(osip,&application_cb_snd6xx);

osip_setcb_ist_invite_received (osip,&application_cb_rcvinvite); osip_setcb_ist_ack_received (osip,&application_cb_rcvack); osip_setcb_ist_ack_received2 (osip,&application_cb_rcvack2); osip_setcb_nist_register_received(osip,&application_cb_rcvregister); osip_setcb_nist_bye_received (osip,&application_cb_rcvbye); osip_setcb_nist_cancel_received (osip,&application_cb_rcvcancel); osip_setcb_nist_info_received (osip,&application_cb_rcvinfo); osip_setcb_nist_options_received (osip,&application_cb_rcvoptions); osip_setcb_nist_subscribe_received(osip,&application_cb_rcvoptions); osip_setcb_nist_notify_received (osip,&application_cb_rcvoptions);

osip_setcb_nist_unknown_received (osip,&application_cb_rcvunkrequest);

5.3 Transaction操作

在注册完CALL BACK函数后,应用程序可以建立Transaction来调用oSIP的解析器和状态机模块的操作,来实现不同应用程序的需求。

6. 参考

[1] SIP -- RFC3261

(http://www.ietf.org)

[2] SDP -- RFC2327(http://www.ieft.org) [3] oSIP Library

-- http://www.gnu.org/software/osip/

[4] oSIP mailing list -- http://www.atosc.org/pipermail/public/osip/

Page 15


oSIP协议桟浅析(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:Transmission+Flexget实现RSS自动下载

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: