ONVIF协议了解

news2025/1/18 3:16:03

第一部分:ONVIF理论基础

一. 为什么要用ONVIF协议:

IPC厂商主流的遵循的是RTSP协议进行推流,那么RTSP最重要的就是RTSP的URL地址。但是各个厂商的URL地址格式都不一样,所以就诞生了一个标注协议—ONVIF。ONVIF协议的出现,解决了不同厂商之间开发的各类产品不能融合使用的难题,提供了统一的网络视频开发标准。即最终能投通过ONVIF这个标准化的平台实现不同产品之间的集成。

二.什么是ONVIF协议:

Onvif,即Open Network Video Interface Forum ,可以译为开放型网络视频接口论坛,是安迅士、博世、索尼在2008年共同成立的一个国际性、开发型网络视频产品标准网络接口的开发论坛,后来由于这个技术开发论坛共同制定的开发型行业标准,就用该论坛的大写字母命名,即ONVIF 网络视频标准规范,习惯简称为:ONVIF协议。

三. ONVIF的功能:

ONVIF协议提供了安防行业几乎所有功能接口的一个集合,包括如上设备搜发现,媒体配置,设备管理等等。

在这里插入图片描述

四.ONVIF协议的IPC拉流步骤:

第一步:设备发现,在客户端设备(室内机)与服务端设备(IPC)接入到同一个局域网下面。通过ONVIF的设备搜索发现功能,获取到IPC的onvif 的入口地址。
第二步:获取媒体服务地址,也就是获取ONVIF的媒体相关的功能入口地址。
第三步:获取媒体信息,获取IPC支持哪些硬件参数,比如编码格式,几路码流等。
第三步:获取媒体的编码配置。
第四步:设置媒体的编码配置(可选)。
第五步:获取URL,获取RTSP拉流的地址。
第六步:采用ffmpeg或者live555进行音视频拉流。

在第一步完成后,还有最重要的一个环节------设备鉴权也就是设备安全认证,获取IPC信息是需要账号和密码登录才能进项进行相关的操作。所以在此有一个鉴权过程。
五.鉴权认证:
ONVIF协议的绝大多数部分数据请求都是需要鉴权认证的,所以鉴权是非常重要的基础部分内容。一般基础的鉴权信息都是用户名加密码,ONVIF是支持明文传输的,但是不太建议使用,而且市面上的IPC绝大多部分是不支持明文传输。

POST /onvif/device_service HTTP/1.1
Host: 192.168.170.100
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 789

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelopexmlns:soap="http://www.w3.org/2003/05/soap-envelope"xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:tt="http://www.onvif.org/ver10/schema">
  <s:Header xmlns:s="http://www.w3.org/2003/05/soap-envelope">
    <wsse:Securityxmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
      <wsse:UsernameToken>
        <wsse:Username>admin</wsse:Username>
        <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">EVpXS/7yc/vDo+ZyIg+cc0fWdMA=</wsse:Password>
        <wsse:Nonce>%s</wsse:Nonce>
        <wsu:Created>%s</wsu:Created>
      </wsse:UsernameToken>
    </wsse:Security>
  </s:Header>
  <soap:Body>
    <tds:GetDeviceInformation />
  </soap:Body>
</soap:Envelope>

这个是在设备上抓包获取的鉴权认证包。在“UsernameToken”节点下面有四个非常重要的成员。

1.Username:用户名。
2.Password:加密后的密码数据,用于IPC校验。
3.Nonce:一个随机数的base64编码,最好保证每次的Nonce值是唯一的,因为有的厂家会对Nonce进行次数的有效性验证,即相同的Nonce的验证次数有限,在多并发的场景下,很容易会忽略导致验证失败,可以以当前的毫秒数+随机数为Nonce的源数据进行base64编码。
(备注:Base64编码的作用由于某些系统中智能使用ASCII字符。Base64就是将非ASCII码的数据转成ASCII字符的一种方法。也是一种比较简单的加密方式)
4.Created:创建的日期信息。用来加密Password数据。
其中四个变量缺一就会鉴权失败,在编程过程中,Username,Nonce,Created和明文密码是已经知道的,那么Password也是通过相关的公式获取的。其公式如下:

Password = Base64Encode(SHA1(BASE64Decode(Nonce) + Created + password(明文密码)))

第二部分:嵌入式平台适配ONVIF部分协议

第一种方法移植官方的“gSOAP”到开发板上面,这种方法网上很多教程,但是我生成的代码非常的庞大,后续有空再分析,下面主要讲解第二种方法,通过TCP通讯手动解析IPC往来XML数据来适配ONVIF协议。

一. 设备发现协议(WS-Discovery)原理

传统的Web Service服务调用的模式为:客户端在设计时就预先知道目标服务的地址和端口,然后客户端基于这个地址进行服务调用。那如果客户端预先不知道目标服务的地址该怎么办呢?WS-Discovery(Web Services Dynamic Discovery)标准就是用于解决该问题,遵循该标准,客户端预先不知道目标服务地址的情况下,可以动态的探测到可用的目标服务,以便进行服务调用。这个技术规范定义了一套多播发现协议来定位服务,它工作在TCP和UDP的3702的端口,其使用的组播IP为239.255.255.250(IPV4)和FF02::C(IPV6)。

二.发起Probe信息发现IPC

详情查阅代码。

三. IPC鉴权认证

详情查阅代码

四. 获取IPC的URL

详情查阅代码

第三部分:ONVIF库相关接口说明

在使用接口之前请先在onvif需要的xml资源文件放在/etc/config/onvif下面

bool sat_ipcamera_device_online_search(void)
函数 搜索连接在同一个局域网IPC(ONVIF)设备
返回值 true:执行成功 false:执行失败

int sat_ipcamera_online_num_get(void)
函数 获取搜索的设备的总数
返回值 返回搜索设备的总数

bool sat_ipcamera_user_password_set(int index, const char *username, const char *password)
函数 依据索引添加对应IPC的账号和密码
index 需要添加账号和密码的设备索引
username 设备的账号
password 设备的明文密码
返回值 false:添加失败,true:添加成功

bool sat_ipcamera_rtsp_url_get(int index)
函数 依据索引获取对应IPC的RTSP地址
index 需要获取设备URL索引
返回值 true:执行成功,false:执行失败

const char *sat_ipcamera_ipaddr_get(int index)
函数 依据索引获取对应IPC的IP
index 需要获取设备IP索引
返回值 执行成功,获取对应的IP,执行失败返回NULL

const char *sat_ipcamera_username_get(int index)
函数 依据索引获取对应IPC的账号
index 需要获取设备账号索引
返回值 执行成功,获取对应的账号,执行失败返回NULL

const char *sat_ipcamera_password_get(int index)
函数 依据索引获取对应IPC的密码(明文)
index 需要获取设备密码的索引
返回值 执行成功,获取对应的密码,执行失败返回NULL

const char *sat_ipcamera_door_name_get(int index)
函数 依据索引获取对应IPC的别名
index 需要获取设备别名的索引
返回值 执行成功,获取对应的别名,执行失败返回NULL

bool sat_ipcamera_door_name_set(int index, const char *name)
函数 依据索引设置对应IPC的别名
index 需要设置设备别名的索引
name 设置的别名
返回值 true:执行成功,false:执行失败

bool sat_ipcamera_rtsp_addr_get (int index, int ch)
函数 依据索引和码流通道获取RTSP地址
index 需要获取URL的索引
Ch 需要获取RUL的码流通道
返回值 执行成功,获取到URL,执行失败返回NULL

int sat_ipcamera_profile_token_num_get (int index)
函数 依据索引获取码流通道个数
index 需要获取设备通道的索引
返回值 执行成功,获取对应通道数,执行失败返回-1

bool sat_ipcamera_status_get(void);
函数 获取ipcamera的状态
返回值 True:正在工作,false:空闲状态

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

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

相关文章

开源赋能 普惠未来|QUICKPOOL诚邀您参与2023开放原子全球开源峰会

QUICKPOOL算力调度系统的诞生和发展&#xff0c;为广大的算力领域从业者和技术开发者&#xff0c;提供了一条中国技术路线&#xff0c;并与IBM LSF、SLURM、PBS、SGE等产品&#xff0c;共同助力全球算力发展。QUICKPOOL算力调度系统成熟、稳定&#xff0c;具备“超算&智算”…

MATLAB 搜索某一点的K邻近点(12)

MATLAB 搜索某一点的K邻近点(12) 前言一、算法介绍1.1 :无序点云的K邻近点搜索1.2 :有序点云的K邻近点搜索二、具体实现示例2.1 算法一 (含详细注释)2.2 算法二 (含详细注释)前言 在点云处理中,最基本的算法之一就是搜索某一点的近邻点(1个最近或多个邻近),这在重…

MySQL数据库学习笔记(八)实验课五之数据库系统设计

一上来就实验课五了&#xff0c;实验课四呢&#xff1f;实验课四的内容是添加索引&#xff0c;差不多就是那样。 这次实验课的内容感觉就有点硬核了&#xff0c;数据库系统设计。 重点&#xff1a; 记录下我在实验里面遇到的一些问题 1&#xff0c;E-R图绘制 我是用drawio绘…

Rancher1.6高可用架构设计与实现思路

文章目录 [toc] 1.架构图2.建立数据导入脚本2.1 单机运行命令2.2 导出单机容器中的数据库文件2.3 dump文件 3.启动命令4.总结 1.架构图 架构说明&#xff1a;本文重点是rancher1.6.17的多实例共用一个数据库持久化数据&#xff0c;对于前置的负载均衡和mysql5.7的高可用不做过多…

linux 框架学习法

学习视频&#xff1a;【北京迅为】再谈Linux学习方法-框架学习法 学习UBOOT 框架学习法 linux基础框架 文件系统框架 bootloader是上电后执行的第一个程序bootloader会引导linux内核&#xff0c;会执行zimagelinux内核会挂载文件系统&#xff0c;文件系统可大可小&#xff0c;…

Go语言gin框架项目:按模板导出excel并在网页端下载,并将此接口完成swagger的配置

1.需求 甲方的需求是以这种格式导出一个开工通知单 前端页面是这个样子&#xff1a; 前端勾选一部分部室&#xff0c;后端根据勾选的这些部室名称进行查询&#xff0c;将查询到的部室主任名字填充到表格对应的位置中&#xff0c;另外将前端传过来的信息都填充到表格的指定位置…

4.1 一级存储结构

本节介绍 GPU 上的一级缓存结构&#xff0c;重点介绍统一的 L1 数据缓存和暂存器“共享内存”&#xff0c;以及它们如何与计算核心交互。 我们还简要讨论了 L1 纹理缓存的典型微架构。 我们包括对纹理缓存的讨论&#xff0c;虽然它在 GPU 计算应用程序中的使用有限&#xff0c;…

前端GC垃圾回收机制

js中的管理是自动的&#xff0c;对象不再被引用时就是垃圾&#xff0c;不能从根上访问时也是垃圾。 能够访问到的对象就是可达对象&#xff08;引用&#xff0c;作用域链&#xff09;&#xff0c;可达的标准就是从根触发是否能够被找到&#xff0c;根可以理解为是全局变量。 …

【机器学习】 - 作业7: 某闯关类手游用户流失预测

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…

并发和线程

并行和并发 1.并行跟并发有什么区别&#xff1f; 从操作系统的角度来看&#xff0c;线程是CPU分配的最小单位。 并行就是同一时刻&#xff0c;两个线程都在执行。这就要求有两个CPU去分别执行两个线程。 并发就是同一时刻&#xff0c;只有一个执行&#xff0c;但是一个时间段…

详解HTTPS加密过程

目录 前言 HTTPS是什么 HTTPS的工作过程 引入对称加密 引入非对称加密 引入证书 总结 前言 对于HTTP上篇文章已经做了详细的解释了。众所周知&#xff0c;HTTPS要比HTTP要安全&#xff0c;但是为什么HTTPS要比HTTP安全呢&#xff1f; 这篇文章主要研究HTTPS的加密机制…

操作系统-X18 linux日志审计

Linux日志审计 在unix/类unix&#xff08;Linux&#xff09;系统中&#xff0c;日志是内核&#xff08;内存&#xff09;的一部分。 用于记录系统、程序运行中发生的各种事件 通过阅读日志&#xff0c;有助于诊断和解决系统故障 日志文件的分类 ①内核及系统日志 由系统sysl…

队列及其实现

目录 一&#xff1a;队列 1.队列的概念及结构 2.队列的实现 <1>.初始化队列 <2>.队尾入队列 <3>.队头出队列 <4>.获取队列头部元素 <5>.获取队列队尾元素 <6>.获取队列中有效元素个数 <7>.销毁队列 二&#xff1a;完整代…

如何完全卸载IDEA

工欲善其事必先利其器&#xff0c;我们在用idea的时候&#xff0c;idea的环境出现了莫名其妙的问题&#xff0c;怎么也找不到问题原因。有时候也可能是安装了不知名VB脚本&#xff0c;给系统装了一大堆的环境变量(如下图所示)&#xff0c;这个时候你可以试着把idea卸载重新安装…

Jetpack Compose UI预览

Android开发 Jetpack_Compose_2 UI预览Preview 前言 在学习jetpack compose如何编写ui之前&#xff0c;我认为还是应该先了解与Android studio配合的UI预览Preview。 这样就可以立刻看到UI效果&#xff0c;从而方便后续学习验证代码。 所需依赖 implementation "androidx…

CAPL(vTESTStudio) - 自动创建带有时间戳的报告和log

目录 getLocalTime - 获取本地时间函数 代码示例 获取当前时间并形成格式:"2023_05_22_23_20_18"

Qt中的坐标系

Qt中的坐标系 Qt中的坐标系与win10上画图工具的联系 上面这个图片的水印挡住了重要信息,然后又截了一张,显然,画图工具的像素就是Qt中的坐标系,所以,以后查坐标系直接打开Qt:画笔位置所显示的像素就是Qt的坐标!!! 再总结一下: 好奇:win10上的画图工具是qt写的吗? 答: 不是…

【SpringCloud】Nacos

文章目录 一、Nacos1、安装2、服务注册和发现3、服务分级存储模型4、负载均衡策略--NacosRule5、服务实例的权重设置 一、Nacos 1、安装 官网&#xff1a;https://nacos.io/zh-cn/ 下载 Github主页: https://github.com/alibaba/nacos Github的Release下载页: https://githu…

linux命令行如何查看命令帮助信息

一&#xff0c;简介 “授之以鱼不如授之以渔”&#xff0c;我们再学习linux命令的时候&#xff0c;想查看某个命令的详细说明&#xff0c;有哪些方法呢&#xff1f;本文来介绍一下如何在命令行查找命令的帮助信息。 二&#xff0c;linux命令格式介绍 Linux命令一般由三部分组…

【深度学习】- 作业1: Softmax实现手写数字识别

课程链接: 清华大学驭风计划 代码仓库&#xff1a;Victor94-king/MachineLearning: MachineLearning basic introduction (github.com) 驭风计划是由清华大学老师教授的&#xff0c;其分为四门课&#xff0c;包括: 机器学习(张敏教授) &#xff0c; 深度学习(胡晓林教授), 计算…