概述
使用eXosip库搭建一个的信令服务,主要目标是为了适配GB28181。使用该库搭建信令服务的时候需要注意几个问题
- eXosip不是线程安全的, 其中涉及到访问共享资源的情况都需要对其进行加锁,如果代码中涉及到了多个线程,那么不仅仅需要解决加锁保护共享资源,同时还需要防止死锁的情况
- 该总结涉及的主要逻辑仅仅在于如果搭建一个服务注册、响应、以及推送视频的基本逻辑,并不设计全面的信令处理
- 代码已经在项目中进行了验证,可以参考官方库对一些流程进行简化
官方技术文档
初始化
初始化主要流程
#include <eXosip2/eXosip.h>
int main
{
//1. 初始化一个exosip_t的结构指针
eXosip_t *ctx;
int i;
int port = 5060; // 默认 SIP 端口
//2. 初始化exosip上下文,分配上下文然后初始化
ctx = eXosip_malloc();
if (ctx == NULL) {
fprintf(stderr, "Failed to allocate eXosip context\n");
return -1;
}
i = eXosip_init(ctx);
if (i != 0) {
fprintf(stderr, "Failed to initialize eXosip\n");
return -1;
}
// 3 清理资源
eXosip_quit(ctx);
return 0;
}
设置传输层
选择传输协议(如 UDP、TCP、TLS 或 DTLS),并使用 eXosip_listen_addr 函数设置监听地址和端口,函数的详细分析参考下文
i = eXosip_listen_addr(ctx, IPPROTO_UDP, NULL, port, AF_INET, 0);
if (i != 0) {
eXosip_quit(ctx);
fprintf(stderr, "Could not initialize transport layer\n");
return -1;
}
其他初始化选项
// 配置TLS
int val = 0;
i = eXosip_set_option(ctx, EXOSIP_OPT_SET_TLS_VERIFY_CERTIFICATE, (void*)&val);
if (i != 0) {
fprintf(stderr, "Failed to set TLS option\n");
return -1;
}
// 其他一些选项
eXosip_set_user_agent(ctx, "exosipdemo/0.0.0");
int keep_alive = 17000;
eXosip_set_option(ctx, EXOSIP_OPT_UDP_KEEP_ALIVE, (void*)&keep_alive);
int dns_capabilities = 2;
eXosip_set_option(ctx, EXOSIP_OPT_DNS_CAPABILITIES, (void*)&dns_capabilities);
int use_rport = 1;
eXosip_set_option(ctx, EXOSIP_OPT_USE_RPORT, (void*)&use_rport);
事件处理机制
基本框架
eXosip_event_t:描述事件的核心结构
主要作用: eXosip_event 结构体用于描述在使用 libeXosip2 库进行 SIP 通信时发生的各种事件。 通过处理这些事件,开发者可以管理 SIP 呼叫、注册、订阅等操作。 每个事件都包含与之相关的详细信息,如事件类型、关联的 SIP 消息、唯一标识符等
注意:处理这些事件,通常会使用 eXosip_event_wait 函数等待事件的发生,然后根据事件类型进行相应的处理
typedef struct eXosip_event {
eXosip_event_type_t type; // 事件类型
char textinfo[256]; // 事件的文本描述
void *external_reference; // 外部引用(用于呼叫)
osip_message_t *request; // 当前事务中的请求消息
osip_message_t *response; // 当前事务中的最后响应消息
osip_message_t *ack; // 当前事务中的确认消息
int tid; // 事务的唯一标识符
int did; // SIP对话的唯一标识符
int rid; // 注册的唯一标识符
int cid; // SIP呼叫的唯一标识符(可能包含多个对话)
int sid; // 外发订阅的唯一标识符
int nid; // 入站订阅的唯一标识符
int ss_status; // 订阅的当前状态
int ss_reason; // 订阅的当前原因状态
} eXosip_event_t;


2202

被折叠的 条评论
为什么被折叠?



