【发布时间】: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。
【问题讨论】: