[笔记]ONVIF服务端实现[进行中...]

1.文档搜索:

从:https://www.cnblogs.com/liwen01/p/17337916.html

跳转到了:ONVIF协议网络摄像机(IPC)客户端程序开发(1):专栏开篇_onvif 许振坪-CSDN博客

1.1原生代码支持:

https://gstreamer.freedesktop.org/documentation/gst-rtsp-server/rtsp-onvif-server.html?gi-language=c 

我大概知道ONVIF的服务端涉及两个端口:

  1. 摄像头发现端口:udp 239.255.255.250:3702
  2. ONVIF协议侦听端口。 

大概率gstreamer能搞定后一个。前一个是个udp端口
 

2.ONVIF协议的分类:

Profile S:「网络摄像机」的技术规格,包括如何发送音视频流,音视频编码器配置,PTZ控制、中继控制等。
Profile C:「门禁控制系统(PACS)设备」的技术规格。
Profile G:「视频储存和录像」的技术规格,包括视频储存,搜索,检索,以及媒体播放功能的技术规格。
Profile A:「常见的例行门禁控制功能」的技术规范,适用于负责授予和撤销员工凭证、创建和更新计划表,以及对系统内门禁控制权限进行更改的安保人员、接待员或人力资源专员等用户。
Profile Q:「传输层安全性(TLS)」的技术规格,该安全通信协议使ONVIF合标设备能够以不受篡改和窃听威胁的方式在网络上与客户通讯。

S是等级最低的,在它之前似乎还有个T。这里是S的协议文档

然后我看到的文档里推荐下载这个:https://download.csdn.net/download/benkaoya/9818513

大概是中文版。

2.1 设备发现

参阅:https://blog.csdn.net/benkaoya/article/details/72476120

多播地址(Multicast Address)有很多,各个行业都不一样,IPC摄像头用的是239.255.255.250(端口3702)。多播地址的范围和分类可以见官方IANA(互联网地址分配机构)的说明:IPv4 Multicast Address Space Registry。 

import socket
import struct# 组播地址和端口
MULTICAST_GROUP = '239.255.255.250'
PORT = 3702def discover_onvif_devices():# 创建一个 UDP 套接字sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)# 设置多播 TTLsock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 32)# 允许重用地址sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)# 绑定到本地端口sock.bind(('', 3702))# 加入组播组mreq = struct.pack("4sl", socket.inet_aton(MULTICAST_GROUP), socket.INADDR_ANY)sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)# 构造 SSDP 请求ssdp_request = ('M-SEARCH * HTTP/1.1\r\n''HOST: 239.255.255.250:3702\r\n''MAN: "ssdp:discover"\r\n''MX: 1\r\n''ST: urn:schemas-xmlsoap-org:ws:2005:04:discovery\r\n''USER-AGENT: Python/1.0\r\n''X-User-Agent: redsonic\r\n''X-User-Agent: intel/1.0\r\n''\r\n')# 发送请求到多播地址sock.sendto(ssdp_request.encode(), (MULTICAST_GROUP , PORT))while True:try:# 设置接收超时时间sock.settimeout(10.0)# 接收响应response, _ = sock.recvfrom(1024)print(f'Received response:\n{response.decode()}')except socket.timeout:break# 退出组播组sock.setsockopt(socket.IPPROTO_IP, socket.IP_DROP_MEMBERSHIP, mreq)# 关闭套接字sock.close()if __name__ == "__main__":discover_onvif_devices()

对于多播的地址,理论上upd客户端是能够收到回应的。

但是它只能收到自己发送的信息。

使用另一个ONVIF客户端,抓包,抓到的是其他的东西:

<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsd="http://schemas.xmlsoap.org/ws/2005/04/discovery" xmlns:wsdp="http://schemas.xmlsoap.org/ws/2006/02/devprof"><soap:Header><wsa:To>urn:schemas-xmlsoap-org:ws:2005:04:discovery</wsa:To><wsa:Action>http://schemas.xmlsoap.org/ws/2005/04/discovery/Probe</wsa:Action><wsa:MessageID>urn:uuid:f3d90f52-4758-42ba-b3fc-d6785f0d6e4d</wsa:MessageID></soap:Header><soap:Body><wsd:Probe><wsd:Types>wsdp:Device</wsd:Types></wsd:Probe></soap:Body></soap:Envelope>

使用网络调试助手,同样没有回应。

3.实现:

作者推荐使用gSoap工具来提供ONVIF协议的解析。

而chatgpt的推荐是使用客户端工具,阅读源码来反向构建其服务程序:

  1. onvif-py

    • 这个库有一个模块化结构,可以用来创建一个支持 ONVIF 协议的服务端。但它主要是作为一个 ONVIF 客户端库,因此你需要阅读源代码来了解如何使用它来创建服务端。这需要一定的编程知识。
  2. onvif_zm(用于 ZoneMinder):

    • 这个库原本是为 ZoneMinder 设计的,用于实现与 ONVIF 设备的通讯。虽然它是作为客户端库,但了解其工作原理后,你可以参考其代码来构建服务端。
  3. onvif.server

    • 这个库是 ONVIF 服务器的一个实现,它支持标准的 ONVIF 服务如 Discovery、Device、Media、PTZ、Event 等。这个库提供了创建和管理 ONVIF 服务器所需的所有基本功能。

4.FAQ 

4.1 什么是gSoap?

gSOAP 是一个开源的 C 语言库,用于开发 Web 服务和客户端。它简化了 SOAP(Simple Object Access Protocol)和 XML 相关的通信,使得在 C 语言应用程序中实现 Web 服务变得更容易。gSOAP 提供了自动化的工具来生成 C 语言的客户端和服务器端代码,从而支持 Web 服务的创建和消费。

以下是 gSOAP 的一些关键特点:

  1. SOAP 支持:gSOAP 实现了 SOAP 1.1 和 SOAP 1.2 协议,使得开发人员可以通过简单的接口来创建和解析 SOAP 消息。

  2. WSDL 支持:gSOAP 可以从 WSDL(Web Services Description Language)文件自动生成 C 语言代码,简化了 Web 服务的客户端和服务器端的开发。

  3. 轻量级:gSOAP 设计为一个轻量级库,适合嵌入式和资源有限的环境。

  4. 高效:gSOAP 具有高效的解析和序列化功能,可以处理大量的数据交换。

  5. 灵活性:它支持多种数据格式,包括 XML 和 JSON。

  6. 跨平台:gSOAP 是跨平台的,可以在多种操作系统上使用,包括 Windows、Linux 和 macOS。

  7. XML 和 JSON 处理:除了 SOAP,gSOAP 还提供对 XML 和 JSON 数据格式的处理支持。

使用 gSOAP,可以快速地将现有的 C 语言应用程序与 Web 服务集成,实现分布式计算和数据交换。

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

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

相关文章

Linux——管理本地用户和组(详细介绍了Linux中用户和组的概念及用法)

目录 一、用户和组概念 &#xff08;一&#xff09;、用户的概念 &#xff08;二&#xff09;、组的概念 补充组 主要组 二、获取超级用户访问权限 &#xff08;一&#xff09;、su 命令和su -命令 &#xff08; 二&#xff09;、sudo命令 三、管理本地用户账户 &…

ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH?

ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH? 目录 ERROR: Cannot find command ‘git’- do you have ‘git’ installed and in your PATH? 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/61780…

Transformer自然语言处理实战pdf阅读

一.第一章 欢迎来到transformer的世界 1.解码器-编码器框架 在Transformer出现之前&#xff0c;NLP的最新技术是LSTM等循环架构。这些架 构通过在神经网络连接使用反馈循环&#xff0c;允许信息从一步传播到另一 步&#xff0c;使其成为对文本等序列数据进行建模的理想选择。如…

图片检查 python脚本

图片检查 python脚本 import os from PIL import Imagedef is_image_broken(image_path):try:img Image.open(image_path)img.verify() # Verify that it is, in fact an imagereturn Falseexcept (IOError, SyntaxError) as e:return Truedef check_images_in_directory(di…

Unity分享:继承自MonoBehaviour的脚步不要对引用类型的字段在声明时就初始化

如果某些字段在每个构造函数中都要进行初始化&#xff0c;很多人都喜欢在字段声明时就进行初始化&#xff0c;对于一个非继承自MonoBehaviour的脚步&#xff0c;这样做是没有问题的&#xff0c;然而继承自MonoBehaviour后就会造成内存的浪费&#xff0c;为什么呢&#xff1f;因…

多模态大模型应用中的Q-Former是什么?

多模态大模型应用中的Q-Former是什么&#xff1f; Q-Former是一种新型的神经网络架构&#xff0c;专注于通过查询&#xff08;Query&#xff09;机制来改进信息检索和表示学习。在这篇博客中&#xff0c;我们将详细探讨Q-Former的工作原理、应用场景&#xff0c;并在必要时通过…

pyqt designer使用spliter

1、在designer界面需要使用spliter需要父界面不使用布局&#xff0c;减需要分割两个模块选中&#xff0c;再点击spliter分割 2、在分割后&#xff0c;再对父界面进行布局设置 3、对于两边需要不等比列放置的&#xff0c;需要套一层 group box在最外层进行分割

大数据学习之Flink基础

Flink基础 1、系统时间与时间时间 系统时间&#xff08;处理时间&#xff09; 在Sparksreaming的任务计算时&#xff0c;使用的是系统时间。 假设所用窗口为滚动窗口&#xff0c;大小为5分钟。那么每五分钟&#xff0c;都会对接收的数据进行提交任务. 但是&#xff0c;这里有…

GoogleCTF2023 Writeup

GoogleCTF2023 Writeup Misc NPC Crypto LEAST COMMON GENOMINATOR? Web UNDER-CONSTRUCTION NPC A friend handed me this map and told me that it will lead me to the flag. It is confusing me and I don’t know how to read it, can you help me out? Attach…

VSCode切换默认终端

我的VSCode默认终端为PowerShell&#xff0c;每次新建都会自动打开PowerShell。但是我想让每次都变为cmd&#xff0c;也就是Command Prompt 更改默认终端的操作方法如下&#xff1a; 键盘调出命令面板&#xff08;CtrlShiftP&#xff09;中,输入Terminal: Select Default Prof…

Hisilicon 适配新遥控器

Hisilicon 适配新遥控器 适配NEC红外遥控器: 相关文档: Android解决方案开发指南:输入 红外驱动使用说明及注意事项 Application Notes HMS 开发指南:IR HMS sample 使用指南:IR 1、查看公版遥控器 sample_ir 没有此命令,不是没有编译打开,而是名字变成ir_user:…

Java 中的Stream流

Stream流就像工厂中的流水线操作。 如何使用Stream&#xff1f; 1、首先要获取Stream流&#xff0c;那么如何获取呢? 对于不同的数据&#xff0c;有不同的获取方法。 ①单列集合 方法名说明default Stream<E> stream()Collection接口中的默认方法 所以实现了Colle…

Multi Range Read与Covering Index是如何优化回表的?

上篇文章末尾我们提出一个问题&#xff1a;有没有什么办法可以尽量避免回表或让回表的开销变小呢&#xff1f; 本篇文章围绕这个问题提出解决方案&#xff0c;一起来看看MySQL是如何优化的 回表 为什么会发生回表&#xff1f; 因为使用的索引并没有整条记录的所有信息&…

使用shell脚本在Linux主机上创建一个admin账号,并将uid配置为特定值

#!/bin/bash #说明&#xff1a;在当前主机上创建一个admin账号&#xff0c;将uid设置为1101&#xff1b; #如果账号已存在&#xff0c;则要判断uid是否为1101&#xff0c;不是的话则配置为1101&#xff1b; #如果系统中已存在其它账号使用了1101这个uid&#xff0c;则要提前变更…

AI学习指南机器学习篇-半监督聚类Python实践

AI学习指南机器学习篇-半监督聚类Python实践 在机器学习领域&#xff0c;聚类是一种常见的算法&#xff0c;它可以帮助我们对数据进行分组和分类。而在现实世界中&#xff0c;我们往往会面临一种情况&#xff1a;我们拥有一些有标签的数据&#xff08;已知类别&#xff09;&am…

DataEase一键部署:轻松搭建数据可视化平台

DataEase是一个开源的数据可视化和分析工具&#xff0c;旨在帮助用户轻松创建和共享数据仪表盘。它支持多种数据源&#xff0c;包括关系型数据库&#xff0c;文件数据源&#xff0c;NoSQL数据库等&#xff0c;提供强大的数据查询、处理和可视化功能。DataEase 不仅是一款数据可…

VMware虚拟机中CentOS7自定义ip地址并且固定ip

配置固定ip(虚拟机) 前提&#xff1a;虚拟机网络配置成&#xff0c;自定义网络并选择VMnet8(NAT 模式) 操作(如下图)&#xff1a;点击虚拟机–》设置–》–》硬件–》网络适配器–》自定义&#xff1a;特定虚拟网络–》选择&#xff1a;VMnet8(NAT 模式) 虚拟机网络设置 需要记…

【漏洞复现】Jenkins CLI 接口任意文件读取漏洞(CVE-2024-23897)

漏洞简介 Jenkins是一款基于JAVA开发的开源自动化服务器。 Jenkins使用args4j来解析命令行输入&#xff0c;并支持通过HTTP、WebSocket等协议远程传入命令行参数。在args4j中&#xff0c;用户可以通过字符来加载任意文件&#xff0c;这导致攻击者可以通过该特性来读取服务器上…

论文快过(图像配准|Coarse_LoFTR_TRT)|适用于移动端的LoFTR算法的改进分析 1060显卡上45fps

项目地址&#xff1a;https://github.com/Kolkir/Coarse_LoFTR_TRT 创建时间&#xff1a;2022年 相关训练数据&#xff1a;BlendedMVS LoFTR [19]是一种有效的深度学习方法&#xff0c;可以在图像对上寻找合适的局部特征匹配。本文报道了该方法在低计算性能和有限内存条件下的…

PMP-敏捷项目管理实践-敏捷Scrum实践

你好!我是 Lydia-穎穎 ♥感谢你的陪伴与支持 ~~~ 欢迎一起探索未知的知识和未来,现在lets go go go!!! 前言 敏捷思维模式由价值观定义,以原则为指导,并在许多不同的实践中体现。具体的实践方法包括但不限于Scrum、XP(极限编程)、看板、TDD(测试驱动开发)等。可根据不…