osip编译方法
软AP的实现------hostapd的编译运行

软AP的实现------hostapd的编译运⾏最近要给摄像头做⼀个软ap,让⼿机能够连上这个热点,从⽽能够与摄像头进⾏通信。
1、什么是hostapd :hostapd能够使得⽆线⽹卡切换为master模式,模拟AP(通常可以认为是路由器)功能,也就是我们说的软AP(Soft AP)。
Hostapd的功能就是作为AP的认证服务器,负责控制管理stations(通常可以认为带⽆线⽹卡的PC)的接⼊和认证。
通过Hostapd可以将⽆线⽹卡切换为AP/Master模式,通过修改配置⽂件,可以建⽴⼀个开放式的(不加密)的,WEP,WPA或WPA2的⽆线⽹络。
并且通过修改配置⽂件可以设置⽆线⽹卡的各种参数,包括频率,信号,beacon包时间间隔,是否发送beacon包,如果响应探针请求等等。
还可以设置mac地址过滤条件等。
下⾯是⽆线⽹卡常见的⼯作模式及其作⽤。
2、编译移植基于RTL8188EUS⽆线⽹卡的驱动程序版本:wpa_supplicant_hostapd-0.8_rtw_r7475.20130812进⼊hostapd⽬录,修改Makefile 找到如下语句:ifndef CCCC=gccendif删除上⾯的语句,改成⾃⼰编译服务器的gcc,然后make。
CROSS_COMPILE=arm-xxxx-linux-CC=$(CROSS_COMPILE)gcc⽣成hostapd和hostapd_cli3、运⾏hostapd,创建软APvi /etc/hostapd.conf1)、创建不需要密码的APctrl_interface=/var/run/hostapdinterface=wlan0driver=rtl871xdrvssid=Ap117081234000009channel=8macaddr_acl=0auth_algs=1ignore_broadcast_ssid=02)、创建wep加密类型的APctrl_interface=/var/run/hostapdinterface=wlan0driver=rtl871xdrvssid=Ap117081234000009channel=8macaddr_acl=0auth_algs=2ignore_broadcast_ssid=0wep_key0=1234567891200wep_default_key=03)、创建wpa psk加密类型的APctrl_interface=/var/run/hostapdinterface=wlan0driver=nl80211ssid=Ap117081234000009channel=1macaddr_acl=0auth_algs=1ieee80211n=1hw_mode=gignore_broadcast_ssid=0wpa=2wpa_passphrase=123456789wpa_key_mgmt=WPA-PSKwpa_pairwise=TKIPrsn_pairwise=CCMP运⾏命令: ./hostapd -B /etc/hostapd.conf -dd电脑可以搜到这个wifi,但是连接不上⼿机也可以搜到连不上的原因是没有dhcpserver为其分配IP。
osip工作原理和过程

OSIP工作原理和工作过程雷/wcl0715感谢OSIP代码整理小组的工作。
一、概述:首先说明一个概念:OSIP是一个开原的标准C的sip 3261的CORE,实际上是一个SIP 的信令实现,从另一个角度说,它是SIP的一个信令解释器,任务是负责生成和解析SIP信令,仅此而已,其它的事情,比如收包,发包,建立RTP流的过程等等和OSIP没有任何必然关系。
理论上OSIP可以应用在任何可以编译C语言的系统上。
二、工作原理OSIP实现的核心是状态机,为了便于保持逻辑的清晰和代码模块化的实现,OSIP分成两对状态机,分别用来处理正常的CALL流程和其它非CALL流程,对应的每对状态机又分成out和in两个状态,因此OSIP共有四个状态机。
详细的状态机部分文挡请参考OSIP 的状态机分析,在我们的资源连接里你可以找到它,你也可以登陆我的BLOG来寻找它。
对不同的状态OSIP相应的用不同的状态机处理,在这些状态机下,OSIP对本身或者来自对方的消息进行处理,从而推动自身状态的改变,这也就是OSIP的核心工作原理。
和其它的SIP协议栈的实现一样,OSIP采用CALLBACK函数的方法来对用户程序提供接口,当系统有事件发生,或者状态改变的时候,OSIP调用这些CALLBACK函数,来完成用户的要求(比如收到对方180消息后,本地要响铃,实现方法就是在OSIP的收到180消息的CALLBACK函数里实现响铃代码),因此OSIP用户需要自己编写这些CALLBACK 函数,实现自己所需要的功能,然后在系统初始化过程中,和系统callback函数挂接,这样当系统调用CALLBACK的时候就会执行你的函数,这也就是OSIP初始化的时候,要设定一大堆CALLBACK函数的原因,在接触协议初期,也许你觉得烦琐,但尽可能多的让用户能对事件进行处理,才能保证协议栈的可用性这样,这在系统越来越复杂的情况下,或者应用比较复杂的情况下,尤为重要。
网路编程基础步骤和方法

网路编程基础步骤和方法部门: xxx时间: xxx整理范文,仅供参考,可下载自行编辑异步套接字分类:VC 2018-03-31 10:54 422人阅读评论(0> 收藏举报一、TCP/IP 体系结构与特点1、TCP/IP体系结构TCP/IP协议实际上就是在物理网上的一组完整的网络协议。
其中TCP是提供传输层服务,而IP则是提供网络层服务。
TCP/IP包括以下协议:<结构如图1.1)b5E2RGbCAP(图1.1>IP:网间协议(Internet Protocol> 负责主机间数据的路由和网络上数据的存储。
同时为ICMP,TCP,UDP提供分组发送服务。
用户进程通常不需要涉及这一层。
ARP:地址解读协议(Address Resolution Protocol> 此协议将网络地址映射到硬件地址。
RARP:反向地址解读协议(Reverse Address Resolution Protocol> 此协议将硬件地址映射到网络地址ICMP:网间报文控制协议(Internet Control Message Protocol> 此协议处理信关和主机的差错和传送控制。
TCP:传送控制协议(Transmission Control Protocol> 这是一种提供给用户进程的可靠的全双工字节流面向连接的协议。
它要为用户进程提供虚电路服务,并为数据可靠传输建立检查。
<注:大多数网络用户程序使用TCP)UDP:用户数据报协议(User Datagram Protocol> 这是提供给用户进程的无连接协议,用于传送数据而不执行正确性检查。
FTP:文件传输协议(File Transfer Protocol> 允许用户以文件操作的方式<文件的增、删、改、查、传送等)与另一主机相互通信。
SMTP:简单邮件传送协议(Simple Mail Transfer Protocol>SMTP协议为系统之间传送电子邮件。
在arm-linux编译osip-exosip2(lhl)

在arm-linux编译osip,exosip21osip,exosip2简介Osip2是一个开放源代码的sip协议栈,是使用C语言写的协议栈,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高。
但缺点也很明显,首先就是可用性差,没有很好的api封装,使得上层应用在调用协议栈时很破碎;其次,只做到了事务(transaction)层次的协议过程解析,缺少呼叫(call)、会议(session)、对话(dialog)等过程的解析,这也增加了使用的难度;再次,缺少线程并发处理的机制,使得它的处理能力有限。
eXosip是Osip2的一个扩展协议集,它部分封装了Osip2协议栈,使得它更容易被使用。
eXosip增加了call、dialog、registration、subscription等过程的解析,使得实用性更强。
但是eXosip局限于UA的实现,使得它用于registrar、sip se rver等应用时极其不容易。
另外,它并没有增加线程并发处理的机制。
2下载:a)/gnu/osip/b)/releases/exosip/3配置编译环境交叉编译环境库路径拷贝到“/home/lhluser/tools/arm-bcm2708”,运行下面命令,配置环境变量。
复制下面语句到命令行#export CC=/home/lhluser/tools/arm-bcm2708/arm-bcm2708hardfp-linux-gn ueabi/bin/arm-bcm2708hardfp-linux-gnueabi-gcc4编译osip2a)将libosip2-3.6.0.tar.gz解压到“/home/lhluser/LHL/libosip2-3.6.0”b)#cd /home/lhluser/LHL/libosip2-3.6.0c)#mkdir osiparmlib 建立工作路径d)#cd osiparmlib 进入工作路径e)#chmod +x ../configure 修改文件为可执行查看configure配置文件:$./../configure --help > osip2_configure_help. txtf)#./../configure --prefix=/home/lhluser/LHL/armlib --target=arm-linux --host=arm-linux --enable-static=yes --enable-shared=nog)#makeh)#make install完成后,生成的libosip2.so.7.2.0、libosip2.a、libosipparser2.so.7.2.0和libosipparser2.a库文件在“/home/lhluser/LHL/armlib/lib”目录下,inc lude文件在“/home/lhluser/LHL/armlib/include”下5编译eXosipa)将libeXosip2-3.6.0.tar.gz解压到“/home/lhluser/LHL/libeXosip2-3.6.0b)#cd /home/lhluser/LHL/libeXosip2-3.6.0c)#cp ../armlib/lib/* /usr/lib/d)#cp -r ../libosip2-3.6.0/osiparmlib/include/osipparser2 ../libeXosip2-3.6.0/include/osipparser2e)#cp -r ../libosip2-3.6.0/osiparmlib/include/osip2 ../libeXosip2-3.6.0/include/osip2f)#mkdir eXosiparmlib 建立工作路径g)#cd eXosiparmlib 进入工作路径h)#chmod +x ../configure 修改文件为可执行查看configure配置文件:$./../configure --help > eXosip2_configure_hel p.txti)#./../configure --prefix=/home/lhluser/LHL/armlib --target=arm-linux --host=arm-linux --enable-static=yes --enable-shared=no j)#make cleank)#makel)#make install完成后,configure文件中指示生成路径为“/home/lhluser/LHL/armlib”,生成的l ibeXosip2.so.7.2.0和libeXosip2.a库文件在“/home/lhluser/LHL/armlib/lib”目录下,include文件在“/home/lhluser/LHL/armlib /include”下6验证示例程序:6.1创建qt工程“文件”“新建文件或项目”“QT Gui 应用”名称:eXosip2_init创建路径:/home/lhluser/LHL/eXosip2_init使用构建套件:ARM_Kit进入“项目”“构建和运行”“构建设置”将“Release”和“Debug”中的影子工程(Shadow build)去掉6.2复制编译好的库和头文件到该工程路径下$ cp -r /usr/local/include /home/lhluser/LHL/eXosip2_init/eXosip2_ini t/include$ cp -r /usr/local/lib /home/lhluser/LHL/eXosip2_init/eXosip2_init/li b建立调用库路径()和头文件路径()6.3添加代码修改工程文件“eXosip2_init.pro”,添加头部和库路径说明如下:INCLUDEPATH += ./includeINCLUDEPATH += ./include/eXosip2INCLUDEPATH += ./include/osip2INCLUDEPATH += ./include/osipparser2INCLUDEPATH += .l/include/osipparser2/headersQMAKE_LIBDIR += ./libLIBS += -losip2LIBS += -losipparser2LIBS += -leXosip2在文件“main.cpp”的头部添加头部说明extern "C"{#include <eXosip.h>}在文件”main.cpp”的“int main(int argc, char *argv[])”中添加如下代码,用于测试编译库是否正确。
oSIP开发者手册

oSIP开发者手册选择自 IOKE 的 Blog关键字 oSIP开发者手册oSIP开发者手册——本手册指导开发者利用oSIP栈开发用户代理原文标题:oSIP User Manual原文作者:Aymeric Moizard联系方法:jack@版权保护:GNU Free Documentation License项目网站:译文作者:陈善学联系方法:chenshanxue@摘要“会话发起协议(Session Initiation Protocol-SIP)是一个应用层的信令控制协议。
用于创建、修改和终止一个或多个参与者的会话。
这些会话可以是Internet多媒体会议、IP电话或多媒体分发(例如:语音信箱)。
会话的参与者可以通过组播(multicast)、网状单播(unicast)或两者的混合体进行通信。
”"The Session Initiation Protocol (SIP) is an application-layer control (signaling) protocol for creating, modifying and terminating sessions with one or more participants. These sessions include Internet multimedia conferences, Internet telephone calls and multimedia distribution. Members in a session can communicate via multicast or via a mesh of unicast relations, or a combination of these."版权本文的版权归Aymeric Moizard所有。
允许拷贝、分发和在”GNU Free Documentation License”(版本1.1或由自由软件基金会最近发布的任何版本)下的定制。
osip源代码框架详

Osip协议源代码框架详解Revision History目录Osip源代码框架详解1符号及缩写2整体描述开源代码的osip协议栈分为两个源代码包,整个协议栈采纳lib库的形式,在内部没有利用到任务,采取与TCP/IP协议栈一样的策略,因此在利用上需要上层治理任务直接挪用lib库提供的接口。
因为在Lib库内部没有利用到像按时器、发送队列等的任务,而同时需要利用到按时器,因此在lib库的内部采纳轮训遍历的方式不断的检查是不是有按时器超时,这在某种程度上会浪费CPU的许诺时刻。
同时整个lib库实现了对call, notify等的治理,为了实现重入,在应用启用多线程的条件下,内部启用的信号量和锁的利用,在下面的分析中不涉及到信号量和锁机制。
Lib库依照sip协议栈的层次关系分为两个lib包,底层的osip lib包实现对单个请求、应答、ACK的处置,包括message的解析、拼装、内容set和get,单个请求形成的transaction相关操作和通信两头形成的一个dialog 的操作。
Lib库上层的exosip lib在底层osip lib库的实现基础上,实现对sip协议整理逻辑上的治理。
Exosip要紧关注的是sip协议的业务流程,包括call的整体治理,notify的整体治理,publish的治理,register的治理,option 的治理,refer的治理和subscription的治理,其中最要紧的为call和register的治理,这两个为sip协议栈必须实现的部份,另几个功能为sip协议栈扩展部份。
从这几个业务的治理流程起身,在业务的底层它们会利用到相似的一些功能,如注册的认证,发送message,接收message,每一个请求和应答形成的transaction,多个transaction 组合而成的dialog。
在message的处置方面,能够分为两类,一类为发送的message,因为是主动发送,因此上层治理层明白是什么类型的message,lib库直接提供各类接供词利用。
osip2协议栈原理分析以及总结

OSIP2协议栈学习总结1、Osip2协议栈介绍Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点。
它的核心特性为sip协议数据的解析和事务的管理。
数据包的收发、RTP 流的处理等,并不在Osip2中完成。
应用程序使用Osip 时需要单独去实现这些模块。
Osip2的缺点是没有很好的上层api封装,使得上层应用在调用协议栈时很破碎;只做到了transaction层次的协议过程解析,缺少call、session、dialog等过程的解析,这也增加了使用的难度。
2、Osip2协议栈体系结构OSIP主要由解析模块、工具模块和状态机模块构成,其核心是状态机模块.OSIP结构如图所示.2.1 语法解析器libosip库源码src/osipparser2为解析器源码,OSIP解析模块主要用于对SIP请求与响应进行封装与解析处理,分为SIP解析、URL解析与SDP解析完成对sip协议相关字段的构造和解析。
比如,将紧凑的存储于内存buffer中的sip 数据解析到清晰定义的数据结构体中,每一个字段代表sip协议中有意义的一个头域。
SIP解析主要负责SIP标题头的解析与封装。
SDP解析除了对数据包中SDP会话各类型进行解析外还包含对各类型的初始化和释放操作以及对整个SDP包的一些基本操作。
URL解析主要负责对SIP URI中包含的host,port,username,password等信息进行解析与设置。
2.2 有限状态机SIP状态机模块负责完成对某个事务状态的维持及处理。
并且在特定的状态下触发相应的事件或者回调函数。
OSIP协议栈的状态机主要分为4类:INVITE客户端事务ICT,非INVITE 客户端事务NICT,INVITE服务器端事务IST,非INVITE服务器端事务NIST。
2.3 工具模块OSIP工具模块分为对话管理工具和SDP协商工具。
对话管理工具使用户能够根据RFC3261对dialog进行操作,建立相应dialog结构体。
osip学习说明

oSIP工作过程
• 1、
系统初始化过程。
• 在OSIP工作之前,必须先初始化,主要有以下几个部分: • (1)系统资源申请,包括资源和链表的处理。 函数:osip_init() • (2)设置系统osip_set_message_callback函数 • (3)打开接收远端消息接收通道。它包括以下几个步骤
系统内部事务的产生过程
• 包括一个新的invite、 response、ack的发送 或接收,除了对非2xx 的应答ack外,其他的 请求和应答都会产生 一个新的transaction, 并且产生一个新的 sipevent事件。
_eXosip_transaction_init
osip_new_outgoing_sipmessag e (invite)
Kill event?
Y
osip_free (evt)
No
fsm_callmethod
osip的transaction的管理
• • • • • • • • • • • • • struct osip { void *application_context; /**< User defined Pointer */ /* list of transactions for ict, ist, nict, nist */ osip_list_t osip_ict_transactions; /**< list of ict transactions */ osip_list_t osip_ist_transactions; /**< list of ist transactions */ osip_list_t osip_nict_transactions; /**< list of nict transactions */ osip_list_t osip_nist_transactions; /**< list of nist transactions */ } 上面结构事务管理列表结构体,从中可以看出,事务分成4个不通的类型进行管 理,如果我们需要调用OSIP协议栈的话,必须自己先创建事务管理控制块,只需要 定期扫描该控制块下面的4个不通事务管理列表进行处理即可. osip_create_transaction创建事务 osip_find_transaction查询事务 osip_transaction_free清楚事务
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OSIP协议栈(及eXoSIP,Ortp等)使用入门-- 第一阶段发布: 2009-6-22 10:03 | 作者: deep3gadmin | 查看: 8次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源程序里直接写#include <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.Lib IPHlpApi.LibWS2_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 transport layer!\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软电话模型后,我们可以根据软电话的实际运行表现(结合用Ethereal抓包分析)来进行代码的分析,以达到利用eXoSIP来辅助我们学习oSIP的最终目的(如要快速开发一个可用的SIP软电话,请至前面提到的论坛去下载使用oRTP和Mediastreamer快速搭建的一个基本完整可用的SIP软电话##YouToo 0.1版本的VC源码工程文件作参考)。