libosip2与libeXosip2
libosip2
- GNU libosip2库是是
SIP
- rfc3261的一个实现。该库旨在为多媒体和电信软件开发人员提供一个简单而强大的接口,以便在其应用程序中启动和控制基于SIP的会话 - oSIP是跨平台的。
libeXosip2
-
libosip2
主要与·libeXosip2
库一起使用,后者为用户代理实现提供了更简单的API。- eXosip2不是GNU项目的一部分。
- 该协议主要用于VoIP电话应用程序(端点或会议服务器),但对于希望建立会话(如多人游戏)的任何应用程序也可能有用。
-
eXosip是Osip2的一个扩展协议集,它部分封装了Osip2协议栈,使得它更容易被使用。使用sip 协议建立多媒体会话是一个复杂的过程,exosip 库开发的目的在于隐藏这种复杂性。正如它的名称所表示的,eXosip2 - the eXtended osip Library,它扩展了osip 库,实现了一个简单的高层API。通过使用exosip,我们可以避免直接使用osip 带来的困难。需要注意,exosip 并不是对osip 的简单封装包裹,而是扩展。Osip 专注于sip 消息的解析,事务状态机的实现,而exosip 则基于osip 实现了call、options、register、publish 等更倾向于功能性的接口。当然,这些实现都是依赖于底层osip 库已有的功能的。两者区别
- osip:不带传输层(socket自己管理) exosip带传输层(socket协议栈管理)
- osip:无SSL exosip:有SSL
- osip:只提供线程函数封装(让用户自己决定)exosip运行时直接带线程(默认有,直接提供会话的状态机的运行线程_eXosip_thread)
-
osip/eXosip已经在多家SIPit进行了测试,并验证了与大多数供应商的合规性。
下载
这里有个问题,从4.0.0版本开始,API接口函数和之前有一些改动。我这里下载的是5.3.0
- libexosip2-5.3.0.tar.gz
- libosip2-5.3.0.tar.gz
编译
将上面下载的源码包解压后加入工程
当前工程目录如下:
其余部分为RTP对接,具体可以参考C/C++编程:GB28010对接之jrtplib从编译到使用,不过不看前文也没有影响
编写脚本
我们在export中再加入两个脚本,用来编译libosip2和libexosip2
build_osip.sh
内容如下:
#!/bin/bash
currentPath=$(pwd)
libPath=$(pwd)/../libosip2-5.3.0
if [ -d "./libosip" ]; then
rm -rf libosip
fi
mkdir libosip
cd libosip
installPath=$(pwd)
cd ${libPath}
./configure --prefix=${installPath}
make
make install
cd ${currentPath}
# 执行make时遇到问题,找了篇帖子解决了,原因不详细 // TODO 研究
# aclocal-1.14: command not found
# autoreconf -ivf
build_exosip.sh
内容如下:
#!/bin/bash
currentPath=$(pwd)
libPath=$(pwd)/../libexosip2-5.3.0
if [ -d "./libexosip" ]; then
rm -rf libexosip
fi
mkdir libexosip
cd libexosip
installPath=$(pwd)
export PKG_CONFIG_PATH=/home/oceanstar/CLionProjects/jrtp_test/lib/export/libosip/lib/pkgconfig:$PKG_CONFIG_PATH
# export PKG_CONFIG_PATH=$(pwd)/openssl/openssl-1.0.2t/build/lib/pkgconfig:$PKG_CONFIG_PATH
echo ${PKG_CONFIG_PATH}
#
#export C_INCLUDE_PATH=$(pwd)/libosip/include:$C_INCLUDE_PATH
#echo $C_INCLUDE_PATH
cd ${libPath}
./configure --prefix=${installPath}
make
make install
cd ${currentPath}
# 执行make时遇到问题,找了篇帖子解决了,原因不详细 // TODO 研究
# aclocal-1.14: command not found
# autoreconf -ivf
开始编译
cd export
chmod 777 *.sh
./build_osip.sh
./build_exosip.sh
生成的目录如下:
测试程序
最外层的CMakeLists.txt
cmake_minimum_required(VERSION 3.16)
project(jrtp_test)
set(CMAKE_CXX_STANDARD 14)
add_subdirectory (src)
最下面的CMakeLists.txt
include_directories(
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR}/lib/export/libosip/include
${CMAKE_SOURCE_DIR}/lib/export/libexosip/include
)
link_directories(
${CMAKE_SOURCE_DIR}/lib/export/libosip/lib
${CMAKE_SOURCE_DIR}/lib/export/libexosip/lib
)
add_definitions("-Wall -g")
aux_source_directory(. SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST} )
set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
target_link_libraries( ${PROJECT_NAME} -losipparser2 -losip2 -leXosip2 )
在使用eXosip2前你需要初始化eXosip环境和libeXosip2.so库,这一步必须在所有使用之前完成。
#include "stdio.h"
#include <eXosip2/eXosip.h>
#include <iostream>
#include <rpc/types.h>
using namespace std;
int main(void)
{
int listenport = 8888;
//库处理结果
int result = OSIP_SUCCESS;
//初始化库
eXosip_t *ctx = eXosip_malloc();
result = eXosip_init(ctx);
if (OSIP_SUCCESS != result)
{
printf("Can't initialize eXosip!\n");
return 1;
}
printf("eXosip_init successfully!\n");
//监听
result = eXosip_listen_addr(ctx, IPPROTO_UDP,NULL,listenport,AF_INET,0);
if (OSIP_SUCCESS != result){
printf("eXosip_listen_addr failure.\n");
return 1;
}
printf("eXosip_listen_addr successfully.\n");
// 结束
eXosip_quit(ctx);
ctx = nullptr;
return 0;
}
初始化完成之后,用户就可以发送SIP消息和等待接受SIP事件了