Я пытаюсь обнаружить устройства ONVIF с помощью некоторого кода Java. В частности, я пытаюсь получить их служебный адрес устройства (который, как мне кажется, является просто их IP-адресом), поскольку Базовая спецификация ONVIF отмечает (в разделе 4.3), что «Успешное обнаружение предоставляет адрес службы устройства. Когда клиент имеет адрес службы устройства, он может получать подробную информацию об устройстве через службу устройства ... ". В конечном итоге моя цель - получить эту подробную информацию об устройствах ONVIF в сети. В общем, я также ищу руководство по использованию спецификации ONVIF.
Я все еще новичок в мире веб-сервисов (и сетей в целом), поэтому прости меня, если я скажу что-нибудь глупое. Тем не менее, я приложил немало усилий к этому сам: я прочитал множество Базовых спецификаций ONVIF , Руководства разработчика приложений ONVIF и Спецификации WS-Discovery . Если позволите, я просто подведу итоги, что я знаю, чтобы вы могли сказать мне, если я на правильном пути:
- «Веб-сервисы» - это название стандартной технологии, использующей стандарты веб-сервисов, не зависящие от платформы и языка, такие как XML, SOAP и WSDL в IP-сети. Основная идея заключается в том, что мы хотим иметь возможность вызывать методы / функции (службы) из любого языка программирования.
- Веб-сервис обычно размещается на сервере; но в случае использования ONVIF поставщиком веб-услуг является устройство ONVIF (например, IP-камера). Таким образом, для взаимодействия с устройством на любом языке мы используем операции / вызовы веб-службы, поскольку вызовы веб-службы могут быть реализованы на любом языке.
- XML - это синтаксис описания данных (используется потому, что он не зависит от языка; его может проанализировать любой язык). SOAP - это коммуникационный протокол, используемый для получения XML-документов, наполненных SOAP, туда и обратно (в основном, вызывайте наши методы). WSDL используется для описания сервисов (это описание интерфейса веб-сервисов на основе XML). Я загрузил WSDL для управления устройствами здесь и сгенерировал с помощью WSDL-компилятора
wsimport
(предоставленный JDK) классы Java из WSDL для использования в моем коде. Но я понимаю, что вызов этих методов произойдет после обнаружения устройства, верно?
- Устройства ONVIF обнаруживаются в соответствии со спецификацией WS-Discovery. Вы отправляете сообщение
Probe
, а устройства, соответствующие ограничениям датчика, отправляют обратно сообщение ProbeMatch
, как описано на стр. 13 и 14 в Руководстве по программированию приложений ONVIF
Здесь я начинаю путаться. Как именно я отправляю это сообщение на Java? Руководство разработчика приложений ONVIF содержит псевдокод на стр. 15, но я не могу понять, как его реализовать. Раздел 4.3.1 этого руководства - это то, на чем я застрял. Я понимаю, что «области» и «типы» - это просто ограничения, которые вы можете встроить в зонд, но они не обязательны (согласно странице 5 WS discovery spec ). Поскольку я хочу открыть для себя все устройства, я полагаю, что для запуска не нужно никаких ограничений, верно?
Так что в этом руководстве также приведен пример сообщения SOAP на стр. 110, используемого для обнаружения. Убрав из него объявление типа (потому что я не хочу этого ограничения), я понимаю, что мое SOAP-сообщение для отправки будет (я верю?) Следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<e:Envelope xmlns:e="http://www.w3.org/2003/05/soap-envelope"
xmlns:w="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:d="http://schemas.xmlsoap.org/ws/2005/04/discovery"
xmlns:dn="http://www.onvif.org/ver10/network/wsdl">
<e:Header>
<w:MessageID>uuid:84ede3de-7dec-11d0-c360-f01234567890</w:MessageID>
<w:To e:mustUnderstand="true">urn:schemas-xmlsoap-org:ws:2005:04:discovery</w:To>
<w:Action
a:mustUnderstand="true">http://schemas.xmlsoap.org/ws/2005/04/discovery/Pr
obe</w:Action>
</e:Header>
<e:Body>
<d:Probe>
</d:Probe>
</e:Body>
</e:Envelope>
И я также понимаю, что технология WS-Discovery использовала адрес 239.255.255.259 с UDP-портом 3702 ... но это конец того, что я получаю. Как отправить это SOAP-сообщение на этот адрес и порт в Java? Как мне прочитать ответ (я думаю , что я получу сообщение ProbeMatch в форме XML-документа, наполненного SOAP, поэтому мне нужно проанализировать этот XML, чтобы получить XAddrs
, но не уверен). Нужно ли как-то отправлять UDP-трансляцию этого SOAP-сообщения на этот адрес?
TL; DR : я полагаю, что для обнаружения устройств ONVIF мне нужно отправить указанное выше SOAP-сообщение по адресу 239.255.255.259 на UDP-порт 3702. Я понятия не имею, как это сделать в Java, и был просто ищу руководство; Я даже не уверен, что нахожусь на правильном пути, чтобы найти устройство.