基于eXosip2实现的客户端和服务端

一、源码下载

Index of /download/exosip2/,这里选择libeXosip2-3.5.0.tar.gz和libosip2-3.5.0.tar.gz

二、osip2库编译

cd libosip2-3.5.0/
./configure --enable-static
make
make install

三、eXosip2库编译

 
cd libeXosip2-3.5.0/
./configure --enable-static
make 
make install

四、eXosip2客户端


#include <iostream>
#include <string>
#include <sstream>
#include <osipparser2/osip_message.h>
#include <osipparser2/osip_parser.h>
#include <osipparser2/osip_port.h>

#include <eXosip2/eXosip.h>
#include <eXosip2/eX_setup.h>
#include <eXosip2/eX_register.h>
#include <eXosip2/eX_options.h>
#include <eXosip2/eX_message.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <sys/socket.h>

using namespace std;


#define LISTEN_ADDR ("192.168.50.57")
#define UACPORT ("5061")
#define UACPORTINT (5061)
#define UACCODE ("100110000201000000")
#define UACPWD ("12345")
#define UAS_ADDR ("192.168.50.57")
#define UAS_PORT ("5060")
#define EXPIS 300

static int iCurrentStatus;

static int iHandle = -1;


class CSipFromToHeader
{
public:
 CSipFromToHeader()
 {
 }
 ~CSipFromToHeader()
 {
 }
 void SetHeader(string addrCod, string addrI, string addrPor)
 {
	 addrCode = addrCod;
	 addrIp = addrI;
	 addrPort = addrPor;
 }
 string GetFormatHeader()
 {
	 std::stringstream stream;
	 stream << "sip: " << addrCode << "@" << addrIp << ":" << addrPort;
	 return stream.str();
 }

 string GetCode()
 {
	 std::stringstream stream;
	 stream << addrCode;
	 return stream.str();
 }

 string GetAddr()
 {
	 std::stringstream stream;
	 stream << addrIp;
	 return stream.str();
 }

 string GetPort()
 {
	 std::stringstream stream;
	 stream << addrPort;
	 return stream.str();
 }

private:
 string addrCode;
 string addrIp;
 string addrPort;
};

class CContractHeader: public CSipFromToHeader
{
public:
 CContractHeader()
 {
 }
 ~CContractHeader()
 {
 }
 void SetContractHeader(string addrCod, string addrI, string addrPor)
 {
	 SetHeader(addrCod, addrI, addrPor);
 }
 string GetContractFormatHeader()
 {

	 std::stringstream stream;
	 stream << "<sip:" << GetCode() << "@" << GetAddr() << ":" << GetPort()
			 << ">";
	 return stream.str();
 }
};


int SendRegister(int& registerId, CSipFromToHeader &from, CSipFromToHeader &to,
	 CContractHeader &contact, const string& userName, const string& pwd,
	 const int expires, int iType)
{
 cout << "=============================================" << endl;
 if (iType == 0)
 {
	 cout << "注册请求信息:" << endl;
 }
 else if (iType == 1)
 {
	 cout << "刷新注册信息:" << endl;
 }
 else
 {
	 cout << "注销信息:" << endl;
 }
 cout << "registerId " << registerId << endl;
 cout << "from " << from.GetFormatHeader() << endl;
 cout << "to " << to.GetFormatHeader() << endl;
 cout << "contact" << contact.GetContractFormatHeader() << endl;
 cout << "userName" << userName << endl;
 cout << "pwd" << pwd << endl;
 cout << "expires" << expires << endl;
 cout << "=============================================" << endl;

 static osip_message_t *regMsg = 0;
 int ret;

 ::eXosip_add_authentication_info(userName.c_str(), userName.c_str(),
		 pwd.c_str(), "MD5", NULL);
 eXosip_lock();
 if (0 == registerId)
 {
	 registerId = ::eXosip_register_build_initial_register(
			 from.GetFormatHeader().c_str(), to.GetFormatHeader().c_str(),
			 contact.GetContractFormatHeader().c_str(), expires, &regMsg);
	 if (registerId <= 0)
	 {
		 return -1;
	 }
 }
 else
 {
	 ret = ::eXosip_register_build_register(registerId, expires, &regMsg);
	 if (ret != OSIP_SUCCESS)
	 {
		 return ret;
	 }
	 if (expires == 0)
	 {
		 osip_contact_t *contact = NULL;
		 char tmp[128];

		 osip_message_get_contact(regMsg, 0, &contact);
		 {
			 sprintf(tmp, "<sip:%s@%s:%s>;expires=0",
					 contact->url->username, contact->url->host,
					 contact->url->port);
		 }
		 //osip_contact_free(contact);
		 //reset contact header
		 osip_list_remove(&regMsg->contacts, 0);
		 osip_message_set_contact(regMsg, tmp);
		 osip_message_set_header(regMsg, "Lo
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在基于GBT28181的SIP协议组件开发中,SIP服务端流程是非常关键的一部分。本文将介绍如何使用eXosip2实现SIP服务端流程。 一、eXosip2简介 eXosip2是一个基于SIP标准的开源协议栈,它提供了一组API,可以用来实现SIP客户端服务端eXosip2具有高度的可移植性和灵活性,可以在不同平台上运行。eXosip2的主要特点包括: 1. 遵循SIP标准,功能齐全。 2. 支持IPv4和IPv6协议栈。 3. 支持TLS和SRTP协议。 4. 提供了一组易于使用的API,方便开发人员进行二次开发。 5. 可以在不同的平台上运行,包括Linux、Windows、Android等。 二、eXosip2的使用 1. 安装eXosip2库 首先需要安装eXosip2库,可以通过以下命令在Ubuntu下安装: sudo apt-get install libexosip2-dev 2. 初始化eXosip2 在使用eXosip2之前,需要初始化eXosip2库,这可以通过调用eXosip_init函数来实现。例如: eXosip_t *g_eXosipContext=NULL; g_eXosipContext = eXosip_malloc(); if (g_eXosipContext!=NULL) { iRet = eXosip_init(g_eXosipContext); } 3. 注册SIP服务器 使用eXosip2可以实现SIP服务器的注册,这可以通过调用eXosip_register_build函数构造注册消息,然后通过调用eXosip_register_send发送注册消息。例如: eXosip_event_t *pEvent = NULL; osip_message_t *pMsg = NULL; int iRet = 0; iRet = eXosip_register_build_initial_register(g_eXosipContext, "sip:192.168.1.100", "sip:192.168.1.100", "sip:192.168.1.100", 3600, &pMsg); if (iRet == 0) { iRet = eXosip_register_send_register(g_eXosipContext, pMsg); osip_message_free(pMsg); } 4. 接收SIP消息 使用eXosip2可以接收SIP消息,这可以通过调用eXosip_listen函数实现。例如: while (1) { iRet = eXosip_listen(g_eXosipContext, 0, &pEvent); if (iRet >= 0) { switch (pEvent->type) { case EXOSIP_REGISTRATION_SUCCESS: // 注册成功 break; case EXOSIP_REGISTRATION_FAILURE: // 注册失败 break; case EXOSIP_MESSAGE_NEW: // 收到新的SIP消息 break; } eXosip_event_free(pEvent); } } 5. 回复SIP消息 使用eXosip2可以回复SIP消息,这可以通过调用eXosip_message_build_response函数构造回复消息,然后通过调用eXosip_message_send_response发送回复消息。例如: osip_message_t *pMsg = NULL; int iRet = 0; iRet = eXosip_message_build_response(pEvent->tid, 200, &pMsg); if (iRet == 0) { iRet = eXosip_message_send_response(g_eXosipContext, pEvent->tid, 200, pMsg); osip_message_free(pMsg); } 三、总结 本文介绍了如何使用eXosip2实现SIP服务端流程。eXosip2是一个功能齐全、易于使用的SIP协议栈,可以方便地实现SIP客户端服务端。在GBT28181的SIP协议组件开发中,eXosip2是一个非常好的选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值