【问题标题】:c# Onvif GetSystemDateandTime SOAP not working on UDPc# Onvif GetSystemDateandTime SOAP 在 UDP 上不起作用
【发布时间】:2020-08-31 21:02:21
【问题描述】:

我正在尝试仅使用 UDP 构建一个稍微完整的 ONVIF 设备管理器。我了解某些功能需要 TCP,但现在我可以接受这些功能对我不可用。我在不设置 HTTPClient 的情况下努力获取系统日期和时间。根据 Onvif,此 SOAP 不需要身份验证,而是完整身份验证过程所需的信息。

我能够在 UDP 上发送探测并获得响应,甚至可以通过基本身份验证获得 PTZ 设置。但是,当我使用 Onvif Applications Programmers Guide 提供的以下 SOAP 时,我看到消息已发送但未收到响应(使用线鲨)。

根据程序员指南以下......

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
 xmlns:tds="http://www.onvif.org/ver10/device/wsdl">
 <SOAP-ENV:Body>
 <tds:GetSystemDateAndTime/>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope> 

应该生成以下响应....

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"
 xmlns:tt="http://www.onvif.org/ver10/schema"
 xmlns:tds="http://www.onvif.org/ver10/device/wsdl">
 <SOAP-ENV:Body>
 <tds:GetSystemDateAndTimeResponse>
 <tds:SystemDateAndTime>
 <tt:DateTimeType>NTP</tt:DateTimeType>
 <tt:DaylightSavings>true</tt:DaylightSavings>
 <tt:TimeZone>
 <tt:TZ>CET-1CEST,M3.5.0,M10.5.0</tt:TZ>
 </tt:TimeZone>
 <tt:UTCDateTime>
 <tt:Time>
 <tt:Hour>15</tt:Hour>
 <tt:Minute>52</tt:Minute>
 <tt:Second>25</tt:Second>
 </tt:Time>
 <tt:Date>
 <tt:Year>2010</tt:Year>
 <tt:Month>10</tt:Month>
 <tt:Day>29</tt:Day>
 </tt:Date>
 </tt:UTCDateTime>
 <tt:LocalDateTime>
 <tt:Time>
 <tt:Hour>17</tt:Hour>
 <tt:Minute>52</tt:Minute>
 <tt:Second>25</tt:Second>
 </tt:Time>
 <tt:Date>
 <tt:Year>2010</tt:Year>
 <tt:Month>10</tt:Month>
 <tt:Day>29</tt:Day>
 </tt:Date>
 </tt:LocalDateTime>
 </tds:SystemDateAndTime>
 </tds:GetSystemDateAndTimeResponse>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope> 

这是我正在使用的代码的精简版本。除了上面列出的肥皂之外,这种方法在所有尝试中都有效。

public static async Task<List<string>> GetSoapRes_Time_and_DateAsync()
{
    //Create a variable called result to store returned string. Code omitted for clarity.

    using (var client = new UdpClient())
    {
        var ipEndpoint = new IPEndPoint(IPAddress.Parse("192.168.1.64"), 3702);
        client.EnableBroadcast = true;
        try
        {
            var soapMessage = GetBytes(CreateSoapRequest());
            await client.SendAsync(soapMessage, soapMessage.Length, ipEndpoint);
            //ToDo: check if we have bits back and if we do process and store in result.
        }
        catch (Exception exception)
        {
            //Do something 
        }
    }
//Return results 
        return result;
    }

private static string CreateSoapRequest()
{
    Guid messageId = Guid.NewGuid();
    const string soap = ************Place Soap string here***********
    var result = string.Format(soap, messageId);
    return result;
}

private static byte[] GetBytes(string text)
{
    return Encoding.ASCII.GetBytes(text);
}

有人对 Onvif 足够熟悉,知道出了什么问题吗?我假设要么 A)我遗漏了一些明显的东西 B) Onvif 只接受这个带有 TCP 标头的soap。

【问题讨论】:

    标签: c# soap onvif


    【解决方案1】:

    你不能那样做。

    来自第 4.1 节中的core specs

    此框架建立在 Web 服务标准之上。所有配置 标准中定义的服务表示为 Web Services 操作并在 WSDL 中定义,HTTP 作为底层传输 机制。

    通过仅使用 UDP,如果将摄像头配置为在启动时自动启动多播流式传输,则您只能进​​行设备发现和获取流式传输。对于任何其他功能,至少需要一个 TCP 连接。

    【讨论】:

    • 谢谢!这是有道理的!话虽如此,如果我只是想捕捉视频,我仍然无法在不使用 TCP 的情况下设置相机,对吗?根据您发送的内容,似乎甚至身份验证都是通过 TCP 完成的。没有身份验证,我无法流式传输视频。
    • 当您说“您不能那样做”时,您是指获取系统日期和时间吗?或者只是尝试构建一个设备管理器。
    • 如果您将相机配置为在启动时启动自动视频流,那么您可以在没有 TCP 的情况下获得的唯一视频是多播视频。但是您需要将每个摄像机的每个流的多播 IP 地址和端口作为辅助信息。对于任何 ONVIF 函数,您都不能这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多