c#Onvif GetSystemDateandTime SOAP无法在UDP上运行

问题描述

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

我能够对UDP发出探测并获得响应,甚至可以通过基本身份验证获得PTZ设置。但是,当我使用《 Onvif应用程序程序员指南》提供的以下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标头的肥皂。

解决方法

你不能那样做。

来自第4.1节的core specs

此框架基于Web服务标准。全部配置 标准中定义的服务表示为Web服务 操作并在WSDL中以HTTP作为基础传输进行定义 机制。

仅将UDP配置为在启动时自动启动多播流传输,则只能使用UDP进行设备发现和流传输。对于任何其他功能,至少需要一个TCP连接。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...