Elixir 通过Onvif 对IP设备进行控制时,可以使用 ExOnvif 库。ExOnvif官方文档

此文章仅提供了ContinuousMove的控制方式及示例。

Elixir Onvif协议控制IP设备的其他命令,可以参考以下链接

绝对移动 【AbsoluteMove】

调用指定预置位 【GotoPreset】

停止运动 【Stop】

获取预置位列表 【GetPresets】

1. ContinuousMove

ExOnvif官方文档中未给出摄像机连续运动命令,自己按照onvif协议 Onvif协议 扩展的此项功能;

连续移动的命令 ContinuousMove,属于PTZ服务的一部分,允许客户端向网络摄像机或其他视频监控设备发送指令,以使云台持续平移(Pan)、倾斜(Tilt)、变焦(Zoom)。 这个操作让监控人员能够灵活地追踪移动的目标或调整视角,而不仅仅是跳转到预设的位置。
请添加图片描述
由以上协议可以看出,控制摄像机连续移动,需要参数2个

  • ProfileToken:ProfileToken指定执行PTZ操作的配置文件标识符,必须先从设备获取有效的ProfileToken。
  • Velocity:PTZ参数,PanTilt定义了平移和倾斜的速度,x轴通常对应水平方向(Pan),y轴对应垂直方向(Tilt)。正值表示正方向移动,负值反之。Zoom定义了变焦速度,值为0通常意味着不改变当前变焦状态。

2. 函数实现

程序实现步骤如下

  • 初始化Device设备
  • 获取Device设备的ProfileToken
  • 控制设备

完整的文件:

defmodule MvOnvif.Action douse GenServer@moduledoc """自定义的Onvif的部分协议获取当前状态(exonvifabsolute move调用摄像头到指定位置,continuous move摄像头连续移动调用指定预置位停止运动"""import ExOnvif.Utils.XmlBuilderimport SweetXmlalias ExOnvif.Devicealias ExOnvif.Media2import ExOnvif.Utils.ApiClient, only: [ptz_request: 4]# 初始化device设备defp get_device(uri) when not is_nil(uri) do%{host: host, userinfo: userinfo} =  URI.parse(uri)[user, pw] = String.split(userinfo, ":")Device.new("http://" <> host, user, pw);enddefp get_device(uri) do:errorend # 获取profiletoken标识符defp get_main_stream_profile_token(device) doprofiles = Media2.get_profiles(device)case profiles do{:ok, list} -> {:ok, hd(list).reference_token}_ -> "something went wrong"endend@spec mv_continuous_move(ExOnvif.Device.t(), ExOnvif.PTZ.AbsoluteMove.t()) :: {:ok, String.t()} | {:error, any()}def mv_continuous_move(device, ab_m) dobody = encode(ab_m)ptz_request(device, "ContinuousMove", body, fn resp -> :ok end )end# 按照xml格式编码def encode(absolute_move) doelement("tptz:ContinuousMove",[element("tptz:ProfileToken", absolute_move.profile_token),element("tptz:Velocity", Vector.encode(absolute_move.speed))])end# 摄像头连续移动def continuous_move_(uri, speed \\ {0.5, 0.5, 0.1}) dowith {:ok, device} <- get_device(uri),{:ok, profile_token} <- get_main_stream_profile_token(device)do{x, y, z} = speedspeed =  %ExOnvif.PTZ.Vector{pan_tilt: %ExOnvif.PTZ.Vector.PanTilt{x: x,y: y},zoom: z}abm = ExOnvif.PTZ.AbsoluteMove.new(profile_token, nil, speed)mv_continuous_move(device, abm)endend
end
停止移动 参考连接

3. xml文件示例

连续运动请求的标准xml文件示例
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelopexmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"xmlns:wsdl="http://www.onvif.org/ver20/ptz/wsdl"xmlns:tt="http://www.onvif.org/ver10/schema"><SOAP-ENV:Header><!-- 安全认证头 --><Security SOAP-ENV:mustUnderstand="true"xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"><UsernameToken><Username>admin</Username><Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest"><!-- 加密密码(示例值) -->dGhpcyBpcyBub3QgYSByZWFsIHBhc3N3b3JkIEJhc2U2NA==</Password><Nonce>eUYbbbyFbcLbcByKUvbcsA==</Nonce><Created>2025-08-14T10:30:00.000Z</Created></UsernameToken></Security></SOAP-ENV:Header><SOAP-ENV:Body><wsdl:ContinuousMove><!-- 必填参数:配置集Token --><wsdl:ProfileToken>Profile_1</wsdl:ProfileToken><!-- 必填参数:运动速度向量 --><wsdl:Velocity><tt:PanTilt x="0.5" y="0.0" space="http://www.onvif.org/ver10/tptz/PanTiltSpaces/VelocityGenericSpace"/><tt:Zoom x="0.0" space="http://www.onvif.org/ver10/tptz/ZoomSpaces/VelocityGenericSpace"/></wsdl:Velocity><!-- 可选参数:超时时间(单位:秒) --><!-- <wsdl:Timeout>PT30S</wsdl:Timeout> --></wsdl:ContinuousMove></SOAP-ENV:Body>
</SOAP-ENV:Envelope>

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

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

相关文章

android studio JNI 环境配置实现 java 调用 c/c++

1、在 app 级的 build.gradle 文件配置两个地方 android{ defaultConfig{ // 在 defaultConfig 里配置下面代码 externalNativeBuild { cmake { cppFlags "-frtti -fexceptions"//添加对 c 的异常处理支持 …

静态时序分析详解之时序路径类型

目录 一、概览 二、时序路径 2.1 数据路径 2.2 时钟路径 2.3 时钟门控路径 2.4 异步路径 2.5 关键路径 2.6 False路径 2.7 单周期路径 2.8 多周期路径 2.9 最长路径和最短路径 三、参考资料 一、概览 ​ ​静态时序分析通过模拟最差条件下分析所有的时序路径&am…

SpringBoot埋点功能技术实现方案深度解析:架构设计、性能优化与扩展性实践

SpringBoot埋点功能技术实现方案深度解析&#xff1a;架构设计、性能优化与扩展性实践 1. 原理剖析与技术实现细节 1.1 埋点技术基本原理 埋点&#xff08;Tracking&#xff09;是通过在代码中植入特定逻辑&#xff0c;收集用户行为数据、系统运行状态和业务指标的技术手段。在…

自建prometheus监控腾讯云k8s集群

自建prometheus监控腾讯云k8s集群 使用场景 k8s集群&#xff08;腾讯云容器服务&#xff09; promtheus (外部自建服务) 腾讯云提供了容器内部自建 Prometheus 监控 TKE 集群的文档&#xff0c;参考。 当前的环境promethues建在k8S外的云服务器上&#xff0c;与上面链接文…

2025高教社国赛数学建模C题参考论文(含模型和代码)

2025 年高教社杯大学生数学建模竞赛 C 题参考论文 目录 NIPT 的时点选择与胎儿的异常判定 摘要 1 问题重述 2 问题分析 2.1 问题 1 分析 2.2 问题 2 分析 2.3 问题 3 分析 2.4 问题 4 分析 3 模型假设与符号定义 3.1 模型假设 4. 孕周在 10-25 周内检测有…

iOS开发环境搭建及打包流程

一、下载xcode 直接去苹果商店的appstore下载就行 二、clone项目 1.登录xcode苹果账号或对应代码仓库账号 2.clone项目 3.安装设备真机环境&#xff08;未安装过的话&#xff09; 三.安装cocoapods 1. 检查并更新 Ruby 环境 CocoaPods 是基于 Ruby 编写的&#xff0c;因此…

数据结构之链表(单向链表与双向链表)

一&#xff0c;链表描述链表是一种常见的重要的数据结构,是动态地进行存储分配的一种结构。常用于需存储的数据的数目无法事先确定。1.链表的一般结构链表的组成&#xff1a; 头指针&#xff1a;存放一个地址&#xff0c;该地址指向一个元素 结点&#xff1a;用户需要的实际数据…

从反向代理到负载均衡:Nginx + Tomcat 构建高可用Web服务架构

从反向代理到负载均衡&#xff1a;Nginx Tomcat 构建高可用Web服务架构 文章目录从反向代理到负载均衡&#xff1a;Nginx Tomcat 构建高可用Web服务架构一、基础铺垫&#xff1a;什么是反向代理&#xff1f;1.1 反向代理的核心原理1.2 Nginx反向代理实战配置步骤1&#xff1a…

Simulink中使用Test sequence单元测试

一、Tips 在对simulink模型进行Test sequence单元测试时&#xff0c;如果采取书写测试用例的话&#xff0c;有以下操作。 1、使用”fprintf(‘time%f\n’, t);“来打印当前step的时间&#xff1b; 二、数据类型转换 1、double类型 -> boolean类型 clc; clear all;% 1、doubl…

【mysql】SQL自连接:什么时候需要,什么时候不需要?

SQL自连接:什么时候需要,什么时候不需要? 通过具体示例和对比解析,彻底搞懂SQL自连接的使用场景 在处理SQL查询时,尤其是当表中存在自引用关系(如referee_id引用同一张表的id)时,很多开发者会疑惑:这个查询到底需不需要自连接?本文将通过多个具体示例,带你彻底弄清何…

「美」创新在于人,而不是产品 - AxureMost 落葵网

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 第一章&#xff1a;创新的心理学 创新与心理安全 蜡烛问题&#xff1a;卡尔邓克尔的蜡烛问题实验揭示了创造性思维的重要性。通过颠覆对盒子用途的先入为主观念&#xff0c;参与者能够找到创新性的解决方案…

新规则,新游戏:AI时代下的战略重构与商业实践

当你的客服AI能够真正像员工一样理解客户的行业术语&#xff0c;当AI能主动从大量的客户咨询中筛选出高价值潜在客户 —— 这已经不再是理想中才能存在的场景&#xff0c;而是当下 “人工智能 ” 行动深入推进中&#xff0c;企业智能化转型的真实写照。 "人工智能 " …

ScanNet: Richly-annotated 3D Reconstructions of Indoor Scenes 数据集构建

paper link: paperlink Abstract: 这个数据集是个RGB-D视频数据集&#xff0c;在707个不同空间中获取了1513个扫描的场景&#xff0c;250w个视图&#xff0c;并且标注了相机位姿&#xff0c;表面重建&#xff0c;语义分割。本数据集共有20人扫描500名工作者进行标注。 数据集…

c语言期末复习

一、选择题(10道) 1、以下哪个不是C语言的关键字? A) int B) float C) string D) while (答案:C) 2、表达式 5 / 2 的结果是: A) 2.5 B) 2 C) 3 D) 2.0 (答案:B) 3、指针变量存储的是: A) 变量的值 B) 变量的地址 C) 变量的类型 D) 变量的名称 (答案:B) 4、以…

JLINK 调试器单步调试单片机

0 JLINK 调试器单步调试单片机 1 物理层1.1 调整电压和开发板一致2 环境搭建 2.1 安装 JLink_Windows_V862_x86_642.2 vscode 配置 {"version": "0.2.0","configurations": [{"name": "(gdb) 启动","type": "…

大模型(LLM)安全保障机制(技术、标准、管理)

大模型&#xff08;LLM&#xff09;的安全保障涉及技术、标准、管理等多个层面。下面我将结合其核心风险&#xff0c;为你梳理主要的安全机制、相关标准框架以及一些实践建议。为了让您快速了解大模型面临的主要风险及相应的应对机制&#xff0c;我准备了一个表格&#xff1a;安…

虚拟机之CentOS、网络设置的有趣问题

前言 年初射出的子弹&#xff0c;今天中了。 年初埋下的坑&#xff0c;今年踩了。 回首过往&#xff0c;why&#xff1f; because&#xff1a;当时下载VMware的时候。没有设置网络。 重点——使用VMware安装CentOS 9 使用VMware安装CentOS Stream 9_哔哩哔哩_bilibili 总…

Biomni:来自斯坦福的通用型生物医学 AI 智能体,科研“虚拟助手“来了!

在当今生物医学研究中&#xff0c;实验手段和数据量正以前所未有的速度膨胀。从基因组学、单细胞组学到多模态数据&#xff0c;再到可穿戴设备的健康监测&#xff0c;科研人员每天都在与庞大的数据和复杂的分析流程打交道。 然而&#xff0c;实验设计琐碎、工具分散、跨学科整合…

移植后 eto 阳性 干扰素 α1b、白介素 - 2 dli

在异基因造血干细胞移植&#xff08;allo-HSCT&#xff09;后仍存在 AML1-ETO&#xff08;ETO&#xff09;融合基因阳性的患者中&#xff0c;干扰素 α1b 联合白介素 - 2&#xff08;IL-2&#xff09; 是临床中探索用于清除微小残留病&#xff08;MRD&#xff09;、降低复发风险…

防止接口被薅羊毛(防刷)(DAY 002)

背景&#xff1a;短信验证码接口被不法分子用来做灰产&#xff08;短信邮箱轰炸机&#xff09; 如何避免⾃⼰的⽹站成为”⾁鸡“或者被刷&#xff1f; 增加图形验证码&#xff08;开发⼈员&#xff09;单IP请求次数限制&#xff08;开发⼈员&#xff09; 防刷之图形验证码&…