【eXosip】注册与处理推流请求处理逻辑总结

概述

使用eXosip库搭建一个的信令服务,主要目标是为了适配GB28181。使用该库搭建信令服务的时候需要注意几个问题

  • eXosip不是线程安全的, 其中涉及到访问共享资源的情况都需要对其进行加锁,如果代码中涉及到了多个线程,那么不仅仅需要解决加锁保护共享资源,同时还需要防止死锁的情况
  • 该总结涉及的主要逻辑仅仅在于如果搭建一个服务注册、响应、以及推送视频的基本逻辑,并不设计全面的信令处理
  • 代码已经在项目中进行了验证,可以参考官方库对一些流程进行简化

官方技术文档

libeXosip2: Modules

初始化

初始化主要流程

#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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值