c # Onvif получает системную дату и время SOAP, не работает на UDP

#c# #soap #onvif

#c# #soap #onvif

Вопрос:

Я пытаюсь создать несколько полный диспетчер устройств ONVIF, используя только UDP. Я понимаю, что для некоторых функций требуется TCP, но пока я могу согласиться с тем, что эти функции будут недоступны для меня. Я изо всех сил пытаюсь получить системную дату и время без настройки HttpClient. Согласно Onvif, это SOAP не требует аутентификации и вместо этого является информацией, необходимой для полного процесса аутентификации.

Я могу отправить запрос на UDP и получить ответы и даже получить настройки PTZ с базовой аутентификацией. Однако, когда я использую следующий SOAP, предоставленный Руководством по программированию приложений Onvif, я вижу, что сообщение отправлено, но ответа не получено (с использованием wire shark).

Согласно руководству программистов, происходит следующее….

 <?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> 
  

Вот сокращенная версия кода, который я использую. Этот подход сработал во всех попытках, кроме soap, перечисленных выше.

 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 resu<
    }

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

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

Кто-нибудь достаточно знаком с Onvif, чтобы знать, что происходит не так? Я предполагаю, что либо
А) Я упускаю что-то очевидное
B) Onvif принимает это soap только с заголовком TCP.

Ответ №1:

Вы не можете этого сделать.

Из основных спецификаций в разделе 4.1:

Эта платформа построена на стандартах веб-служб. Все службы конфигурации, определенные в стандарте, выражаются как операции веб-служб и определяются в WSDL с HTTP в качестве базового транспортного механизма.

Используя только UDP, вы можете обнаруживать устройства и получать потоковую передачу, только если камера настроена на автоматический запуск многоадресной передачи при загрузке. Для любой другой функциональности требуется хотя бы одно TCP-соединение.

Комментарии:

1. Спасибо! Это имеет смысл! С учетом сказанного, если бы я просто хотел захватить видео, я все равно не смог бы настроить камеру без использования TCP в какой-либо емкости, правильно? С тем, что вы отправили, кажется, что даже аутентификация выполняется через TCP. Без аутентификации я не могу передавать потоковое видео.

2. Когда вы говорите «Вы не можете этого сделать», вы имеете в виду конкретно получение системной даты и времени? Или просто пытается создать диспетчер устройств в целом.

3. Единственное видео, которое вы можете получить без TCP, — это многоадресное видео, если вы настроили камеру на автоматический запуск потоковой передачи видео при загрузке. Но вам необходимо иметь в качестве дополнительной информации IP-адрес многоадресной рассылки и порт для каждого потока для каждой камеры. Вы не можете сделать это для любой функции ONVIF.