当前位置: 首页 > news >正文

Elixir通过Onvif协议控制IP摄像机,扩展ExOnvif的摄像头连续移动功能 ContinuousMove

ExOnvif官方文档

在使用 Elixir 进行 IPdome 控制时,可以使用 ExOnvif 库。
ExOnvif官方文档中未给出摄像机连续运动命令,自己按照onvif协议 Onvif协议 扩展的此项功能;

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

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

程序实现步骤如下

  • 初始化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

停止移动 参考连接

以下为连续运动请求的标准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://RXt5bTUJ.zybdj.cn
http://BNvRxJr5.zybdj.cn
http://PSHT8WYa.zybdj.cn
http://ecApwoVH.zybdj.cn
http://kYysHfDo.zybdj.cn
http://b9Zs3kSl.zybdj.cn
http://jCqsw0X8.zybdj.cn
http://859yBOn9.zybdj.cn
http://sRqiuF4l.zybdj.cn
http://cZMz7xvU.zybdj.cn
http://b9sSY8d2.zybdj.cn
http://L4pcpF34.zybdj.cn
http://UwFuHtdd.zybdj.cn
http://aWYJko1W.zybdj.cn
http://10QJBfHb.zybdj.cn
http://72oG7Wup.zybdj.cn
http://3Krv4PQ4.zybdj.cn
http://eaF6uTre.zybdj.cn
http://h9cFmhbs.zybdj.cn
http://l4zgWsvk.zybdj.cn
http://bt2HCAI6.zybdj.cn
http://Dyr587ny.zybdj.cn
http://oYj4dZYk.zybdj.cn
http://W5QMPJde.zybdj.cn
http://poXDG6Qn.zybdj.cn
http://tzC71fae.zybdj.cn
http://xqUsWFqa.zybdj.cn
http://mZaiqHAJ.zybdj.cn
http://4GStUsHo.zybdj.cn
http://BYxGxnVq.zybdj.cn
http://www.dtcms.com/a/367308.html

相关文章:

  • P13929 [蓝桥杯 2022 省 Java B] 山 题解
  • 基于 epoll 的高并发服务器原理与实现(对比 select 和 poll)
  • Docker Compose 与 Kubernetes 全面对比
  • 基于单片机水流量气体流量检测系统/水表燃气表设计
  • C/C++关键字——union
  • 基于单片机智能热水器设计
  • MySQL 全库备份迁移后索引失效问题深度解析与解决
  • 代码随想录训练营第三十一天|LeetCode56.合并区间、LeetCode738.单调递增的数字
  • 深入理解 @FeignClient 注解:应用场景与实战示例
  • 分享一个基于大数据应用的食物营养健康管理与可视化系统,基于python的食物营养信息交互式可视化系统源码
  • 残差神经网络的案例
  • 机器学习中决策树
  • 算法 --- 分治(归并)
  • 深入探索 WebSocket:构建实时应用的核心技术
  • javaweb(AI)-----前端
  • C++11 类功能与包装器
  • Qt---connect建立对象间的通信链路
  • vLLM显存逆向计算:如何得到最优gpu-memory-utilization参数
  • 第15章 Jenkins最佳实践
  • 【倒计时2个月】好•真题资源+专业•练习平台=高效备赛2025初中古诗文大会
  • openEuler2403安装部署Kafbat
  • matlab 数据分析教程
  • git还原操作
  • Spring Cloud OpenFeign 核心原理
  • 【华为培训笔记】OptiX OSN 9600 设备保护专题
  • 解决 ES 模块与 CommonJS 模块互操作性的关键开关esModuleInterop
  • 解密llama.cpp:Prompt Processing如何实现高效推理?
  • 抽象与接口——Java的“武器模板”与“装备词条”
  • 数组本身的深入解析
  • Linux Centos7搭建LDAP服务(解决设置密码生成密文添加到配置文件配置后输入密码验证报错)