oSIP协议栈(及eXoSIP,Ortp等)使用入门[1]
eXosip简例

eXosip简例1. 从利用eXosip的注册开始int i;char identity[50]; char registerer[50]; char localip[128]; static int flag = 0; int id;eXosip_guess_localip (AF_INET, localip, 128);sprintf(identity,\ sprintf(registerer,\//初始化 if( flag == 0) {i = eXosip_init(); if (i != 0) {return -1; }TRACE(\ flag ++;i = eXosip_listen_addr(IPPROTO_UDP, NULL, 5060, AF_INET, 0); if (i != 0) {eXosip_quit();fprintf(stderr, \ return -1; }TRACE(\ }osip_message_t *reg = NULL;eXosip_lock();id = eXosip_register_build_initial_register (identity,registerer, NULL, 1800, ®); printf(\if (id < 0) {eXosip_unlock();fprintf (stderr, \ return 0; }eXosip_lock();i = eXosip_register_send_register(id, reg); if (i != 0) {fprintf (stderr, \ return 0; } eXosip_unlock ();TRACE(\eXosip_event_t *je; for (;;) {je = eXosip_event_wait (0, 50);eXosip_lock();eXosip_automatic_action (); eXosip_unlock();if (je == NULL) {continue; }if (je->type == EXOSIP_REGISTRATION_SUCCESS) {TRACE(\ return 1; break; }if(je->type == EXOSIP_REGISTRATION_FAILURE) {//注册失败之后,再次提交授权信息,也可放在上面eXosip_add_authentication_info(username, username,password, NULL,NULL); }if(je->type == EXOSIP_REGISTRATION_REFRESHED) {TRACE(\ return 0; } }eXosip_quit();eXosip_guess_localip (AF_INET, localip, 128);这句在eXosip中的实现为eXosip_guess_localip (int family, char *address, int size)address在函数体外首先进行定义为一数组,分配好空间,再给形式参数传指针过去,在函数体内对实际参数address赋值。
osip exosip 框架

Osip协议源代码框架详解Revision History目录1符号及缩写 (4)2整体描述 (4)3OSIP包的源代码框架解析 (5)3.1 OSIP的TRANSACTION的EVENT的产生 (5)3.1.1 定时器事件的产生过程 (6)3.1.2 报文触发的事件 (6)3.2 OSIP 的TRANSACTION的EVENT处理流程 (7)3.2.1 ICT的处理流程 (7)3.2.2 IST的处理流程 (9)3.2.3 NICT的处理流程 (9)3.2.4 NIST的处理流程 (9)3.3 O SIP报文的解析 (9)3.3.1 sip协议报文的解析整理流程 (9)3.3.2 Osip报文头的解析 (12)3.3.3 uri的解析 (13)3.3.4 添加一个新的协议header字段 (14)3.4 OSIP的TRANSACTION的管理 (15)3.5 OSIP中DIALOG的管理 (18)4EXOSIP包的源代码框架解析 (19)4.1 L IB库的初始化和销毁 (19)4.2 L IB库的主处理线程 (23)4.2.1 2xx应答的重发处理机制 (23)4.2.2 Exosip_execute执行流程 (23)4.2.2.1 Exosip_read_message的处理 (25)4.2.2.2 eXosip_process_response_out_of_transaction的处理流程: (28)4.2.3 eXosip_automatic_action处理流程 (28)4.3 C ALL的处理 (29)4.3.1 创建Call的第一个INVITE (29)4.3.2 INVITE的ACK应答的创建和发送 (31)4.3.3 dialog内的请求的创建和发送 (31)4.3.4 Dialog内answer的创建和发送 (32)4.4 R EGISTER的处理 (33)4.4.1 向一个服务器第一次注册 (33)4.4.2 调整一个注册的注册超时时间 (33)4.4.3 发送一个register注册 (33)Osip源代码框架详解1符号及缩写2整体描述开源代码的osip协议栈分为两个源代码包,整个协议栈采用lib库的形式,在内部没有使用到任务,采取与TCP/IP协议栈一样的策略,所以在使用上需要上层管理任务直接调用lib库提供的接口。
libexosip tls用法

libexosip是一个开源的SIP协议栈,用于构建基于SIP协议的通信应用程序。
其中,libexosip提供了对TLS(Transport Layer Security)安全传输协议的支持,可以保障SIP信令的安全传输。
本文将介绍libexosip中TLS的使用方法,包括TLS的配置和使用步骤。
一、TLS的配置1.1、安装OpenSSL在使用libexosip进行TLS通信之前,首先需要安装OpenSSL库。
OpenSSL是一个强大的安全套接字层密码库,提供了数据加密、数据完整性验证和身份验证等功能。
在Linux系统上,可以通过包管理工具直接安装OpenSSL库:```shell$ sudo apt-get install libssl-dev```在Windows系统上,可以通过从OpenSSL全球信息湾下载相应的安装包,并按照提示进行安装。
1.2、配置libexosip在使用libexosip进行TLS通信之前,需要在编译libexosip时启用TLS支持。
可以通过在configure脚本中添加--enable-tls选项来启用TLS支持:```shell$ ./configure --enable-tls$ make$ make install```通过以上操作,就可以在libexosip中启用TLS支持了。
二、TLS的使用步骤2.1、加载证书在使用libexosip进行TLS通信时,需要加载服务器端的证书和私钥。
证书用于验证服务器的身份,私钥则用于对通信进行加密。
在libexosip中,可以通过以下代码加载证书和私钥:```cosip_tls_ctx_t *tls_ctx;tls_ctx = osip_tls_ctx_new (osip, "path_to_certificate","path_to_private_key");```其中,osip是osip库的句柄,"path_to_certificate"是服务器端证书的路径,"path_to_private_key"是服务器端私钥的路径。
SIPP 简单说明

SIPp的安装与使用第一章SIPp介绍SIPp是一个测试SIP协议性能的工具软件。
这是一个GPL的开放源码软件。
它包含了一些基本的SipStone用户代理工作流程(UAC和UAS),并可使用INVITE和B YE建立和释放多个呼叫。
它也可以读XML的场景文件,即描述任何性能测试的配置文件。
它能动态显示测试运行的统计数据(呼叫速率、信号来回的延迟,以及消息统计)。
周期性地把CSV统计数据转储,在多个套接字上的TCP和UDP,利用重新传输管理的多路复用。
在场景定义文件中可以使用正规表达式,动态调整呼叫速率。
SIPp可以用来测试许多真实的SIP设备,如SIP代理,B2BUAs,SIP媒体服务器,SIP/x 网关,SIP PBX,等等,它也可以模仿上千个SIP代理呼叫你的SIP系统。
关于SIPp从google上搜索到很多,可是关于SIPp的中文说明资料较少,或者很多都是不齐全的安装使用说明。
SIPp的网址:/SIPp的下载地址:/project/showfiles.php?group_id=104305&package_id=119322(当我已经在使用rc6的时候,rc8已经出来了,|||-.-)SIPp的四种安装方法:1) 没有TLS支持与密码验证支持:a) # tar -xvf sipp-1.1rc6.tar.gzb) # cd sipp-1.1.rc6c) # makeMake出来的sipp文件就是一个可执行的文件,只需要搭配场景xml文件与csv文件即可进行SIP测试2) 拥有TLS支持与密码验证支持,但是不支PCAP语音播放:a) # tar -xvf sipp-1.1rc6.tar.gzb) # cd sipp-1.1.rc6c) # make ossl这样编译出来的文件就加入了TLS至于与密码验证支持功能sipp软件了。
3) 支持PCAP Play,但是没有密码验证支持:(PCAP Play即为可以进行RTP语音,但是没有407 AUTH验证)a) # tar -xvf sipp-1.1rc6.tar.gzb) # cd sipp-1.1.rc6c) # make pcapplay4) 支持PCAP 声音文件播放,而且支持密码验证支持:(支持407 auth验证支持)a) # tar -xvf sipp-1.1rc6.tarb) # cd sipp-1.1.rc6c) # make pcapplay_ossl最新消息:使用sipp-1.1rc6后,如果采用pcap方式发包播放后,通过抓包抓不到session 的消息体。
osip协议栈

正文第一章SIP协议SIP协议是用于发起、控制和终结多媒体会话的信令协议。
它被IETF( )以rfc2543发表。
SIP是IETF致力于将电话服务带入IP网络众多协议的一个组成部分(它与SDP、RTP、RTCP、RTSP、RSVP、TRIP等众多协议构成SIP系统协议栈)。
其将要变成正在发展的IP电话——这个朝气蓬勃的电信工业——的标准之一。
正如同电子邮件协议一样,SIP将会变得越来越普及和大众化… …SIP独立与媒体传统电话使用一种媒体编码个师通讯(正如被我所熟知的时隙和PCM概念)。
现在,这种方式将被终结。
我们的电话可以以不同的质量保证和不同的编码方法连接电视、连接摄像机、连接其他电话进行通信。
SIP具有媒体协商等功能。
任何多媒体应用(例如:游戏、远程教学)都可以使用SIP来建立会话。
SIP独立于传输层SIP并不和任何的传输层紧密结合。
这一构思将使得SIP在第三代网络中受到最小的互操作影响。
无线电话的要求(例如漫游功能)同样被关心。
SIP完美的构思,使得其适合作为新蜂窝电话时代的信令协议。
SIP有很好的扩展性在rfc2543中定义了6种类型的事务(INVITE,BYE,CANCEL… …)。
这些事务被用于媒体协商、创建、修改和终结呼叫。
许多其它的服务已经提供这些方式(例如H.323系统),但SIP以其为扩展性为目的设计和事务模型重用(对于服务器是透明的,被用于使用新类型事务创建辅助服务)。
下面是可能的服务列表,其中的一些已经被实现。
短信,用于实时信息预定或通告,用于会议管理委托,用于呼叫转移等管理SIP和最终用户服务“SIP透明支持名字映射和重定向服务,提供ISDN和智能网络电话服务同样的一些功能。
这些特性也使得个人移动成为可能。
”参考阅读:rfc2543.txt(章节1.1)SIP服务器被用于定位用户和分发请求的用户定位信息。
这些途径,使得最终用户代理发起很少的请求,并能获得多种多样的服务。
TCPIP网络协议族简单的入门自学手册(内有详细实验结果).

By 韩大卫 @ 吉林师范大学主要学习TCP/IP协议族中传输层,网络层,链路层的协议。
总体思想:网络间的数据传输是在链路层间实现的, 用户层的数据如果想进入链路层, 要经过逐层封装, 最后封装成以太网帧格式进行发送,这样将不同的数据都包装成以太网帧,实现了在不同网络的数据互联和通信。
例如:一个用户层数据 data经过传输层TCP协议 data经过网络层IP协议TCP协议 data链路层以太网祯首部IP协议TCP协议 data CRC以太网帧格式: 目的MAC地址(6字节源MAC地址(6字节帧类型(2字节data(46——1500CRC(4字节常见帧类型:0800: IP协议0806: ARP协议IP报文格式:4bit协议格式 4bit首部长度8bit TOS16bitIP报文总长度16bitIP报文标志16bit分片信息8bitTTL8bit上层协议16bit检验和32bit源IP地址32bit目的IP地址data上层协议:06: TCP协议01: ICMP协议17:UDP协议TCP段格式:16bit源端口号16bit目的端口号32bit序列号32bit确认序号4bitTCP首部长度 6bit保留 6bit标志位。
ACK 。
SYN FIN16bit窗口大小16bit检验和16bit紧急指针可选项dataUDP段格式:16bit源端口号16bit目的端口号16bitUDP长度16bit检验和dataTCP是面向连接的协议,UDP是面向不连接的协议。
TCP: 提供可靠的,有连接的传输UDP:提供不可靠的,无连接的传输TCP是面向连接的协议, 所以在双方通信前要建立连接, 建立连接的过程分为三部,简称三次握手: 第一次: A 发送 SYN,1000(0,mss<1460>第二次: B 发送 SYN, 8000(0,ACK 1001, mss<1024>第三此:A发送 ACK 8001从TCP状态迁移图中得知, 这个过程中客户端的状态变化是:CLOSED----SYS_SENT----ESTABLISHED服务器端:CLOSED----LISTEN----SYS_RCVD----ESTABLISHED实例:IP 192.168.10.50.50258 > 123.125.115.43.80: Flags [S], seq 2916403917, win 14600, options [mss 1460,sackOK,TS val 1163706 ecr 0,nop,wscale 4], length 0 0x0000: 0022 3f11 74b2 ac81 1250 b016 0800 4500 ."?.t....P....E.0x0010: 003c 0b77 4000 4006 75c2 c0a8 0a32 7b7d .<.w@.@.u....2{}0x0020: 732b c452 0050 add4 cacd 0000 0000 a002 s+.R.P..........//a012 得知, SYN置位0x0030: 3908 b9b1 0000 0204 05b4 0402 080a 0011 9...............0x0040: c1ba 0000 0000 0103 0304 ..........本机向目的IP发送SYN(注: 如看不懂tcpdump 的输出结果,请看文档尾部的解释。
网络协议知识:SIP协议的基本工作流程和通信过程
网络协议知识:SIP协议的基本工作流程和通信过程SIP协议的基本工作流程和通信过程SIP协议(Session Initiation Protocol)是一种用于建立、修改和终止多媒体传输会话的信令协议。
它被广泛地应用于互联网电话(VoIP)、视频会议、实时文本等领域。
在本文中,我们将介绍SIP协议的基本工作流程和通信过程。
一、SIP协议的基本工作流程SIP协议的基本工作流程包括会话描述、会话建立、呼叫传送和会话终止四个部分。
1.会话描述在建立会话之前,需要先进行会话描述,包括会话类型、参与者、所需资源和传输协议等信息。
这些信息被包含在SIP消息中,由发送者向接收者发送。
2.会话建立会话建立是SIP协议的核心部分,它分为两个阶段:呼叫请求和呼叫响应。
(1)呼叫请求:呼叫请求由客户端发起,它包含了所需资源和参与者的信息。
首先,客户端需要向第三方服务器发送INVITE消息,请求建立一次会话。
在INVITE消息中,需要包含被叫方的地址信息、消息头部信息和描述被呼叫方资源的SDP(Session Description Protocol)。
(2)呼叫响应:被呼叫方在收到INVITE消息之后,会返回一个响应。
响应分为三种:1xx、2xx和3xx+。
其中,1xx表示正在进行中,2xx表示成功建立,3xx+表示需要重定向。
“成功建立”的响应会包含会话描述信息,即SDP。
在响应中,还可以通过Location字段告知客户端新的地址信息。
3.呼叫传送呼叫传送是会话建立之后,实际传输媒体数据的阶段。
SIP协议支持多种传输协议,包括UDP、TCP和TLS等。
在呼叫传送消息过程中,需要用到RTCP(Real-time Transport Control Protocol)和RTP (Real-time Transport Protocol)协议进行音视频流传输控制。
4.会话终止当一次会话结束时,需要发送一个BYE消息。
BYE消息用于释放会话资源,并告知接收方会话已经结束。
自己动手写SIP协议栈
自己动手写SIP协议栈首先,SIP协议栈需要实现SIP协议的各个功能,包括请求和响应的解析与生成、消息的路由和转发、状态维护、媒体的协商与传输等。
以下是一个简单的SIP协议栈的实现步骤:1.理解SIP协议:阅读SIP协议的官方文档和RFC标准,了解SIP协议的语法、语义以及各个消息的格式和含义。
2. 实现SIP消息的解析与生成:根据SIP协议的规范,实现对SIP请求和响应消息的解析和生成功能,包括解析消息头、解析和生成SIP URI、解析和生成SDP(Session Description Protocol)等。
3.实现SIP消息的路由与转发:根据SIP消息的目的地址,实现对SIP消息的路由功能,将消息转发到正确的目的地。
4.实现SIP会话的状态维护:根据SIP协议定义的各个状态和状态转换规则,实现SIP会话的状态维护功能,包括会话的建立、修改和终止。
5.实现媒体协商与传输:SIP协议通常用于建立多媒体会话,如音频或视频通话。
实现SIP协议栈的媒体协商与传输功能,包括与对方进行媒体协商、建立媒体通道、传输媒体数据等。
6.实现网络通信功能:SIP协议栈需要与网络进行通信,接收和发送SIP消息。
实现底层的网络通信功能,包括建立和维护TCP或UDP连接、接收和发送SIP消息等。
7.调试和测试:在实现完SIP协议栈的各个功能后,进行调试和测试,确保SIP协议栈的正确性和稳定性。
以上只是一个简单的实现步骤,实际的SIP协议栈实现可能更加复杂。
在实现过程中,还需要考虑对SIP协议的各种拓展和扩展,如支持SIP中的各种扩展头、支持SIP的安全性等。
总结起来,实现一个SIP协议栈是一个非常复杂的任务,需要对SIP协议有深入的理解,并具备底层网络通信的知识。
在实现过程中,需要遵循SIP协议的规范,并进行充分的调试和测试,以确保SIP协议栈的正确性和稳定性。
exosip osip 交叉编译
exosip和osip是两种常用于SIP(会话初始协议)协议栈实现的开源软件库,它们可以帮助开发人员在其应用程序中实现基于SIP协议的通信功能。
在某些情况下,由于开发环境的限制,我们可能需要进行交叉编译来将这些库移植到不同的评台上,本文将重点介绍如何使用交叉编译工具来将exosip和osip库移植到目标评台上。
1. 了解交叉编译的基本概念在开始介绍如何进行exosip和osip库的交叉编译之前,我们首先需要了解一些基本的概念。
交叉编译是指在一种评台上开发、编译出在另一种不同的评台上运行的应用程序的过程。
在实际应用中,我们可能需要在PC机上编译出在嵌入式评台上运行的程序,这就需要用到交叉编译工具链。
2. 准备交叉编译工具链在进行交叉编译之前,我们需要先准备好交叉编译工具链。
交叉编译工具链包括交叉编译器、交叉连接器、交叉汇编器等,它们用于将源代码编译成目标评台上可执行的程序。
可以从官方全球信息湾或者第三方渠道下载已经编译好的交叉编译工具链,也可以自行编译搭建交叉编译环境。
3. 配置编译环境在准备好交叉编译工具链之后,我们需要配置编译环境,以便将exosip和osip库移植到目标评台上。
配置编译环境包括设置交叉编译器的路径、指定目标评台的系统类型、设置编译选项等。
具体的配置步骤和方法可以参考官方文档或者相关的教程。
4. 下载源代码在配置好编译环境之后,我们需要下载exosip和osip库的源代码,这些源代码通常是以压缩包的形式发布在官方全球信息湾上,也可以从版本控制系统如Git、SVN等获取最新的源代码。
下载源代码后,我们需要解压缩并进行一些基本的配置。
5. 编译和安装在下载和配置完源代码之后,我们可以使用交叉编译工具链来编译和安装exosip和osip库。
编译和安装过程通常包括配置编译选项、执行编译命令、进行单元测试、安装到目标系统等步骤。
在编译和安装过程中可能会遇到一些依赖库缺失、编译错误等问题,这就需要我们根据具体情况进行调试和解决。
exosip2 原理
exosip2 原理exosip2是一种用于实现SIP(会话初始协议)的开源库,它提供了一系列的API函数,使开发者能够轻松地构建基于SIP的应用程序。
本文将详细介绍exosip2的原理及其在通信领域的应用。
exosip2库是基于osip(开源SIP协议栈)库开发的,它提供了更高级别的抽象和功能,可以简化SIP应用程序的开发过程。
exosip2库的核心原理是对SIP协议进行封装和解析,以便于应用程序进行SIP消息的发送和接收。
exosip2库的主要功能包括SIP会话的建立、终止和管理,SIP消息的发送和接收,以及SIP协议的解析和处理。
它提供了一组API函数,使开发者可以方便地创建SIP会话、发送SIP消息,并处理收到的SIP消息。
exosip2库的使用流程一般分为以下几个步骤:1. 初始化:首先需要调用exosip_init函数进行库的初始化,该函数将建立与SIP服务器的连接并初始化相关资源。
2. 注册:通过调用exosip_register函数,可以向SIP服务器注册用户,以便接收来自其他用户的呼叫请求。
3. 呼叫:通过调用exosip_call函数,可以向其他用户发起呼叫请求。
在呼叫请求中需要指定被叫方的SIP地址。
4. 接听:当收到其他用户的呼叫请求时,exosip2库将自动触发一个事件,应用程序可以通过注册相应的回调函数来处理此事件。
在呼叫请求事件中,应用程序可以选择接听呼叫或拒绝呼叫。
5. 通话:一旦呼叫被接听,应用程序可以通过exosip_call_ack函数发送一个ACK消息,表示通话已建立。
在通话过程中,应用程序可以通过exosip_call_send_request函数发送音频数据,并通过exosip_call_recv_request函数接收对方发送的音频数据。
6. 结束:通话结束后,需要调用exosip_call_end函数来终止通话并释放相关资源。
exosip2库的使用可以帮助开发者快速构建基于SIP的应用程序,例如VoIP(网络电话)、实时视频通话、即时消息等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
oSIP协议栈(及eXoSIP,Ortp等)使用入门2007年09月26日星期三 14:16一直没空仔细研究下oSIP,最近看到其版本已经到了3.x版本,看到网上的许多帮助说明手册都过于陈旧,且很多文档内容有点误人子弟的嫌疑~~Linux下oSIP的编译使用应该是很简单的,其Install说明文档里也介绍的比较清楚,本文主要就oSIP在Windows平台下VC6.0开发环境下的使用作出描述。
虽然oSIP的开发人员也说明了,oSIP只使用了标准C开发库,但许多人在Windows下使用oSIP时,第一步就被卡住了,得不到oSIP的LIB库和DLL库,也就没有办法将oSIP使用到自己的程序中去,所以第一步,我们将学习如何得到oSIP的静态和动态链接库,以便我们自己的程序能够使用它们来成功编译和执行我们的程序。
第一阶段:------------------------------------------------------先创建新工程,网上许多文档都介绍创建一个Win32动态链接库工程,我们这里也一样,创建一个空白的工程保存。
同样,将oSIP2版本3.0.1 src目录下的Osipparser2目录下的所有文件都拷到我们刚创建的工程的根目录下,在VC6上操作:Project-AddToProject-Files将所有的源程序和头文件都加入到工程内,保存工程。
这时,我们可以尝试编译一下工程,你会得到许多错误提示信息,其内容无非是找不到osipparser2/xxxxx.h头文件之类。
处理:在Linux下,我们一般是将头文件,lib库都拷到/usr/inclue;/usr/lib之类的目录下,c源程序里直接写#i nclude <xxx.h>时,能直接去找到它们,在VC里,同样的,最简单的方法就是将oSIP2源码包中的Include目录下的osipparser2目录直接拷到我们的Windows下默认包含目录即可,这个目录在VC6的Tool-Options-Directories里设置,(当然,如果你知道这一步,也可以不用拷贝文件,直接在这里把oSIP源码包所在目录加进来就可以了),默认如果装在C盘,目录则为C:\Program Files\Microsoft Visual Studio\VC98\Include。
这时,我们再次编译我们的工程,顺利编译,生成osipparser2.dll,这时,网上很多文档里可能直接就说,这一步也会生成libs目录,里面里osipparser2.lib文件,但我们这里没有生成:)最简单的方法,不用深究,直接再创建一个工程,同上述创建动态链接库方法,创建一个Win32静态链接库工程,直接编译,即可得到osipparser2.lib。
------------------------------------------------------上面,我们得到了Osip的解析器开发库,下面再编译完整的Osip协议栈开发库,同样照上述方法,分别创建动态链接库工程和静态链接库工程,只是要拷的文件换成src下的osip目录下文件和include下的osip目录,得到osip2.dll和osip2.lib。
在编译osip2.dll这一步可能会再次得到错误,内容含义是找不到链接库,所以,我们要把前面编译得到的osipparser2.lib也拷到osip工程目录下,并在VC6中操作:Project-Setting-Link中的Object/LibraryModules:kernel32.lib user32.lib ... xxx.lib之类的内容最后增加: osipparser2.lib保存工程后再次编译,即可成功编译osip2.dll。
------------------------------------------------------至此,我们得到了完整的oSIP开发库,使用时,只需在我们的程序里包含oSIP的头文件,工程的链接参数里增加osipparser2.lib和osip2.lib即可。
------------------------------------------------------下面我们验证一下我们得到的开发库,并大概了解一下OSIP的语法规范。
在VC里创建win32控制台程序工程,将libosip源码包的SRC目录下的Test 目录内的C源程序随便拷一个到工程时,直接编译(工程设置里照前文方法在link选项里增加osip2.lib,osipparser2.lib引用我们之前成功编译得到的静态库文件)就可以运行(带参数运行,参数一般为一个文本文件,同样从Test 目录的res目录里拷一个与源文件同名的纯文本文件到工程目录下即可)。
该目录下的若干文件基本上是测试了Osip的一些基本功能函数,例如URI 解析之类,可以大概了解一下oSIP的语法规范和调用方法,同时也能校验一下之前编译的OSIP开发库能否正常使用,成功完成本项工作后,可以进入下一步具体的oSIP的使用学习了。
------------------------------------------------------由于oSIP是比较底层的SIP协议栈实现,新手较难上手,而官方的示例大都是一些伪代码,需要有实际的例子程序参考学习,而最好的例子就是同样官方发布的oSIP的扩展开发库exosip2,使用exoSIP可以很方便地快速创建一个完整的SIP程序(只针对性地适用于SIP终端开发用,所以我们这里只是用它快速开发一个SIP终端,用来更方便地学习oSIP,要想真正掌握SIP的开发,需要掌握oSIP并熟读RFC文档才行,exoSIP不是我们的最终学习目的),通过成功编译运行一个自己动手开发出的程序,再由浅入深应该是初学都最好的学习方法通过对使用exosip开发库的使用创建自己的SIP程序,熟悉后再一个函数一个函数地深入学习exosip提供的接口函数,就可以深入理解osip 了,达到间接学习oSIP的目的,同时也能从eXoSIP中学习到正确使用oSIP的良好的编程风格和语法格式。
而要成功编译ExoSIP,似乎许多人被难住了,直接在XP-sp2上,用VC6,虽然你使用了eXoSIP推荐的winsock2.h,但是会得到一个sockaddr_storage结构不能识别的错误,因为vc6自带的开发库太古董了,需要升级系统的PlatformSDK,下载地址如下:/msdownl ... PSP2FULLInstall.htm (VC6的支持已经停止,这是VC6能使用的最新SDK)成功安装后编译前需加OSIP_MT宏,以启用线程库,否则在程序中使用eXoSIP库时会出错,而编译时也会得到许多函数未定义的Warning提示,编译得到exosip2.lib供我们使用,当然,在此之前需要成功编译了osip2和osipparser2,而在之后的实际使用时,发现oSIP也需要增加OSIP_MT宏,否则OSIP_MT调用oSIP的线程库时会出错,所以我们需要重新编译oSIP了:),因为eXosip是基于oSIP的(同上方式创建静态和动态链接库工程,并需在Link中手工添加oSIP和oSIPparser的lib库)。
------------------------------------------------------创建新工程,可以是任意工程,我们从最简单的Win32控制台程序开始,为了成功使用oSIP,我们需要引用相关库,调用相关头文件,经过多次试验,发现需要引用如下的库:exosip2.lib osip2.lib osipparser2.lib WSock32.LibIPHlpApi.Lib WS2_32.Lib Dnsapi.lib其中,除了我们上面编译得到的三个oSIP库外,其它库都是系统库,其中有一些是新安装的PlatformSDK所新提供的。
至此,我们有了一个简单的开发环境了,可以充分利用网上大量的以oSIP为基础的代码片段和官方说明文档开始具体函数功能的测试和使用了:)------------------------------------------------------我们先进行一个简单的纯SIP信令(不带语音连接建立)的UAC的SIP终端的程序开发的试验(即一个只能作为主叫不能作为被叫的的SIP软电话模型),我们创建一个MFC应用程序,对话框模式,照上面的说明,设置工程包含我们上面得到的oSIP的相关开发库及SDK的一些开发库,并且由于默认LIBC的冲突,需要排除MSVCRT[D]开发库(其中D代表Debug模式下,没有D表示Release模式下),直接使用eXosip的几个主要函数就可以创建一个基本的SIP软电话模型。
其主要流程为:初始化eXosip库-启动事件监听线程-向SIPProxy注册-向某SIP终端(电话号码)发起呼叫-建立连接-结束连接初始化代码:int ret = 0;ret = eXosip_init ();eXosip_set_user_agent("##YouToo0.1");if(0 != ret){AfxMessageBox("Couldn't initialize eXosip!\n");return false;}ret = eXosip_listen_addr (IPPROTO_UDP, NULL, 0, AF_INET, 0);if(0 != ret){eXosip_quit ();AfxMessageBox("Couldn't initialize transportlayer!\n");return false;}启动事件监听线程:AfxBeginThread(sip_uac,(void *)this);向SIPProxy注册:eXosip_clear_authentication_info();eXosip_add_authentication_info(uname, uname, upwd, "md5", NULL);real_send_register(30); /* 自定义函数代码请见源码 */发起呼叫(构建假的SDP描述,实际软电话使用它构建RTP媒体连接):osip_message_t *invite = NULL; /* 呼叫发起消息体 */int i = eXosip_call_build_initial_invite (&invite, dest_call, source_call, NULL, "## YouToo test demo!");if (i != 0){AfxMessageBox("Intial INVITE failed!\n");}char localip[128];eXosip_guess_localip (AF_INET, localip, 128);snprintf (tmp, 4096,"v=0\r\n""o=josua 0 0 IN IP4 %s\r\n""s=conversation\r\n""c=IN IP4 %s\r\n""t=0 0\r\n""m=audio %s RTP/AVP 0 8 101\r\n""a=rtpmap:0 PCMU/8000\r\n""a=rtpmap:8 PCMA/8000\r\n""a=rtpmap:101 telephone-event/8000\r\n""a=fmtp:101 0-11\r\n", localip, localip, "9900");osip_message_set_body (invite, tmp, strlen(tmp));osip_message_set_content_type (invite, "application/sdp"); eXosip_lock ();i = eXosip_call_send_initial_invite (invite);eXosip_unlock ();挂断或取消通话:int ret;ret = eXosip_call_terminate(call_id, dialog_id);if(0 != ret){AfxMessageBox("hangup/terminate Failed!");}可以看到非常简单,再借助于oRTP和Mediastreamer开发库,来快速为我们的SIP软电话增加RTP和与系统语音API接口交互及语音编码功能,即可以快速开发出一个可用的SIP软电话,关于oRTP和Mediastreamer的相关介绍不是本文重点,将在有空的时候考虑增加相应使用教程,后面跟贴中可以下载基本可用的完整SIP软电话的VC源码工程文件供参考使用,完全CopyLeft,欢迎转载,但请在转载时注明作者信息,谢谢!第二阶段:---------------------------------------------------得到了一个SIP软电话模型后,我们可以根据软电话的实际运行表现(结合用Ethereal抓包分析)来进行代码的分析,以达到利用eXoSIP来辅助我们学习oSIP的最终目的(如要快速开发一个可用的SIP软电话,请至前面提到的论坛去下载使用oRTP和Mediastreamer快速搭建的一个基本完整可用的SIP软电话##YouToo 0.1版本的VC源码工程文件作参考)。