#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.