ExOnvif官方文檔
在使用 Elixir 進行 IPdome 控制時,可以使用 ExOnvif 庫。
ExOnvif官方文檔中未給停止移動調用命令,自己按照onvif協議 Onvif協議 擴展的此項功能;
停止移動 Stop
在Onvif協議中,用于停止云臺移動的操作為Stop。當需要終止云臺正在進行的平移(Pan)、傾斜(Tilt)或變焦(Zoom)動作時,向設備發送一個Stop命令,這個命令會使得云臺立即停止所有指定類型的運動。
在上面的Onvif協議中,可以看出,Stop命令需要三個參數;
- ProfileToken字段用于指定要停止運動的PTZ的標識符文件。
- PanTilt和Zoom元素是布爾值,用來指示是否停止平移/傾斜運動和變焦運動。如果設置為true,則相應類型的運動會被停止。如果為false,則不采取任何操作。
完整的文件:
defmodule MvOnvif.Action douse GenServer@moduledoc """自定義的Onvif的部分協議獲取當前狀態(exonvif)absolute move調用攝像頭到指定位置,continuous move攝像頭連續移動調用指定預置位停止運動"""import ExOnvif.Utils.XmlBuilderimport SweetXmlalias ExOnvif.Devicealias ExOnvif.Media2import 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);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# 生產Stop xml 命令,停止pt運動,停止zoom變焦defp mv_stop(device, profile_token) dobody = 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) dowith {:ok, device} <- get_device(uri),{:ok, profile_token} <- get_main_stream_profile_token(device)domv_stop(device, profile_token)endend
end
標準的Stop命令的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>