如何解决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连接。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。