wvp-GB28181-pro 源码分析-查询设备信息和通道流程(二)

文章目录

  • 一、SIP通信方法介绍
    • 1.1 核心方法(Core Methods)
    • 1.2 扩展方法(Extension Methods)
  • 二、源码分析
    • 2.1 SIP协议处理过程
    • 2.2 查询设备信息的sip过程(CmdType=DeviceInfo)
      • 2.2.1 摄像机注册成功后,wvp会发命令查询设备信息
      • 2.2.2 查询信令发出
      • 2.2.3 处理设备查询返回的XML
    • 2.3 查询设备通道(目录)的sip过程(CmdType=Catalog)


2024年6月20日下载的wvp-GB28181-pro,版本号为2.7.2,使用ZLMediakit主干版本。

本节阐述sip通信步骤对应到wvp-gb28181-Pro中的代码。

一、SIP通信方法介绍

sip通信主要有6个核心方法和8个扩展方法。

1.1 核心方法(Core Methods)

SIP请求消息(方法Method)SIP操作
INVITE会话邀请
ACK确认会话邀请
CANCEL取消会话邀请
BYE结束会话
REGISTER注册
OPTIONS查询服务器能力

1.2 扩展方法(Extension Methods)

SIP请求消息(方法Method)SIP操作
Subscribe与所使用的用户代理商建立订阅,获取有关特定事件的通知
NOTIFYNOTIFY是用来由用户代理传达特定事件的发生
PUBLISHPUBLISH用于由用户代理发送的事件的状态信息
REFERREFER用于由一个用户代理来指另一个用户代理访问URI的对话框
INFOINFO所使用的用户代理发送呼叫信令信息,与它建立了一个媒体会话其他用户代理
UPDATEUPDATE用于修改会话的状态不改变对话的状态
PRACKPRACK用于确认收到临时响应(1XX)可靠传输
MESSAGE用来发送即时消息

二、源码分析

2.1 SIP协议处理过程

wvp针对这14个方法(注意wvp并没有全部实现14个方法),相应写了处理对象,如下图
在这里插入图片描述
将这些处理器RegisterRequestProcessor、MessageRequestProcessor等等Processor加入到SIPProcessorObserver观察者的容器中。
每一个processor中都有这个方法,用来添加消息处理的订阅。processor方法实现了InitializingBean类(不懂的可以去查),通过afterPropertiesSet()方法完成了消息的订阅。

@Override
public void afterPropertiesSet() throws Exception {// 添加消息处理的订阅sipProcessorObserver.addRequestProcessor(method, this);
}

当有相应方法的sip消息到来时,根据是Request还是Response,观察者将调用相应的Processor进行处理。
观察者SIPProcessorObserver类,在如下的包路径下

com.genersoft.iot.vmp.gb28181.transmit

观察者中的处理Request源码如下

    public void processRequest(RequestEvent requestEvent) {String method = requestEvent.getRequest().getMethod();ISIPRequestProcessor sipRequestProcessor = requestProcessorMap.get(method);if (sipRequestProcessor == null) {logger.warn("不支持方法{}的request", method);// TODO 回复错误玛return;}requestProcessorMap.get(method).process(requestEvent);}

处理Response的源码如下

    @Override@Async("taskExecutor")public void processResponse(ResponseEvent responseEvent) {Response response = responseEvent.getResponse();int status = response.getStatusCode();// Successif (((status >= Response.OK) && (status < Response.MULTIPLE_CHOICES)) || status == Response.UNAUTHORIZED) {CSeqHeader cseqHeader = (CSeqHeader) responseEvent.getResponse().getHeader(CSeqHeader.NAME);String method = cseqHeader.getMethod();ISIPResponseProcessor sipRequestProcessor = responseProcessorMap.get(method);if (sipRequestProcessor != null) {sipRequestProcessor.process(responseEvent);}if (status != Response.UNAUTHORIZED && responseEvent.getResponse() != null && sipSubscribe.getOkSubscribesSize() > 0 ) {CallIdHeader callIdHeader = (CallIdHeader)responseEvent.getResponse().getHeader(CallIdHeader.NAME);if (callIdHeader != null) {SipSubscribe.Event subscribe = sipSubscribe.getOkSubscribe(callIdHeader.getCallId());if (subscribe != null) {SipSubscribe.EventResult eventResult = new SipSubscribe.EventResult(responseEvent);sipSubscribe.removeOkSubscribe(callIdHeader.getCallId());subscribe.response(eventResult);}}}} else if ((status >= Response.TRYING) && (status < Response.OK)) {// 增加其它无需回复的响应,如101、180等} else {logger.warn("接收到失败的response响应!status:" + status + ",message:" + response.getReasonPhrase());if (responseEvent.getResponse() != null && sipSubscribe.getErrorSubscribesSize() > 0 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/354661.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

还在为Android开发找不到图片测试资源发愁吗? DummyImage来助你加速开发

使用 DummyImage 模拟电影应用数据 在开发和测试过程中&#xff0c;模拟数据是不可或缺的工具。它可以帮助我们在没有真实数据的情况下测试应用程序的功能和性能。本文将介绍如何使用 [DummyImage]https://dummyimage.com生成占位符图像来模拟电影应用的数据&#xff0c;并深入…

蓝牙技术|蓝牙耳机将成钥匙,佩戴时靠近设备即解锁

微软公司于今年 6 月 13 日获批一项技术专利&#xff0c;探索耳机验证技术&#xff0c;未来用户不仅可以拿耳机来听歌、通话&#xff0c;而且可以变身钥匙&#xff0c;配合其它计算设备进行身份验证。 微软在专利中概述称用户佩戴这款耳机之后&#xff0c;可以发出超声波信号…

国产数据库也开始堆砌功能了?试图在行业中炫技!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

每日一练:攻防世界:ewm

这道题我尝试了使用montagegaps解题&#xff0c;但是没有解出来&#xff0c;图片数量不是很多&#xff0c;可以尝试用PS直接拼图&#xff0c;但是这样学不到东西&#xff0c;我也就没尝试&#xff0c;直接看的官方WP 这段代码应该是改变工作目录到small&#xff0c;并且变量当…

【DevOps】Nginx配置文件详解与实战部署PHP站点

目录 引言 Nginx配置文件概述 基本结构 关键指令 Nginx配置文件实战 全局指令配置 HTTP指令配置 服务器指令配置 位置指令配置 实战部署PHP站点 步骤1&#xff1a;安装Nginx和PHP 步骤2&#xff1a;创建网站目录和文件 步骤3&#xff1a;配置Nginx服务器块 步骤4…

家具市场规模超7660亿美元,赛盈分销这些卧室家具在海外大卖!

今年&#xff0c;全球家具市场似乎表现都十分乐观。 根据海关出口总署的相关数据&#xff0c;我国的家具出口额1-5月份达到了2121.5亿元&#xff0c;同比增长20.5%。国内家具出口增速显著&#xff0c;换句话说&#xff0c;就是老外对家具又有更多的消费能力了。 在Statista的…

阿里云PAI大模型评测最佳实践

作者&#xff1a;施晨、之用、南茵、求伯、一耘、临在 背景信息 内容简介 在大模型时代&#xff0c;随着模型效果的显著提升&#xff0c;模型评测的重要性日益凸显。科学、高效的模型评测&#xff0c;不仅能帮助开发者有效地衡量和对比不同模型的性能&#xff0c;更能指导他…

深入浅出Git原理与Gitflow流程

1 Git原理 版本控制系统在软件开发和团队协作中扮演着至关重要的角色。它们帮助开发人员跟踪和管理代码的变化&#xff0c;协调多人同时编辑同一代码库&#xff0c;回溯历史版本&#xff0c;并解决代码冲突等问题。Git作为当今最流行的分布式版本控制系统&#xff0c;为开发人…

刷代码随想录有感(109):动态规划——01背包问题|一和零

题干&#xff1a; 代码 : class Solution { public:int findMaxForm(vector<string>& strs, int m, int n) {vector<vector<int>>dp(m 1, vector<int>(n 1, 0));dp[0][0] 0;for(string i : strs){int oneNum 0;int zeroNum 0;for(char c : i…

Web渗透:XSS-反射型存储型

跨站脚本攻击&#xff08;Cross-Site Scripting&#xff0c;XSS&#xff09;是一种常见的网络安全漏洞&#xff0c;它允许攻击者将恶意脚本注入到网页中&#xff0c;其他用户在浏览这些页面时&#xff0c;可能会执行这些恶意脚本&#xff0c;从而导致各种安全问题&#xff0c;如…

innovus:如何设置timing报告格式

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 在flow中添加如下设置即可设置好timing report的格式。 set report_timing_format [list timing_point arc net cell fanout load slew incr_delay delay arrival total_derate…

示例:WPF中应用MarkupExtention自定义IValueConverter

一、目的&#xff1a;应用MarkupExtention定义IValueConverter&#xff0c;使得应用起来更简单和高效 二、实现 public abstract class MarkupValueConverterBase : MarkupExtension, IValueConverter{public abstract object Convert(object value, Type targetType, object …

高考志愿选专业,文科生如何分析选择专业?

每到高考时节&#xff0c;学生们最关注的就是专业选择&#xff0c;以及未来职业发展问题&#xff0c;对于文科生来说&#xff0c;面对文科专业的众多选择&#xff0c;很多人都有些不知所措&#xff0c;如何选择适合自己兴趣爱好&#xff0c;又有良好就业前景的工作。从哪些方面…

Tailwind CSS 响应式设计实战指南

title: Tailwind CSS 响应式设计实战指南 date: 2024/6/13 updated: 2024/6/13 author: cmdragon excerpt: 这篇文章介绍了如何运用Tailwind CSS框架创建响应式网页设计&#xff0c;涵盖博客、电商网站及企业官网的布局实例&#xff0c;包括头部导航、内容区域、侧边栏、页脚…

18个机器学习核心算法模型总结

最强总结&#xff01;18个机器学习核心算法模型&#xff01;&#xff01; 大家好~ 在学习机器学习之后&#xff0c;你认为最重要的算法模型有哪些&#xff1f; 今儿的内容涉及到~ 线性回归逻辑回归决策树支持向量机朴素贝叶斯K近邻算法聚类算法神经网络集成方法降维算法主成…

哈喽GPT-4o——对GPT-4o 编程的思考与看法

GPT-4o&#xff08;“o”代表“全能”&#xff09;它可以接受任意组合的文本、音频和图像作为输入&#xff0c;并生成任意组合的文本、音频和图像输出。 &#x1f449; GPT功能&#xff1a; GPT-4o知识问答&#xff1a;支持1000token上下文记忆功能最强代码大模型Code Copilo…

通过噪声扰动缓解多模态大型语言模型的幻觉问题

摘要 该论文提出了一种名为NoiseBoost的方法&#xff0c;通过噪声扰动来缓解多模态大语言模型(MLLM)中的幻觉问题。论文分析指出&#xff0c;幻觉主要源于大语言模型固有的总结机制&#xff0c;导致对语言符号的过度依赖&#xff0c;而忽视了视觉信息。NoiseBoost通过在视觉特…

聊一聊 Monitor.Wait 和 Pluse 的底层玩法

一&#xff1a;背景 1. 讲故事 在dump分析的过程中经常会看到很多线程卡在Monitor.Wait方法上&#xff0c;曾经也有不少人问我为什么用 !syncblk 看不到 Monitor.Wait 上的锁信息&#xff0c;刚好昨天有时间我就来研究一下。 二&#xff1a;Monitor.Wait 底层怎么玩的 1. 案…

【JavaEE精炼宝库】多线程(7)定时器

目录 一、定时器的概念 二、标准库中的定时器 三、自己实现一个定时器 3.1 MyTimerTask 实现&#xff1a; 3.2 MyTimer 实现&#xff1a; 一、定时器的概念 定时器也是软件开发中的⼀个重要组件。类似于一个 "闹钟"。达到一个设定的时间之后&#xff0c;就执行…

时间复杂度的相关概念

1. 统计时间增长趋势 时间复杂度分析统计的不是算法运行时间&#xff0c;而是算法运行时间随着数据量变大时的增长趋势&#xff0c;也就是算法运行时间与输入数据的关系。 // 算法 A 的时间复杂度&#xff1a;常数阶 function algorithm_A(n) {console.log(0); } // 算法 B 的…