视频监控安防平台-GB28181-exosip协议栈系统刷新订阅

2024-01-22 02:38

本文主要是介绍视频监控安防平台-GB28181-exosip协议栈系统刷新订阅,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

                             视频监控安防平台-GB28181-exosip协议栈刷新订阅

由于之前的sip协议栈是自己写的所以对发送订阅消息和相应规定都是自己组装,这次尝试使用exosip来进行订阅,发现不能单纯的调用订阅,必须调用协议栈里面的初始化订阅和刷新订阅,理解好之后,构造代码测试,发现还是不通,以为是协议栈不支持刷新订阅,就一步一步的调试,跟到协议栈内部发现不是这么简单,是exosip协议栈有问题,明明根据sid找到相应的订阅信息,但是返回的时候还是null, 发现是协议栈的问题,修改协议栈源码,重新编译。那么采用exosip刷新订阅的问题就迎刃而解。

        下面讲解下解决问题的思路:

采用eXosip_subscribe_build_refresh_request来进行刷新订阅,在调试代码的发现eXosip_subscribe_dialog_find这个函数返回出来的jd == NULL始终是错误的,下面就跟到int eXosip_subscribe_dialog_find(int sid, eXosip_subscribe_t ** js, eXosip_dialog_t ** jd)这个函数,发现通过 sid能找到相应的eXosip_subscribe_t,问题出现在

if ((*js)->s_id == sid)
return OSIP_SUCCESS;

不难看出找到sid之后直接返回成功,那么现在就是解决问题,需要把eXosip_dialog_t ** jd这个参数返回出去,下面就是修改源码:

//if ((*js)->s_id == sid)
//return OSIP_SUCCESS;
// modify by songxw 2017-12-01
if ((*js)->s_id == sid)
{
*jd = (*js)->s_dialogs;
return OSIP_SUCCESS;
}

红色部分为修改内容。这样刷新订阅就没问题了。

下面粘贴下订阅和刷新订阅的代码,提供一段系统目录订阅的函数:

//send subscribe
int CSExtRegister::SendSubSribe(void)
{//构建目录订阅代码string strSubXml = "";TCatalogSubscriReq CatalogSubscriReq;CatalogSubscriReq.nSn = GetSipBodySN();CatalogSubscriReq.strDevId = Username;CatalogSubscriReq.strBeginTime = "";CatalogSubscriReq.strEndTime = ""; BuildMsg(E_PT_CATALOG_SUBCRI_REQ,&CatalogSubscriReq, strSubXml, E_TRANPRO_SUBSCRIBE);int iRet = -1;osip_message_t* pSubScribeMsg = NULL; if (m_SubCatalogTid <= 0){//构建to地址char PToStr[128] = "";sprintf(PToStr,"sip:%s@%s:%d", Username, EpReg.TvsAddr.OutIpAddr, EpReg.TvsAddr.OutPort);char Proxy[SIP_AOR_MAX_SIZE+1] = "";snprintf(Proxy,SIP_AOR_MAX_SIZE, "sip:%s@%s:%d",Username, EpReg.TvsAddr.OutIpAddr, EpReg.TvsAddr.OutPort);char Contact[SIP_AOR_MAX_SIZE+1] = "";snprintf(Contact, SIP_AOR_MAX_SIZE, "sip:%s@%s:%d", CSBase::m_SipSvrPubID, CSBase::m_MyIpAddr, CSBase::m_MyPort);//第一次构造subscribeiRet = eXosip_subscribe_build_initial_request(&pSubScribeMsg, PToStr, CSBase::m_From, Proxy, "presence", m_SubCatalogTime);if (iRet != OSIP_SUCCESS || pSubScribeMsg == NULL){DBGPrint(M_SipUA, ERROR_LEVEL, "%s: build initial subscribe error for <%s>, iRet<%d>!", __FUNCTION__, Username, iRet);return -1;}osip_message_set_content_type(pSubScribeMsg, "Application/MANSCDP+xml");osip_message_set_body(pSubScribeMsg, strSubXml.c_str(), strlen(strSubXml.c_str()));//osip_message_set_contact(pSubScribeMsg, TmpBuf);m_SubCatalogTid = eXosip_subscribe_send_initial_request(pSubScribeMsg);if (m_SubCatalogTid <= 0){DBGPrint(M_SipUA, ERROR_LEVEL, "%s: send subscribe error for <%s>, m_SubCatalogTid<%d>!", __FUNCTION__, Username, m_SubCatalogTid);	return -1;}}else{//刷新构建subscrbeiRet = eXosip_subscribe_build_refresh_request(m_SubCatalogTid, &pSubScribeMsg);if (iRet != OSIP_SUCCESS || pSubScribeMsg == NULL){DBGPrint(M_SipUA, ERROR_LEVEL, "%s: build refresh subscribe error for <%s>, iRet<%d>!", __FUNCTION__, Username, iRet);return -1;}char        	TmpBuf[CLIP_BUFFER_SIZE+1] = {0};snprintf(TmpBuf, CLIP_BUFFER_SIZE, "%d", m_SubCatalogTime);osip_message_set_expires(pSubScribeMsg, TmpBuf);osip_message_set_content_type(pSubScribeMsg, "Application/MANSCDP+xml");osip_message_set_body(pSubScribeMsg, strSubXml.c_str(), strlen(strSubXml.c_str()));if (eXosip_subscribe_send_refresh_request(m_SubCatalogTid, pSubScribeMsg) != OSIP_SUCCESS){DBGPrint(M_SipUA, ERROR_LEVEL, "%s: send refresh subscribe error for <%s>, iRet<%d>!", __FUNCTION__, Username, iRet);return -1;}}return 0;
}







这篇关于视频监控安防平台-GB28181-exosip协议栈系统刷新订阅的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/631597

相关文章

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

JWT + 拦截器实现无状态登录系统

《JWT+拦截器实现无状态登录系统》JWT(JSONWebToken)提供了一种无状态的解决方案:用户登录后,服务器返回一个Token,后续请求携带该Token即可完成身份验证,无需服务器存储会话... 目录✅ 引言 一、JWT 是什么? 二、技术选型 三、项目结构 四、核心代码实现4.1 添加依赖(pom

基于Python实现自动化邮件发送系统的完整指南

《基于Python实现自动化邮件发送系统的完整指南》在现代软件开发和自动化流程中,邮件通知是一个常见且实用的功能,无论是用于发送报告、告警信息还是用户提醒,通过Python实现自动化的邮件发送功能都能... 目录一、前言:二、项目概述三、配置文件 `.env` 解析四、代码结构解析1. 导入模块2. 加载环

linux系统上安装JDK8全过程

《linux系统上安装JDK8全过程》文章介绍安装JDK的必要性及Linux下JDK8的安装步骤,包括卸载旧版本、下载解压、配置环境变量等,强调开发需JDK,运行可选JRE,现JDK已集成JRE... 目录为什么要安装jdk?1.查看linux系统是否有自带的jdk:2.下载jdk压缩包2.解压3.配置环境

springboot2.1.3 hystrix集成及hystrix-dashboard监控详解

《springboot2.1.3hystrix集成及hystrix-dashboard监控详解》Hystrix是Netflix开源的微服务容错工具,通过线程池隔离和熔断机制防止服务崩溃,支持降级、监... 目录Hystrix是Netflix开源技术www.chinasem.cn栈中的又一员猛将Hystrix熔

Linux查询服务器系统版本号的多种方法

《Linux查询服务器系统版本号的多种方法》在Linux系统管理和维护工作中,了解当前操作系统的版本信息是最基础也是最重要的操作之一,系统版本不仅关系到软件兼容性、安全更新策略,还直接影响到故障排查和... 目录一、引言:系统版本查询的重要性二、基础命令解析:cat /etc/Centos-release详

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

更改linux系统的默认Python版本方式

《更改linux系统的默认Python版本方式》通过删除原Python软链接并创建指向python3.6的新链接,可切换系统默认Python版本,需注意版本冲突、环境混乱及维护问题,建议使用pyenv... 目录更改系统的默认python版本软链接软链接的特点创建软链接的命令使用场景注意事项总结更改系统的默

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、