From dffee5313b543f19d983414867c2a83d95ae2bf5 Mon Sep 17 00:00:00 2001 From: yakovlevdmv Date: Sat, 7 Apr 2018 22:20:26 +0300 Subject: [PATCH 1/2] Update README.md --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e189216..9aa1722 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ if err != nil { Рассмторим, как организована отправка запросов в **Goonvif** на нескольких примерах. 1. Метод GetCapabilities сервиса DeviceManagement + Все необходимые типы данных определены в пакете [Device](Device/types.go). В файле (https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl) можно увидеть: ![GetCapabilities](img/exmp_GetCapabilities.png) @@ -85,6 +86,7 @@ if err != nil { } ``` 2. Создание пользователя методом CreateUsers сервиса DeviceManagement + Все необходимые типы данных определены в пакете [Device](Device/types.go). В файле (https://www.onvif.org/ver10/device/wsdl/devicemgmt.wsdl) можно увидеть структуру запроса: ![CreateUsers](img/exmp_CreateUsers.png) @@ -107,6 +109,7 @@ if err != nil { Некоторые камеры работают специфично. Это означает, что в зависимости от модели камеры можно не получить ошибки при неправильном запросе. Поэтому советую проверять точно ли выполнилась операция. Например, для метода CreateUsers вывести список всех пользователей и сравнить. 3. Метод ContinuousMove сервиса PTZ + Все необходимые типы данных определены в пакете [PTZ](PTZ/types.go). В файле (https://www.onvif.org/ver20/ptz/wsdl/ptz.wsdl) можно увидеть структуру запроса: ![ContinuousMove](img/exmp_ContinuousMove.png) From c0589c604594ffc4d70fb3d360562ed083901b4a Mon Sep 17 00:00:00 2001 From: yakovlevdmv Date: Sat, 7 Apr 2018 22:44:40 +0300 Subject: [PATCH 2/2] Update README.md --- README.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) diff --git a/README.md b/README.md index 9aa1722..f97c8b4 100644 --- a/README.md +++ b/README.md @@ -115,5 +115,53 @@ if err != nil { ![ContinuousMove](img/exmp_ContinuousMove.png) Так как данная команда определяется сервисом PTZ, необходимый тип находится в пакете [PTZ](PTZ/types.go). +Из файла [PTZ](PTZ/types.go) можно заметить, что : +> ProfileToken [ReferenceToken] +> A reference to the **MediaProfile** that indicate what should be stopped. + +Таким образом, для того, чтобы начать работать с PTZ сервисом для начала необходимо получить **ProfileToken** сервиса **Media**. Как это сделать смотрите в примере 4. Сейчас же предположим, что нам известен нужный токен. Пусть ProfileToken = "Profile_1". Создадим объект `PTZ.ContinuousMove`: +``` +move := PTZ.ContinuousMove{ + ProfileToken:"Profile_1", + Velocity:onvif.PTZSpeed{ + PanTilt:onvif.Vector2D{ + X: 1, + Y: 1, + }, + Zoom:onvif.Vector1D{X:0.5}, + }, +} +``` + +**Заметим**, что объекты Velocity, PanTilt и Zoom определены в пакете onvif. Такая ситуация соответствует всем встроенным типам. + +Для вызова данной функции воспользуемся методом `func (dev device) CallMethod(method interface{}) (string, error)`: +``` +resp, err := dev.CallMethod(capab) +if err != nil { + log.Println(err) +} else { + fmt.Println(resp) +} +``` + +4. Получение списков Media профилей + +Все необходимые типы данных определены в пакете [Media](Media/types.go). +В файле (https://www.onvif.org/ver10/media/wsdl/media.wsdl) можно увидеть структуру запроса: +![ContinuousMove](img/exmp_GetProfiles.png) + +Вот пример создания и вызова запроса GetProfiles +``` +resp, err := dev.CallMethod(Media.GetProfiles{}) +if err != nil { + panic (err) +} else { + fmt.Println(readResponse(resp)) +} +``` + +**Важно** Обработка response'ов пока не реализована, поэтому данная задача ложится на Ваши плечи. Вы можете упростить обработку response при помощи библиотеки [etree](https://github.com/beevik/etree). Либо же воспользоваться сервисом (http://www.webtoolkitonline.com/xml-formatter.html) +