Elixir通过Onvif协议控制IP摄像机,扩展ExOnvif的摄像头停止移动 Stop 功能

ExOnvif官方文档

在使用 Elixir 进行 IPdome 控制时,可以使用 ExOnvif 库。

ExOnvif官方文档中未给停止移动调用命令,自己按照onvif协议 Onvif协议 扩展的此项功能;

停止移动 Stop

在Onvif协议中,用于停止云台移动的操作为Stop。当需要终止云台正在进行的平移(Pan)、倾斜(Tilt)或变焦(Zoom)动作时,向设备发送一个Stop命令,这个命令会使得云台立即停止所有指定类型的运动。

在上面的Onvif协议中,可以看出,Stop命令需要三个参数;

  • ProfileToken字段用于指定要停止运动的PTZ的标识符文件。
  • PanTilt和Zoom元素是布尔值,用来指示是否停止平移/倾斜运动和变焦运动。如果设置为true,则相应类型的运动会被停止。如果为false,则不采取任何操作。

完整的文件:

erlang 复制代码
defmodule MvOnvif.Action do
  use GenServer

  @moduledoc """
  自定义的Onvif的部分协议
  获取当前状态(exonvif)
  absolute move调用摄像头到指定位置,
  continuous move摄像头连续移动
  调用指定预置位
  停止运动
  """
  import ExOnvif.Utils.XmlBuilder
  import SweetXml
  alias ExOnvif.Device
  alias ExOnvif.Media2
  import ExOnvif.Utils.ApiClient, only: [ptz_request: 4]

  # 初始化设备
  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);
  end

  defp get_device(uri) do
    :error
  end
 
 # 获取ProfileToken标识符
  defp get_main_stream_profile_token(device) do
    profiles = Media2.get_profiles(device)
    case profiles do
      {:ok, list} -> {:ok, hd(list).reference_token}
      _ -> "something went wrong"
    end
  end
  
  # 生产Stop xml 命令,停止pt运动,停止zoom变焦
  defp mv_stop(device, profile_token) do
    body = element("tptz:Stop", [element("tptz:ProfileToken", profile_token),
                                 element("tptz:PanTilt", true),
                                 element("tptz:Zoom", true)
                                ])
    ptz_request(device, "Stop", body, fn resp -> :ok end )
  end

  # 摄像头停止移动 外部调用
  def stop_(uri) do
    with {:ok, device} <- get_device(uri),
         {:ok, profile_token} <- get_main_stream_profile_token(device)
      do
      mv_stop(device, profile_token)
    end
  end
end
标准的Stop命令的xml文件
xml 复制代码
<SOAP-ENV:Body>
    <wsdl:Stop>
        <wsdl:ProfileToken>Profile_1</wsdl:ProfileToken>
        <!-- 可选:停止所有运动或指定运动 -->
        <wsdl:PanTilt>true</wsdl:PanTilt>
        <wsdl:Zoom>true</wsdl:Zoom>
    </wsdl:Stop>
</SOAP-ENV:Body>
相关推荐
kekekzt7 小时前
TCP协议的粘包问题介绍,IP分片,MTU,MSS,滑动窗口的概念及之间的关系
网络·网络协议·tcp/ip
Learn-Share_HY13 小时前
[IT Network]如何配置反向路徑過濾器(rp_filter),以解決路由不對稱問題?
linux·嵌入式硬件·物联网·网络协议·tcp/ip·http·iot
小镇敲码人14 小时前
【深入浅出】之Qt 事件系统实战:鼠标、键盘、滚轮、窗口与定时器事件
数据库·qt·网络协议·mysql·http
K成长日志15 小时前
BLE不可连接状态--广播态
物联网·网络协议·蓝牙·低功耗·iot·ble
DevOpenClub17 小时前
全球区域与 IP 定位工作台案例方案
大数据·网络·网络协议·tcp/ip
wuyk55517 小时前
从零吃透 Modbus 通信|第 6 章:线圈功能码 05/0F 实现 & Modbus‑TCP 基础入门
c语言·网络·网络协议·tcp/ip
Titan202418 小时前
HTTPS基础知识梳理
服务器·网络·c++·网络协议·学习·http·https
新时代牛马18 小时前
epoll 源码路径:从epoll_ctl 到ep_poll 的就绪唤醒
网络·数据库·网络协议
艾莉丝努力练剑19 小时前
【AI大模型接入SDK】WebSocket & SSE 协议
网络·c++·websocket·网络协议·学习·面试
xieliyu.19 小时前
计算机网络‑IP 协议解析:核心特性总结
网络·笔记·网络协议·学习·tcp/ip·计算机网络