Специфікація
Встановлення
«Тихе» встановлення (silent install) «Лінії» можливе через ключ «/S» (з версії 7.0.5). Ключі для режиму тихого встановлення (з версії 7.1.0):
/NO_KERNEL=YES ; не встановлювати і не запускати kernel як службу; /NO_DRIVERS=YES ; не встановлювати драйвери на плати відеозахоплення.
Робота з observer.exe з командного рядка
Починаючи з версії 6.6.2, система „Line” дозволяє запуск модулю „Пост спостереження” та перегляд архіву з певними параметрами командного рядка (нижче наведено специфікацію, що є актуальною для 6.9.4 та вище).
Також можливе отримання відеопотоку та окремих кадрів із використанням веб-серверу системи „Line”, що дозволяє проводити інтеграцію зі стороннім програмним забезпеченням.
Загальний формат
observer.exe [options] [modes] modes: --simple ; перегляд в спрощеному режимі -a, --archive ; перегляду архіву -m, --allow-multiple-instances ; запуск ще однієї копії observer --safe-mode ; запуск observer у режимі з примусовим відображенням другого потоку options: -s, --server default: localhost -g, --connect-to-group значення по замовчуванню немає. -p, --port default: 9780 -l, --login default: guard --pwd default: "" -c, --cam-index default: 0 ; доступно тільки в --simple режимі --cam-stream default: -1 ; доступно тільки в --simple режимі -P, --window-poscoordinates format: X1 Y1 X2 Y2 ;за замовчуванням, - попередні координати вікна перед закриттям --tray ; Переміщує пост спостереження в трей при старті. -t, --time
Коментарі
Observer можна запускати з командного рядка з аргументами.
Аргументи поділяються на 2 категорії:
- Ті, що переводять в режим
- Ті, що ініціалізують
Аргументи
Режими
- --simple – Перегляд в спрощеному режимі.
Відкриття додатку для перегляду конкретної камери (можливо, із стороннього додатку)
- -a, --archive - Відкриття додатку в режимі перегляду архіву.Якщо додаток знаходиться в режимі спостереження,
відбудеться зміна режиму із наступним підключенням до архіву на той же самий сервер.
- -m, --allow-multiple-instances - запуск ще однієї копії observer'a
- --safe-mode - запуск observer з виводом другого потоку.
Дозволяє примусово переключити зображення з камер на загальній сітці вигляду на другий потік
Параметри
- -s, --server [localhost]
Якщо параметр не заданий, відбудеться спроба підключення за адресою 127.0.0.1
- -g, --connect-to-group
Параметр дозволяє вказати групу для підключення, ідентифікатор групи міститься у рядку "grp_id" конфігураційного файлу «C:\ProgramData\DevLine\Linia\groups.cfg» або «C:\Documents and Settings\All Users\Application Data\DevLine\Linia\groups.cfg» .
Приклади:
--connect-to-group 1cff07ad-dc71-498d-87e1-1ef69206d370
-g 1cff07ad-dc71-498d-87e1-1ef69206d370
при підключенні до облікового запису «Лінія Хмара»:
--connect-to-group sample@google.com
-g sample@google.com
- -p, --port [9780]
Порт для підключення. Якщо порт не заданий, підключення здійснюватиметься за стандартним портом - 9780
- -l, --login [guard]
Користувач за замовленням - guard (зазвичай, користувач із найбільш обмеженими привілеями)
- --pwd [""]
Пароль для користувача. За замовчуванням - пустий.
- -c, --cam-index [0]
Параметр доступний лише в --simple режимі. При підключенні в --simple режимі використовуються локальні „види” (точніше – лише одна вказана камера).
За замовчуванням, ідентифікатор камери рівний 0.
- --cam-stream [-1]
Параметр доступний лише в --simple режиме. При підключенні в --simple режимі використовуються локальні „види” (точніше – лише одна вказана камера).
За замовчуванням, ідентифікатор потоку рівний -1(авто), доступні значення: 0(перший), 1(другий).
- --window-pos <coordinates>
Положення та розміри вікна запуску.
coordinates: X1 Y1 X2 Y2 - абсолютні координати вікна.
де (X1, Y1) координати верхнього лівого кута, а (X2, Y2) координати нижнього правого кута.
За замовчуванням, додаток відкриється на тому ж місті, на якому був закритий попереднього разу.
- --tray
Переміщує пост спостереження в трей при старті.
- -t, --time <date> <time>
date format: YYYY-MM-DD ; за замовчуванням – теперішня дата
time format: hh:mm:ss ; за замовчуванням – теперішній час
Час для стартового відтворювання архіву.
Якщо вказаний даний параметр, але параметр -p (порт) вказує на порт спостереження (kernel.exe), а не архіву (oopnet.exe),
то даний аргумент буде проігноровано.
Специфікація веб-серверу
- Специфікація веб-серверу
- Формати даних
- Аутентифікація
- Ресурси
- Камери
- Зображення
- PTZ
- Керування PTZ камери
- Керування фокусом камери
- Робота з екранним меню камери
- Всі передналаштування PTZ камери
- Окреме передналаштування PTZ
- Попередній перегляд зображення з передналаштуванням PTZ
- Мікрофони
- Аудіо
- APNR
- OSD (on-screen display)
- Створення OSD-об’єкту
- Видалення OSD-об’єкту
- Додавання контенту до OSD-об’єкту
- Видалення контенту з OSD-об’єкту
- Події (з версії 6.9.4)
- RPC (Remote Procedure Call) (з версії 8)
- Формати даних
- Структура запиту
- Структура відповіді
- Batch-запити (Пакетні запити)
- Версія RPC API
- Інформація про сервер
- Користувачі
- Атрибути користувача
- Атрибути групи
- Права на операції
- Приклади налаштувань користувачів та груп
- users.get_users
- users.get_user
- users.add_user
- users.remove_user
- users.modify_user
- users.get_groups
- users.get_group
- users.add_group
- users.remove_group
- users.modify_group
- users.get_user_views
- users.set_user_views
- users.get_group_views
- users.set_group_views
- Конфігурація сервера
- Архів
- Таймлайн архіву
- archive.get_frames_timeline
- archive.get_motions_timeline
- archive.get_channels_list
- archive.get_streams_list
- archive.get_frames_list
- archive.get_frame
- archive.seek_frame
- archive.seek_frames
- Користувацький журнал подій
- Моніторинг стану сервера
- Інше
- Зміни специфікації
Формати даних
Підтримуються JSON або XML (лише Unix-way переклад рядків) представлення об’єктів (MIME-типи application/json
и application/xml
). То або інше представлення обирається на основі аналізу заголовку Accept
запиту клієнта. Якщо по заголовку Accept
неможливо визначити представлення за бажанням клієнта, об’єкти пересилаються в представленні за замовчуванням (XML).
Аутентифікація
Здійснюється через HTTP Digest Authentication. Ім’я користувача та пароль очікуються в кодуванні UTF-8.
Ресурси
Кожен ресурс описується наступним набором полів:
URI: абсолютний шлях до ресурсу на сервері.
Версія: версія інтерфейсу, в якій доступний ресурс.
MIME-типи: типи даних, в яких ресурс може бути представлений.
Методи: методи, що застосовуються до ресурсу.
Загальний опис ресурсу, методів доступу до нього, параметрів запитів, форматів даних тощо.
Камери
Всі камери
URI: /cameras
Версія: 1.2
MIME-типи: application/json, application/xml
Методи: GET
Список всіх доступних на сервері камер. JSON представлення – масив об’єктів camera
. XML представлення:
<camera-list> <camera/> <!-- opt --> </camera-list>
Окрема камера в JSON представленні:
{ "uri": /* string */, "name": /* string */, "width": /* number (current resolution) */, "height": /* number (current resolution) */, "image-uri": /* string */, "video-uri": /* string */, "osd-uri": /* string */, "ptz": { "pan-tilt": { "absolute-uri": /* string */, "relative-uri": /* string */ }, "zoom": { "absolute-uri": /* string */, "relative-uri": /* string */ }, "focus": { "absolute-uri": /* string */, "relative-uri": /* string */ }, "menu": { "show-uri": /* string */, "hide-uri": /* string */, "activate-uri": /* string */, "move-uri": /* string */ }, "presets-uri": /* string */ } }
В XML представленні:
<camera> <uri> <!-- xs:anyURI --> </uri> <name> <!-- xs:string --> </name> <width> <!-- xs:nonNegativeInteger --> </width> <height> <!-- xs:nonNegativeInteger --> </height> <image-uri> <!-- xs:anyURI --> </image-uri> <video-uri> <!-- xs:anyURI --> </video-uri> <osd-uri> <!-- xs:anyURI --> </osd-uri> <ptz> <pan-tilt> <absolute-uri> <!-- xs:anyURI --> </absolute-uri> <relative-uri> <!-- xs:anyURI --> </relative-uri> </pan-tilt> <zoom> <absolute-uri> <!-- xs:anyURI --> </absolute-uri> <relative-uri> <!-- xs:anyURI --> </relative-uri> </zoom> <focus> <absolute-uri> <!-- xs:anyURI --> </absolute-uri> <relative-uri> <!-- xs:anyURI --> </relative-uri> </focus> <menu> <activate-uri> <!-- xs:anyURI --> </activate-uri> <show-uri> <!-- xs:anyURI --> </show-uri> <hide-uri> <!-- xs:anyURI --> </hide-uri> <move-uri> <!-- xs:anyURI --> </move-uri> </menu> <presets-uri> <!-- xs:anyURI --> </presets-uri> </ptz> </camera>
Приклад роботи з ресурсом:
GET /cameras HTTP/1.1 Host: 127.0.0.1 Accept: application/json
HTTP/1.1 200 OK Date: Mon, 23 May 2005 21:07:53 GMT Content-Type: application/json [ { "uri": "http://127.0.0.1/3r5ggsbJHke", "name": "Зиповская", "width": 640, "height": 480, "image-uri": "http://127.0.0.1/Ogei7uquahbohyae", "video-uri": "http://127.0.0.1/pamua8Eif4moh6ae" }, "osd-uri": "http://127.0.0.1/knnfHg6" }, { "uri": "http://127.0.0.1/7GheuI95dfghk", "name": "Зиповская PTZ", "width": 1280, "height": 800, "image-uri": "http://127.0.0.1/PeevupeeNgeir7eu", "video-uri": "http://127.0.0.1/EK8Shadi3fa3noe1", "osd-uri": "http://127.0.0.1/Ldh485h" }, "ptz": { "focus": { "relative-uri": "http://127.0.0.1/ahgae6Shah1oothi" }, "menu": { "activate-uri": "http://127.0.0.1/quee0tieMe1weiRa", "show-uri": "http://127.0.0.1/uGai8doosho7Ohfi", "hide-uri": "http://127.0.0.1/Fohbureit0eedoo0", "move-uri": "http://127.0.0.1/EiY3aach4Nuutha8" }, "pan-tilt": { "relative-uri": "http://127.0.0.1/isai7chahCuChait" }, "zoom": { "relative-uri": "http://127.0.0.1/quieJae7zeish3oo" }, "presets-uri": "http://127.0.0.1/neeloe2po1Hua3xa" } }, { "uri": "http://127.0.0.1/hdUneK3oe8", "name": "camera1", "width": 320, "height": 240, "image-uri": "http://127.0.0.1/ethieSho5ching4e", "video-uri": "http://127.0.0.1/cee9rahtoo4uRooh" }, "osd-uri": "http://127.0.0.1/Jy8Uj8" }, { "uri": "http://127.0.0.1/Heo89qli3J", "name": "Коридор", "width": 320, "height": 240, "image-uri": "http://127.0.0.1/xohpai8jeQuohm6f", "video-uri": "http://127.0.0.1/euDaiheejiaGae3s" } "osd-uri": "http://127.0.0.1/Oje654fgbd" } ]
Зображення
Окремий кадр
URI: <image-uri объекта Camera>
Версія: 1.0
MIME-типи: image/jpeg, image/png
Методи: GET
- quality — якість зображення. Задається цілим числом від 0 (максимальне стиснення) до 100 (максимальна якість). Якщо не задане явно, використовується типове значення для камери.
- resolution — розрішення зображення. Якщо не задане, використовується поточне розрішення камери.
- keep_aspect_ratio — зберігати оригінальне співвідношення сторін: 0 - ні, 1 - так. Типове значення 0 (ні).
Приклад роботи з ресурсом:
GET /ethieSho5ching4e?keep_aspect_ratio=1&resolution=640x480 HTTP/1.1 Host: 127.0.0.1 Accept: image/*
HTTP/1.1 200 OK Date: Mon, 23 May 2005 23:15:27 GMT Content-Type: image/jpeg Content-Length: 23185 [Дані зображення]
M-JPEG потік
URI: <video-uri объекта Camera>
Версія: 1.0
MIME-типи: multipart/x-mixed-replace, image/jpeg
Методи: GET
- fps — максимальна кількість кадрів на секунду. Якщо параметр не заданий явно, використовуються поточні налаштування камери.
- quality — якість зображення. Задається цілим числом від 0 (максимальне стиснення) до 100 (максимальна якість). Якщо параметр не заданий, використовується типове значення для камери.
- resolution — розрішення зображення. Якщо не задане, використовується поточне розрішення камери.
- keep_aspect_ratio — зберігати оригінальне співвідношення сторін: 0 - ні, 1 - так. Типове значення 0 (ні).
Приклад роботи з ресурсом:
GET /cee9rahtoo4uRooh?keep_aspect_ratio=0&fps=5&resolution=320x240 HTTP/1.1 Host: 127.0.0.1
HTTP/1.1 200 OK Date: Mon, 23 May 2005 23:15:27 GMT Content-Type: multipart/x-mixed-replace; boundary=xyzzy --xyzzy Content-Type: image/jpeg Content-Length: 15382 [Дані кадру 1] --xyzzy Content-Type: image/jpeg Content-Length: 16105 [Дані кадру 2] [и т.д.]
H.264 потік
URI: <streaming-uri об‘єкту Camera>
Методи: GET
- sub - другий потік (низька роздільна здатність);
- main - перший потік (висока роздільна здатність).
- flv - Flash Video;
- m3u8 - HTTP Live Streaming (HLS) playlist.
Приклади посилань на потоки, де /kfd3ado1sdrms - uri об‘єкту Camera:
/kfd3ado1sdrms/streaming/main.flv - перший потік у форматі Flash Video; /kfd3ado1sdrms/streaming/sub.m3u8 – другий потік у форматі HLS; /kfd3ado1sdrms/streaming/sub.flv - другий потік у форматі Flash Video; /kfd3ado1sdrms/streaming/main.m3u8 – перший потік у форматі HLS.На клієнтах, де неможливо авторизувати запит стандартними засобами (HTTP Digest/Basic Authentication), можлива передача заголовку Authorization одним з параметрів запиту, наприклад
/kfd3ado1sdrms/streaming/main.flv?authorization=Basic%20d2ViOg==
RTSP потік
Протокол: RTSPPort: 9784 (за замовчанням)
URI:
/cameras/<index>/streaming/<name>
Методи: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE
Обмеження: Не реалізовано у Windows-версії
Для формування посилання на потік слід використовувати порядковий номер камери (<index>) та ім’я потоку (<name>), що може приймати два значення:
- sub - другий потік (низька роздільна здатність);
- main - перший потік (висока роздільна здатність).
Приклади посилань на потоки:
rtsp://login:@192.168.0.123:9784/cameras/0/streaming/main?audio=1 rtsp://login:password@192.168.0.123:9784/cameras/15/streaming/subНа клієнтах, де неможливо авторизувати запит стандартними засобами (HTTP Digest/Basic Authentication), можлива передача заголовку Authorization одним із параметрів запиту, наприклад
rtsp://192.168.0.123:9784/cameras/2/streaming/main?authorization=Basic%20d2ViOg==
PTZ
Керування PTZ камери
URI: <absolute-uri или relative-uri объектов Camera/ptz/pan-tilt и Camera/ptz/zoom>
Версія: 1.0
MIME-типи: application/json, application/xml
Методи: PUT
Керування PTZ камери відбувається шляхом запису за вказаними URI об’єктів pan-tilt-data
и zoom-data
.
JSON-представлення pan-tilt-data
{ "x": /* number */, "y": /* number */, "speed": /* number */ }
XML-представлення:
<pan-tilt-data> <x> <!-- xs:float --> </x> <y> <!-- xs:float --> </y> <speed> <!-- xs:float --> </speed> </pan-tilt-data>
JSON-представлення zoom-data:
{ "zoom": /* number */, "speed": /* number */ }
XML-представлення:
<zoom-data> <zoom> <!-- xs:float --> </zoom> <speed> <!-- xs:float --> </speed> </zoom-data>
Допустимі значення параметру speed
в інтервалі [0, 1]. Параметри x
, y
та zoom
для команд відносного повороту задаються в абстрактних одиницях, на даний момент допускаються лише значення -1 та +1.
Приклад – поворот відносно теперішнього положення:
PUT /isai7chahCuChait HTTP/1.1 Host: 127.0.0.1 Content-Type: application/xml <?xml version="1.0" encoding="UTF-8"?> <pan-tilt-data> <x>-1.0</x> <y>0.0</y> <speed>1.0</speed> </pan-tilt-data>
HTTP/1.1 204 No Content Date: Tue, 24 May 2005 17:21:15 GMT
Приклад – відносне масштабування
PUT /quieJae7zeish3oo HTTP/1.1 Host: 127.0.0.1 Content-Type: application/xml <?xml version="1.0" encoding="UTF-8"?> <zoom-data> <zoom>1.0</zoom> <speed>1.0</speed> </zoom-data>
HTTP/1.1 204 No Content Date: Tue, 24 May 2005 17:21:37 GMT
Керування фокусом камери
URI: <absolute-uri или relative-uri объекта Camera/ptz/focus>
Версія: 1.0
MIME-типи: application/json, application/xml
Методи: PUT
JSON-представлення даних фокуса:
{ "focus": /* number */, "speed": /* number */ }
XML-представлення:
<focus-data> <focus> <!-- xs:float --> </focus> <speed> <!-- xs:float --> </speed> </focus-data>
Допускаються значення параметру speed
в інтервалі [0, 1]. Параметр focus
focus для команд відносної зміни фокусу задаються в абстрактних одиницях, на даний момент допустимі лише значення -1 и +1.
Приклад роботи з ресурсом:
PUT /ahgae6Shah1oothi HTTP/1.1 Host: 127.0.0.1 Content-Type: application/json { "focus": -1.0, "speed": 1.0 }
HTTP/1.1 204 No Content Date: Tue, 24 May 2005 17:38:27 GMT
Робота з екранним меню камери
URI: <activate-uri, show-uri, hide-uri и move-uri объекта Camera/ptz/menu>
Версія: 1.0
MIME-типи: application/json, application/xml
Методи: PUT
Ресурси являють собою команди, що запускаються методом PUT. До ресурсів по activate-uri
(обрати пункт меню),
show-uri
(відобразити меню) та hide-uri
(сховати меню) допускається запис повідомлень без тіла запиту.
Переміщення по пунктах меню відбувається шляхом запису команди меню в ресурс по move-uri
.
JSON-представлення команди меню:
{ "action": /* string */ }
XML-представлення:
<menu-command action="xs:string"/>
Де для
action
припускається одне із значень: left
, right
, up
або down
.
Приклад роботи з меню – відобразити меню:
PUT /uGai8doosho7Ohfi HTTP/1.1 Host: 127.0.0.1
HTTP/1.1 204 No Content Date: Tue, 24 May 2005 13:28:15 GMT
Перехід в меню до наступного нижче пункту:
PUT /EiY3aach4Nuutha8 HTTP/1.1 Host: 127.0.0.1 Content-Type: application/json { "action": "down" }
HTTP/1.1 204 No Content Date: Tue, 24 May 2005 13:28:19 GMT
Обрати пункт меню:
PUT /quee0tieMe1weiRa HTTP/1.1 Host: 127.0.0.1
HTTP/1.1 204 No Content Date: Tue, 24 May 2005 13:28:22 GMT
Сховати меню:
PUT /Fohbureit0eedoo0 HTTP/1.1 Host: 127.0.0.1
HTTP/1.1 204 No Content Date: Tue, 24 May 2005 13:28:24 GMT
Всі передналаштування PTZ камери
URI: <presets-uri объекта Camera>
Версія: 1.0
MIME-типи: application/json, application/xml
Методи: GET, POST
Список передналаштувань PTZ конкретної камери.
Приклад роботи з ресурсом:
GET /neeloe2po1Hua3xa HTTP/1.1 Host: 127.0.0.1 Accept: application/xml
HTTP/1.1 200 OK Date: Tue, 24 May 2005 17:14:16 GMT Content-Type: application/xml <?xml version="1.0" encoding="UTF-8"?> <ptz-preset-list> <ptz-preset> <name>Unu</name> <activate-uri>http://127.0.0.1/OhX7iet9aithoofu</activate-uri> <preset-uri>http://127.0.0.1/doo3ree1aef8Vudo</preset-uri> <preview-uri>http://127.0.0.1/eer7vei9thoa4Eik</preview-uri> <update-uri>http://127.0.0.1/keenoo3IthoP4zai</update-uri> </ptz-preset> <ptz-preset> <name>Du</name> <activate-uri>http://127.0.0.1/xee9uz7Aich4tuga</activate-uri> <preset-uri>http://127.0.0.1/gool9hieR3iu5hoh</preset-uri> <preview-uri>http://127.0.0.1/ingae4ooCh8ahb4a</preview-uri> <update-uri>http://127.0.0.1/ohxuof4Su7ekiuDi</update-uri> </ptz-preset> <ptz-preset> <name>Tri</name> <activate-uri>http://127.0.0.1/Uosuu4aivuuchei4</activate-uri> <preset-uri>http://127.0.0.1/Atejae1baeD6Ku4A</preset-uri> <preview-uri>http://127.0.0.1/Sheip2ooXohd1Phe</preview-uri> <update-uri>http://127.0.0.1/haurieP9chosaif4</update-uri> </ptz-preset> </ptz-preset-list>
POST /neeloe2po1Hua3xa HTTP/1.1 Host: 127.0.0.1 Accept: application/xml Content-Type: application/xml <?xml version="1.0" encoding="utf-8"?> <ptz-preset> <name>Kvar</name> </ptz-preset>
HTTP/1.1 201 Created Date: Tue, 24 May 2005 17:14:23 GMT Content-Type: application/xml <?xml version="1.0" encoding="utf-8"?> <ptz-preset> <name>Kvar</name> <activate-uri>http://127.0.0.1/owaSiewahch3ohch</activate-uri> <preset-uri>http://127.0.0.1/xie4Aoz8aqu0aigh</preset-uri> <preview-uri>http://127.0.0.1/laeMeef4Kariphu6</preview-uri> <update-uri>http://127.0.0.1/ahghohK4iezoovah</update-uri> </ptz-preset>
Окреме передналаштування PTZ
URI: <preset-uri объекта PTZPreset>
Версія: 1.0
MIME-типи: application/json, application/xml
Методи: DELETE, GET, PUT
JSON представлення:
{ "name": /* string */, "activate-uri": /* string */, "preview-uri": /* string */, "update-uri": /* string */ }
XML представлення:
<ptz-preset> <name> <!-- xs:string --> </name> <activate-uri> <!-- xs:anyURI --> </activate-uri> <preview-uri> <!-- xs:anyURI --> </preview-uri> <update-uri> <!-- xs:anyURI --> </update-uri> </ptz-preset>
Приклад роботи з ресурсом:
GET /phiwohGh5aer0ye4 HTTP/1.1 Host: 127.0.0.1 Accept: application/json
HTTP/1.1 200 OK Date: Tue, 24 May 2005 14:39:18 GMT Content-Type: application/json { "name": "Xyzzy!", "activate-uri": "http://127.0.0.1/ju9moT7wuciiW7ae", "preview-uri": "http://127.0.0.1/eite4ohLiQu5Veoc", "update-uri": "http://127.0.0.1/WieB4ahng4ieghi9" }
PUT /phiwohGh5aer0ye4 HTTP/1.1 Host: 127.0.0.1 Accept: application/xml Content-Type: application/json { "name": "Zyxxy?", "activate-uri": "http://127.0.0.1/ju9moT7wuciiW7ae", "preview-uri": "http://127.0.0.1/eite4ohLiQu5Veoc", "update-uri": "http://127.0.0.1/WieB4ahng4ieghi9" }
HTTP/1.1 200 OK Date: Tue, 24 May 2005 14:39:37 GMT Content-Type: application/xml <?xml version="1.0" encoding="utf-8"?> <ptz-preset> <name>Zyxxy?</name> <activate-uri>http://127.0.0.1/ju9moT7wuciiW7ae</activate-uri> <preset-uri>http://127.0.0.1/phiwohGh5aer0ye4</preset-uri> <preview-uri>http://127.0.0.1/eite4ohLiQu5Veoc</preview-uri> <update-uri>http://127.0.0.1/WieB4ahng4ieghi9</update-uri> </ptz-preset>
Попередній перегляд зображення з передналаштуванням PTZ
URI: <preview-uri объекта PTZPreset>
Версія: 1.0
MIME-типи: image/jpeg, image/png
Методи: GET
Розмір зображення попереднього перегляду залежить від камери.
Приклад роботи з ресурсом:
GET /eite4ohLiQu5Veoc HTTP/1.1 Host: 127.0.0.1 Accept: image/png
HTTP/1.1 200 OK Date: Tue, 24 May 2005 11:27:16 GMT Content-Type: image/png Content-Length: 2108 [Image data]
Мікрофони
Всі мікрофони
URI: /microphones
Версія: 1.2
MIME-типи: application/json, application/xml
Методи: GET
Список всіх доступних на сервері мікрофонів.
JSON представлення — масив об’єктів microphone
.
XML - представлення:
<microphone-list> <microphone/> <!-- opt --> </microphone-list>
Окремий мікрофон в JSON представленні:
{ "uri": /* string */, "name": /* string */, "audio-uri": /* string */, "camera-uri": /* string */ }
в XML представленні:
<microphone> <uri> <!-- xs:anyURI --> </uri> <name> <!-- xs:string --> </name> <audio-uri> <!-- xs:anyURI --> </audio-uri> <camera-uri> <!-- xs:anyURI --> </camera-uri> </microphone>
Приклад роботи з ресурсом:
GET /microphones HTTP/1.1 Host: 127.0.0.1 Accept: application/json
HTTP/1.1 200 OK Date: Mon, 23 May 2005 21:07:53 GMT Content-Type: application/json [ { "uri": "http://127.0.0.1/6Hjk9l4dudlf", "name": "Зиповская", "audio-uri": "http://127.0.0.1/Ogei7uquahbohyae", "camera-uri": "http://127.0.0.1/pamua8Eif4moh6ae" }, { "uri": "http://127.0.0.1/Pqja954nfrdqcb", "name": "Microphone1", "audio-uri": "http://127.0.0.1/ethieSho5ching4e", "camera-uri": "http://127.0.0.1/cee9rahtoo4uRooh" }, { "uri": "http://127.0.0.1/Q57mak8maogk", "name": "Коридор", "audio-uri": "http://127.0.0.1/xohpai8jeQuohm6f", "camera-uri": "http://127.0.0.1/euDaiheejiaGae3s" } ]
Аудіо
Аудіопотік
URI: <audio-uri объекта Microphone>
Версія: 1.1
MIME-типи: audio/x-wav, audio/mpeg
Методи: GET
- sample_rate — частота вибірки сигналу. Може приймати значення [8000, 11025, 12000, 16000, 22050, 24000,
32000, 44100, 48000] Hz. Якщо не заданий явно, використовується значення 22050.
- bit_rate — бітрейт (наприкла, 128).
Якщо не заданий, використовується 64 kbps для audio/mpeg та 22050 * 16 bps (22.05 kHz * 16 bit) для audio/x-wav, відповідно.
Приклад роботи з ресурсом:
GET /ethieSho5ching4e?sample_rate=44100&bit_rate=128 HTTP/1.1 Host: 127.0.0.1 Accept: audio/mpeg
HTTP/1.1 200 OK Date: Mon, 23 May 2005 23:15:27 GMT Content-Type: audio/mpeg [Аудіодані]
Трансляція аудіо триває до розриву з’єднання будь-якою стороною.
APNR
Отримання:
{ "method" : "plate_recognizer.get_lists_config", "version" : @version }
У відповідь на запит plate_recognizer.get_lists_config:
{ "result" : { "config" : { "lists" : [ ... ] }, "revision" : "1c468c284ec9409fa070c7522a6bc2f710ccc3d5" } }
- revision - сервер обчислює його тільки сам, тому що подання налаштувань може бути різне (msgpack/json/etc.).*
Запит на зміну налаштувань
Відправка:
{ "method" : "plate_recognizer.set_lists_config", "params" : { "config" : { "lists" : [ { "id" : "0", "client_data" : { "name" : "Ті, хто оплатив парковку", "description" : "Немає боргу по оплаті", }, "entries" : [ { "text" : "A123BC456", "client_data" : { "name" : "Іванов І. І.", "description" : "Під’їзд 1, кв. 13, тел: +000000000" } }, { "text" : "A321BC654", "client_data" : { "name" : "Петров П. П.", "description" : "Під’їзд 2, кв. 24, тел: +000000000" } } ] }, { "id" : "1", "client_data" : { "name" : "Ті, хто не оплатив парковку", "description" : "Борг по оплаті", }, "entries" : [ { "text" : "B321CA456", "client_data" : { "name" : "Сидоров С. С.", "description" : "Під’їзд 3, кв. 39, тел: +000000000" } } ] } ] }, "base_revision" : "fa2421b790e473508b60f6c78ce66f3e84a610ca" }, "version" : @version }
- З усіх атрибутів списку серверу важливі тільки id та entries, інші параметри для прикладу.
- base_revision - необов’язковий параметр. Якщо він не зазначений, то список буде прийнятий та збережений без будь-яких перевірок. Якщо зазначений, то сервер порівняє його з поточним значенням "revision" налаштувань, якщо вони збігаються, то список буде прийнятий і збережений, якщо не збігаються, то сервер поверне помилку із зазначенням актуального значення "revision", яке він очікує побачити в подібному запиті:
config { "error" : { "type" : "invalid_param", "message" : "base_revision", "data" : { "revision" : "1c468c284ec9409fa070c7522a6bc2f710ccc3d5" }, } }
OSD (on-screen display)
Створення OSD-об’єкту
URI: <osd-uri объекта Camera>
Версія: 1.5
MIME-типи: application/json, application/xml
Методи: POST
Тіло запиту в JSON представленні:
{ "name": /* string */, "left": /* number */, "top": /* number */, "font-size": /* number */, "font-color": /* string */, "line-count": /* number */, "draw-background": /* number */ }
В XML представленні:
<osd-zone-data> <name> <!-- xs:string --> </name> <left> <!-- xs:nonNegativeInteger --> </left> <top> <!-- xs:nonNegativeInteger --> </top> <font-size> <!-- xs:nonNegativeInteger --> </font-size> <font-color> <!-- xs:string --> </font-color> <line-count> <!-- xs:nonNegativeInteger --> </line-count> <draw-background> <!-- xs:nonNegativeInteger --> </draw-background> </osd-zone-data>
Координати виводу та розмір шрифту задаються у % відносно розмірів кадру.
Параметр <font-color> задається рядком виду #RGB, де R, G, B – значення кольорових складових в hex-форматі в діапазоні [0..255].
Приклад: #FF0000, #0A5B4F.
Параметр <draw-background> задає виділення заднього фону тексту (затемнення або освітлення в залежності від складової яскравості кольору тексту): 0 – не виділяти, 1 - виділяти.
Відповідь серверу у випадку успішного виконання запиту:
HTTP/1.1 201 Created Location: <URI OSD-объекта>
Приклад роботи з ресурсом:
POST <osd-uri объекта Camera> HTTP/1.1 Host: 127.0.0.1 Content-Type: application/json { "name": "xyz", "left": 10, "top": 20, "font-size": 10, "font-color": "#00FF00", "line-count": 10, "draw-background": 1 }
HTTP/1.1 201 Created Date: Mon, 23 May 2005 23:15:27 GMT Location: <osd-uri объекта Camera>/xyz
Видалення OSD-об’єкту
URI: <URI OSD-объекта>
Версія: 1.2
Методи: DELETE
Приклад роботи з ресурсом:
DELETE <URI OSD-объекта> HTTP/1.1 Host: 127.0.0.1
HTTP/1.1 204 No content Date: Mon, 23 May 2005 23:15:27 GMT
Додавання контенту до OSD-об’єкту
URI: <URI OSD-объекта>
Версія: 1.2
MIME-типи: text/plain
Методи: POST
Приклад роботи з ресурсом:
POST <URI OSD-объекта> HTTP/1.1 Host: 127.0.0.1 Content-Type: text/plain Content-Length: 15 Hello, world!!!
HTTP/1.1 201 Created Date: Mon, 23 May 2005 23:15:27 GMT
Видалення контенту з OSD-об’єкту
URI: <URI OSD-объекта>/clear
Версія: 1.2
MIME-типи: text/plain
Методи: PUT
Приклад роботи з ресурсом:
PUT <URI OSD-объекта>/clear HTTP/1.1 Host: 127.0.0.1
HTTP/1.1 204 No content Date: Mon, 23 May 2005 23:15:27 GMT
Події
Створення події
URI: /events
MIME-типи: application/json, application/xml
Методи: POST
Тіло запиту в JSON представленні:
{ "time" : /*string*/, "source" : /*string*/, "name" : /*string*/, "device": /*number*/, "data" : /*string*/ }
Значення полів:
time - час початку події у форматі ISO 8601. Необов’язковий параметр. Типове значення – теперішній час серверу.
source - джерело події. Необов’язковий параметр. Типове значення – пустий рядок.
name - назва події. Необов’язковий параметр. Типове значення – пустий рядок.
device - порядковий номер камери. Необов’язковий параметр. Типове значення - -1 (подія не прив’язана до камери).
data - дані події. Необов’язковий параметр. Типове значення – пустий рядок.
Відповідь серверу у випадку успішного виконання запиту:
HTTP/1.1 201 Created Location: <URI Archive Event object>
Приклад роботи з ресурсом:
POST /events HTTP/1.1 Host: localhost:9786 Content-Type: application/json { "time" : "2005-08-09T18:31:42.201", "source" : "test source", "name" : "test name", "device": 0, "data" : "test data" } HTTP/1.1 201 Created Date: Mon, 23 May 2009 23:15:27 GMT Location: events/gds2w8sd1w
Заголовок Location містить адресу створеного ресурсу події. За ним в подальшому можна отримати доступ до об’єкту події.
RPC (Remote Procedure Call)
URI: /rpc
MIME-типи: application/json, application/x-msgpack
Методи: POST
Ресурс надає простий доступ до можливостей повноцінного протоколу роботи з сервером, що використовується, наприклад, додатком «Спостережний пост», без необхідності реалізовувати мережеву частину взаємодії, дозволяючи використовувати в якості транспорту HTTP
Формати даних
Дані запита можуть бути передані в JSON (версія сервера 7.1.1 і вище) або MessagePack (версія 7.0 і вище) форматах. Сервер завжди віддає відповідь у форматі запита. Кодування тексту - UTF-8. Для досягнення максимальної продуктивності рекомендується використовувати MessagePack. Всі приклади будуть наведені у форматі JSON.
Час
Час подається у вигляді масиву цілих чисел, елементи якого відповідають року, місяцю, дню, годині, хвилині, секунді і мілісекунді. Незначущі завершальні елементи можуть бути опущені, наприклад [2016, 11, 30, 15] відповідає 30 жовтню 2016 року 15:00 і може використовуватися замість [2016, 11, 30, 15, 0, 0, 0].
Структура запиту
У разі одиночного запита, він представляє собою словник з одним обов'язковим полем:
- method - ім'я методу.
і необов'язковими полями:
- params - словник з параметрами;
- id - ціле число, ідентифікатор запита, який буде включений у відповідь;
Приклад запита:
1{ 2 "id" : 42, 3 "method" : "some_method", 4 "params" : 5 { 6 "some_param" : "some_value" 7 } 8}
Структура відповіді
Відповідь також є словником, набір полів якого відрізняється залежно від успішності обробки запита:
- id - ціле число, ідентифікатор запита, який був переданий в запиті;
- result - словник з результатом; міститься у відповіді лише в разі успішної обробки команди;
- error - словник з інформацією про помилку, що виникла.
Приклад відповіді в разі успішного виконання обробки запита:
POST /rpc HTTP/1.1 Host: 127.0.0.1 Content-Type: application/json { "method" : "sum_two_numbers", "params" : { "first" : 30, "second" : 12 } }
HTTP/1.1 200 OK Date: Tue, 07 Jun 2016 07:52:46 GMT Content-Type: application/json { "result" : { "sum" : 42 } }
Приклад відповіді в разі виникнення помилки під час обробки запита:
POST /rpc HTTP/1.1 Host: 127.0.0.1 Content-Type: application/json { "method" : "sum_two_numbers", "params" : { "second" : 30 } }
HTTP/1.1 200 OK Date: Tue, 07 Jun 2016 07:52:46 GMT Content-Type: application/json { "error" : { "type" : "invalid_param", "message" : "first" } }
Batch-запити (Пакетні запити)
Сервер підтримує виконання списку команд, що були передані одночасно. В цьому випадку команди повинні бути представлені у вигляді масиву окремих запитів. Відповідь на такий запит буде представлена у вигляді масиву окремих відповідей, порядок яких відповідатиме порядку запитів:
POST /rpc HTTP/1.1 Host: 127.0.0.1 Content-Type: application/json [ { "method" : "mul_two_numbers", "params" : { "first" : 7, "second" : 6 } }, { "method" : "sub_two_numbers", "params" : { "first" : 30 } } ]
HTTP/1.1 200 OK Date: Tue, 07 Jun 2016 07:52:46 GMT Content-Type: application/json [ { "result" : { "mul" : 42 } }, { "error" : { "type" : "invalid_param", "message" : "second" } } ]
Версія RPC API
Інформація про версію RPC API містить текстове ім’я та цілочислове значення, що збільшується за кожної зміни API сервера. Значення версії може використовуватись для визначення підтримки сервером необхідних методів та їх параметрів. Метод з одним і тим самим ім’ям може по-різному реалізуватись в різних версіях API, наприклад мати інші параметри.
get_version
Приклад запиту:
1{ 2 "method" : "get_version" 3}
Приклад відповіді:
1{ 2 "result" : { 3 "version" : { 4 "name" : "v20200622", 5 "value" : 13 6 } 7 } 8}
Інформація про сервер
get_server_info
Мінімальна версія API: 12
Вміст відповіді:
- id - унікальний ідентифікатор сервера.
- name - ім’я сервера.
- network - інформація про мережеві налаштування сервера, перелік номерів портів для під’єднання до сервера за різними протоколами.
- version - інформація про версію.
- local_time - локальний час сервера.
Приклад запиту:
1{ 2 "method" : "get_server_info", 3 "version" : 12 4}
Приклад відповіді:
1{ 2 "result" : { 3 "info" : { 4 "id" : "bf57f49b771a", 5 "name" : "Devline XVR4", 6 "network" : { 7 "ports" : { 8 "http" : 9786, 9 "main" : 9780, 10 "ping" : 9877, 11 "rtsp" : 9784 12 } 13 }, 14 "version" : { 15 "name" : "v20200901", 16 "value" : 15 17 }, 18 "local_time" : [2020,9,29,16,39,38,226] 19 } 20 } 21}
Користувачі
Налаштування користувачів системи представлені списками груп та користувачів. Кожен користувач може входити до однієї групи або мати незалежні від груп налаштування. Група не може входити до іншої групи. Головний користувач системи (типово "admin") не може наслідувати налаштування груп та мати будь-які обмеження прав. Перелік можливих змін налаштувань головного користувача обмежується встановленням пари логін/пароль та зміною вигляду розміщення камер на екрані.
Занесення користувача до групи здійснюється шляхом встановлення ідентифікатора батьківської групи у списку атрибутів користувача. Користувач, занесений до групи, може як наслідувати кожен окремий атрибут налаштувань батьківської групи, так і перевизначати його значення. Наприклад, користувач може наслідувати список доступних відеопристроїв, але мати унікальний список аудіопристроїв. Якщо значення атрибуту користувача встановлене, то атрибут вважається перевизначеним, якщо ні, то наслідуваним. Якщо атрибут не визначено ні для користувача, ні для батьківської групи, то користувач не має обмежень, що відповідають атрибутові, наприклад, якщо не задано список пристроїв, то доступні всі пристрої.
Атрибути користувача
Обов’язкові:
- id - ідентифікатор;
- name - ім’я;
- secret - секрет користувача, що вираховується як MD5(username:realm:password), де значення "realm", актуальне для сервера, можна отримати за допомогою RPC-методу "auth".
Необов’язкові:
- group - ідентифікатор батьківської групи;
- description - опис;
- enabled - активність, типово true;
- expiration_time - час завершення активності;
- time_ranges - список днів тижня та часових діапазонів активності;
- video_devices - список доступних відеопристроїв;
- audio_devices - список доступних аудіопристроїв;
- ptz_devices - список доступних PTZ-пристроїв;
- server_operations - список доступних серверних операцій;
- client_operations - список доступних клієнтських операцій;
- views - якщо список виглядів не зазначено, то він наслідується від батьківської групи.
Атрибути групи
Обов’язкові:
- id - ідентифікатор;
- name — ім’я.
Необов’язкові:
- description - опис;
- enabled - активність, типово true;
- expiration_time - час завершення активності;
- time_ranges - список днів тижня та часових діапазонів активності;
- video_devices - список доступних відеопристроїв;
- audio_devices - список доступних аудіопристроїв;
- ptz_devices - список доступних PTZ-пристроїв;
- server_operations - список доступних серверних операцій;
- client_operations - список доступних клієнтських операцій.
Права на операції
Список прав на операції задається у вигляді словника, у якому в якості ключів використовуються ідентифікатори операцій, а у якості значень - true або false. Множину усіх операцій, доступних користувачеві, розбито на два списки: серверні та клієнтські операції. Сервер може контролювати лише обмежений набір операцій, що виконуються користувачем, наприклад зміну конфігурації та доступ до архіву, але не може контролювати, приміром, згортання вікна клієнтського застосунку, збереження зображень та використання цифрового збільшення. Деякі операції може бути обмежено і на сервері, і на клієнті, при цьому додаткова заборона операції на клієнті потрібна лише для більш зручної взаємодії з програмою (відсутність елементів інтерфейсу для заборонених на сервері операцій).
Серверні операції:
- archive_access - доступ до архіву;
- archive_events_add - додавання подій до архіву;
- archive_events_access - доступ до подій у архіві;
- adm_configuration - доступ до зміни конфігураційних файлів;
- adm_users - зміна налаштувань користувачів;
- adm_video - зміна налаштувань відеопристроїв;
- adm_audio - зміна налаштувань аудіопристроїв;
- adm_ptz - зміна налаштувань PTZ-пристроїв;
- adm_archive - зміна налаштувань запису архіву;
- adm_network - зміна мережевих налаштувань;
- adm_analytics - зміна налаштувань відеоаналітики;
- adm_reactions - зміна налаштувань реакцій;
- adm_licensing - доступ до налаштувань ліцензування;
- adm_userlog - доступ до користувацького журналу;
- adm_filesystem - доступ до файлової системи сервера;
- adm_monitoring - доступ до моніторингу стану сервера.
Клієнтські операції:
- find_server - пошук серверів;
- select_views - зміна вигляду розміщення камер;
- cam_assignment - зміна розміщення камер у вигляді;
- change_cam_stream - зміна відтворюваного потоку камери;
- change_all_cams_stream - одночасна зміна відтворюваного потоку усіх камер;
- use_zoom - цифрове збільшення зображень;
- save_cam_frame - збереження кадрів;
- setup_cam_color - швидка зміна параметрів зображення камери;
- view_archive - перегляд архіву;
- view_archive_in_folder - перегляд архіву із вказаної папки;
- export_archive - експорт архіву;
- decompose_frames - розкладення архіву на окремі кадри;
- view_archive_events - перегляд подій у архіві;
- add_archive_events - додавання подій до архіву;
- enter_in_adm - адміністрування сервера;
- adm_view_monitoring - моніторинг стану сервера;
- adm_view_analytics - доступ до налаштувань відеоаналітики;
- adm_access_to_filesystem - доступ до файлової системи сервера;
- adm_setup_licensing - доступ до налаштувань ліцензування;
- adm_setup_users - доступ до налаштувань користувачів;
- adm_setup_video - доступ до налаштувань відеопристроїв;
- adm_setup_audio - доступ до налаштувань аудіопристроїв;
- adm_setup_ptz - доступ до налаштувань PTZ-пристроїв;
- adm_setup_network - доступ до мережевих налаштувань;
- adm_setup_archive - доступ до налаштувань запису архіву;
- adm_setup_reactions - доступ до налаштувань реакцій;
- adm_view_userlog - доступ до користувацького журналу;
- close_program - завершення роботи програми;
- maximize_window - розгортання вікна програми на весь екран;
- minimize_window - згортання вікна програми.
Приклади налаштувань користувачів та груп
Користувач без обмежень у правах:
1{ 2 "id" : "00000000", 3 "name" : "admin", 4 "secret" : "d87fab4d658bc121c37936fb957d2fa5" 5}
Від’єднаний користувач із обмеженим списком пристроїв:
1{ 2 "id" : "00000001", 3 "name" : "user", 4 "secret" : "d87fab4d658bc121c37936fb957d2fa5", 5 "description" : "Some text. Some text.", 6 "enabled" : false, 7 "video_devices" : [ "3", "11" ] 8}
Користувач, активний до 2:14 29 серпня 1997 року:
1{ 2 "id" : "00000001", 3 "name" : "user", 4 "secret" : "d87fab4d658bc121c37936fb957d2fa5", 5 "expiration_time" : [1997,8,29,2,14,00] 6}
Група користувачів із обмеженим списком операцій та занесений до неї користувач, що наслідує обмеження операцій та має власні обмеження щодо часу роботи (пн-пт 08:00-19:00 та сб-нд 10:00-15:00):
1{ 2 "id" : "00000001", 3 "name" : "Group1", 4 "server_operations" : { "archive_access" : true }, 5 "client_operations" : { "view_archive" : true, "save_cam_frame" : true } 6}
1{ 2 "id" : "00000001", 3 "name" : "User1", 4 "group" : "00000001", 5 "secret" : "d87fab4d658bc121c37936fb957d2fa5", 6 "time_ranges" : [ 7 { 8 "dow" : [0,1,2,3,4], 9 "start_time" : [8,0,0], 10 "end_time" : [19,0,0] 11 }, 12 { 13 "dow" : [5,6], 14 "start_time" : [10,0,0], 15 "end_time" : [15,0,0] 16 } 17 ] 18}
Користувач, що наслідує усі атрибути батьківської групи, але має свій список доступних виглядів розміщення камер на екрані:
1{ 2 "id" : "00000002", 3 "name" : "user", 4 "secret" : "d87fab4d658bc121c37936fb957d2fa5", 5 "views" : {} 6}
users.get_users
Мінімальна версія API: 12
Отримання списку користувачів сервера.
Приклад запиту:
1{ 2 "method" : "users.get_users", 3 "version" : 12 4}
Приклад відповіді:
1{ 2 "result" : { 3 "users" : [ 4 { 5 "id" : "00000000", 6 "name" : "admin", 7 "secret" : "4fe612b4dcf238983ae0ad620ce4961c" 8 }, 9 { 10 "id" : "00000001", 11 "name" : "user", 12 "secret" : "3ae0ad620ce4961c4fe612b4dcf23898", 13 "video_devices" : ["2", "4"] 14 } 15 ] 16 } 17}
users.get_user
Мінімальна версія API: 12
Отримання налаштувань користувача.
Параметри запиту:
- id - ідентифікатор користувача.
Приклад запиту:
1{ 2 "method" : "users.get_user", 3 "params" : { "id" : "00000000" }, 4 "version" : 12 5}
Приклад відповіді:
1{ 2 "result" : { 3 "user" : { 4 "id" : "00000000", 5 "name" : "admin", 6 "secret" : "4fe612b4dcf238983ae0ad620ce4961c" 7 } 8 } 9}
users.add_user
Мінімальна версія API: 12
Додавання користувача.
Параметри запиту:
- user - набір атрибутів користувача без ідентифікатора.
Приклад запиту:
1{ 2 "method" : "users.add_user", 3 "params" : { 4 "user" : { 5 "name" : "test", 6 "secret" : "fef6bd724619600ebb1de3936337e942" 7 } 8 }, 9 "version" : 12 10}
Приклад відповіді:
1{ 2 "result" : { 3 "user" : { 4 "id" : "00000003" 5 } 6 } 7}
users.remove_user
Мінімальна версія API: 12
Видалення користувача.
Параметри запиту:
- id - ідентифікатор користувача.
Приклад запиту:
1{ 2 "method" : "users.remove_user", 3 "params" : { "id" : "00000002" }, 4 "version" : 12 5}
Приклад відповіді:
1{ 2 "result" : {} 3}
Приклад помилки:
1{ 2 "error" : { 3 "type" : "invalid_param", 4 "message" : "id" 5 } 6}
users.modify_user
Мінімальна версія API: 12
Зміна налаштувань користувача.
Параметри запиту:
- user - набір модифікованих атрибутів користувача, включно з ідентифікатором користувача
Рекомендується включати до набору атрибутів для зміни лише необхідні, наприклад лише "enabled", якщо потрібно від’єднати користувача. Усі не включені у параметри атрибути користувача залишаються незмінними після виконання запиту.
Приклад запиту на від’єднання користувача:
1{ 2 "method" : "users.modify_user", 3 "params" : { 4 "user" : { 5 "id" : "00000003", 6 "enabled" : false 7 } 8 }, 9 "version" : 12 10}
Приклад запиту на включення користувача до групи:
1{ 2 "method" : "users.modify_user", 3 "params" : { 4 "user" : { 5 "id" : "00000003", 6 "group" : "00000002" 7 } 8 }, 9 "version" : 12 10}
Приклад запиту на зміну списку доступних користувачеві відеопристроїів:
1{ 2 "method" : "users.modify_user", 3 "params" : { 4 "user" : { 5 "id" : "00000003", 6 "video_devices" : [ "4", "12" ] 7 } 8 }, 9 "version" : 12 10}
Приклад запиту на зняття обмежень списку доступних користувачеві відеопристроїв (якщо користувача включено до групи, то після виконання запиту він буде наслідувати список батьківської групи; якщо користувач незалежний від груп, то не буде мати обмежень на відеопристрої):
1{ 2 "method" : "users.modify_user", 3 "params" : { 4 "user" : { 5 "id" : "00000003", 6 "video_devices" : null 7 } 8 }, 9 "version" : 12 10}
Приклад відповіді:
1{ 2 "result" : {} 3}
users.get_groups
Мінімальна версія API: 12
Отримання списку груп користувачів сервера.
Схема запиту аналогічна users.get_users.
users.get_group
Мінімальна версія API: 12
Отримання налаштувань групи користувачів.
Параметри запиту:
- id - ідентифікатор групи.
Схема запиту аналогічна users.get_user.
users.add_group
Мінімальна версія API: 12
Додавання групи користувачів.
Параметри запиту:
- group - набір атрибутів групи.
Схема запиту аналогічна users.add_user.
users.remove_group
Мінімальна версія API: 12
Видалення групи користувачів.
Параметри запиту:
- id - ідентифікатор групи.
Схема запиту аналогічна users.remove_user.
users.modify_group
Мінімальна версія API: 12
Зміна налаштувань групи користувачів.
Параметри запиту:
- group - набір модифікованих атрибутів групи, включно з ідентифікатором групи.
Схема запиту аналогічна users.modify_user.
users.get_user_views
Мінімальна версія API: 12
Отримання списку виглядів, доступних користувачеві.
Параметри запиту:
- id - ідентифікатор користувача.
Приклад запиту:
1{ 2 "method" : "users.get_user_views", 3 "params" : { "id" : "00000002" }, 4 "version" : 12 5}
users.set_user_views
Мінімальна версія API: 12
Зміна набору виглядів, доступних користувачеві.
Параметри запиту:
- id - ідентифікатор користувача;
- views - набір виглядів.
users.get_group_views
Мінімальна версія API: 12
Отримання списку виглядів, доступних групі користувачів.
Параметри запиту:
- id - ідентифікатор групи.
Приклад запиту:
1{ 2 "method" : "users.get_group_views", 3 "params" : { "id" : "00000002" }, 4 "version" : 12 5}
users.set_group_views
Мінімальна версія API: 12
Зміна набору виглядів, доступних групі користувачів.
Параметри запиту:
- id - ідентифікатор групи;
- views - набір виглядів.
Конфігурація сервера
Будь-які зміни у конфігурації сервера, наприклад зміна списку користувачів та їх прав, налаштувань камер, параметрів запису архіву й т. д., відразу після внесення є тимчасовими та можуть бути відмінені за командою клієнта або після перезапуску сервера. Закріплення змін налаштувань сервера в конфігураційних файлах здійснюється лише за командою клієнта.
settings.accept
Мінімальна версія API: 13
Збереження усіх поточних налаштувань сервера у конфігураційні файли.
Приклад запиту:
1{ 2 "method" : "settings.accept", 3 "version" : 13 4}
Приклад відповіді:
1{ 2 "result" : {} 3}
settings.reset
Мінімальна версія API: 13
Скидання усіх поточних налаштувань сервера до останнього стану, збереженого у конфігураційних файлах.
Приклад запиту:
1{ 2 "method" : "settings.reset", 3 "version" : 13 4}
Приклад відповіді:
1{ 2 "result" : {} 3}
Архів
Таймлайн архіву
Тут і далі під таймлайном мається на увазі бітове відображення інформації про наявність запису у архіві: чи є архів за одиницю часу. У такому визначенні одиниця часу виступає кроком таймлайну. Сервер дає можливість отримувати таймлайни з будь-яким кроком до 1 секунди. Крок не обов’язково має бути кратним 1 секунді, хвилині, дню й т. д. Будь-який таймлайн може бути вирахуваний з точністю, приміром, до 10 секунд, 16 секунд, 2 хвилин, 30 хвилин, 7 днів і т .д.
Приклади таймлайнів:- [0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] - таймлайн з 1 січня 2016 року по 1 січня 2017 року з роздільником в 1 місяць. В цьому випадку можна побачити, що на сервері доступний архів за лютий і березень;
- [1, 0] - таймлайн з 1 січня 2016 року по 1 січня 2017 року з роздільністю в 6 місяців. Доступний архів за перше півріччя 2016 року;
- [0, 1, 0] - таймлайн з 1 січня 2015 року по 1 січня 2018 року з роздільністю в 1 рік. Доступний архів за 2016 рік;
- [0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 , 0, 0, 0, 0, 0, 0] - таймлайн за лютий 2016 року. Доступний архів за 5 і 17 люте. Слід пам'ятати, що при побудові будь-яких таймлайнів кількість днів будь-якого місяця будь-якого року прийнята за 31, тобто на запит, наприклад, таймлайну за травень, червень і липень сервер надаватиме масив з 93 елементів, де елемент, що відповідає 31 червню завжди буде дорівнювати нулю, тому що такого дня не існує.
- [0, 0, 0, 0, 0, 0, 1, 1, 0, 0] - таймлайн з 00:30 годин 10 березня 2016 року по 00:41 годину 10 березня 2016 року. Доступний архів за 00:36 і 00:37.
archive.get_frames_timeline
Отримання таймлайну.
Параметри запита:
- channel - необов'язковий ідентифікатор каналу, якщо він не вказаний, використовуються всі доступні;
- stream - ідентифікатор потоку ( "video", "video2", "video3", "audio");
- start_time - час початку таймлайну;
- end_time - час закінчення таймлайну;
- unit_len - роздільність таймлайну в секундах.
Вміст відповіді:
- timeline - таймлайн, що був запитаний (опис виведення див. в "Формати даних").
Приклад запита на список днів з архівом будь-якої камери за лютий 2016 року:
1{ 2 "method" : "archive.get_frames_timeline", 3 "params" : 4 { 5 "start_time" : [2016, 2, 1], 6 "end_time" : [2016, 3, 1], 7 "unit_len" : 86400 //кількість секунд в одному дні - 60 * 60 * 24 8 } 9}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "timeline" : [0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0] 5 } 6}
Приклад запита на список хвилин з архівом другого потоку камери 0 за 1 люте 2016 року:
1{ 2 "method" : "archive.get_frames_timeline", 3 "params" : 4 { 5 "channel" : 0, 6 "stream" : "video2", 7 "start_time" : [2016, 2, 1], 8 "end_time" : [2016, 2, 2], 9 "unit_len" : 60 10 } 11}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "timeline" : [0, 0, 1, ... , 0, 0, 1] //the array consists of 1440 elements 5 } 6}
archive.get_motions_timeline
Отримання таймлайну детекції руху за заданим фільтром (аналітика в архіві).
Параметри запита:
- channel - необов'язковий ідентифікатор каналу, якщо він не вказаний, використовуються всі доступні;
- start_time - час початку таймлайну;
- end_time - час закінчення таймлайну (загальна тривалість часового відрізку не повинна перевищувати 5 хвилин);
- unit_len - роздільність таймлайну в секундах;
- filter - словник, що задає параметри фільтрації.
Параметри фільтрації (всі параметри необов'язкові):
- min_area - мінімальний розмір руху у вигляді числа з рухомою комою від 0.0 до 1.0, наприклад 0.1 для руху розміром не менше 10% від розміру кадра;
- max_area - максимальний розмір руху;
- mask64 - 64-бітна маска по сітці із 8х8 осередків, яка накладається на все зображення камери, що представлена у вигляді рядка з 64 символів, кожен з яких може бути "0" або "1", наприклад "0000000000010000000000000000000000000000000000000000000000000000" для фільтрації по руху, що торкається четвертого осередку другого рядка зображення, яке представлено у вигляді таблиці з 8х8 осередків;
- colors - масив, де кожен елемент представляє собою масив з 3-х чисел, що відповідають RGB-компонентам шуканого кольору в діапазоні [0, 255].
Вміст відповіді:
- timeline - таймлайн, що був запитаний (опис виведення див. в "Формати даних").
Приклад запита:
1{ 2 "method" : "archive.get_motions_timeline", 3 "params" : 4 { 5 "start_time" : [2016, 2, 1, 18, 0, 0], 6 "end_time" : [2016, 2, 1, 18, 5, 0], 7 "unit_len" : 60, 8 "filter" : 9 { 10 "min_area" : 0.03, 11 "colors" : [[120, 16, 23], [43, 55, 233]] 12 } 13 } 14}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "timeline" : [0, 1, 0, 0, 1] 5 } 6}
archive.get_channels_list
Отримання списку камер, що доступні в архіві, за вказаний відрізок часу.
Параметри запита:
- start_time - початок часового відрізку для пошуку доступних каналів;
- end_time - закінчення часового відрізку для пошуку доступних каналів.
Вміст відповіді:
- channels - масив, де кожен елемент відповідає одному каналу.
Вміст елемента масиву "channels":
- channel - ідентифікатор каналу.
Приклад запита:
1{ 2 "method" : "archive.get_channels_list", 3 "params" : 4 { 5 "start_time" : [2016, 1, 6], 6 "end_time" : [2016, 1, 7] 7 } 8}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "channels" : 5 [ 6 { 7 "channel" : 0 8 }, 9 { 10 "channel" : 1 11 } 12 ] 13 } 14}
archive.get_streams_list
Отримання списку потоків певної камери, що доступні в архіві, за вказаний відрізок часу.
Параметри запита:
- channel - ідентифікатор каналу;
- start_time - початок часового відрізку для пошуку доступних потоків;
- end_time - закінчення часового відрізку для пошуку доступних потоків.
Вміст відповіді:
- streams - масив, де кожен елемент відповідає одному потоку.
Вміст елемента масиву "streams":
- stream - ідентифікатор потоку.
Приклад запита:
1{ 2 "method" : "archive.get_streams_list", 3 "params" : 4 { 5 "channel" : 0, 6 "start_time" : [2016, 1, 6], 7 "end_time" : [2016, 1, 7] 8 } 9}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "streams" : 5 [ 6 { 7 "stream" : "video" 8 }, 9 { 10 "stream" : "video2" 11 }, 12 { 13 "stream" : "video3" 14 }, 15 { 16 "stream" : "audio" 17 }, 18 ] 19 } 20}
archive.get_frames_list
Отримання списку кадрів, що доступні для завантаження.
Параметри запита:
- channel - ідентифікатор каналу;
- stream - ідентифікатор потоку;
- start_time - початок часового відрізку для пошуку кадрів;
- end_time - закінчення часового відрізку для пошуку кадрів.
Вміст відповіді:
- frames_list - масив, де кожен елемент відповідає одному кадру.
Вміст елемента масиву "frames_list":
- id - ідентифікатор кадру;
- gop_index - порядковий номер кадру в GOP, 0 - опорний / контрольний / intra кадр;
- timestamp - час кадра.
Приклад запита списку кадрів потоку "video" камери 0 за 13:00 годин 1 березня 2016 року:
1{ 2 "method" : "archive.get_frames_list", 3 "params" : 4 { 5 "channel" : 0, 6 "stream" : "video", 7 "start_time" : [2016, 3, 1, 13, 0], 8 "end_time" : [2016, 3, 1, 14, 0] 9 } 10}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "frames_list" : 5 [ 6 { 7 "id" : "f9lk3jfs42df41fsdj4", 8 "gop_index" : 12, 9 "timestamp" : [2016, 3, 1, 13, 11, 43, 543] 10 }, 11 { 12 "id" : "kdj48dh2n", 13 "gop_index" : 13, 14 "timestamp" : [2016, 3, 1, 13, 11, 43, 659] 15 }, 16 ... , 17 { 18 "id" : "ja4wds94dk34", 19 "gop_index" : 2, 20 "timestamp" : [2016, 3, 1, 13, 58, 12, 78] 21 } 22 ] 23 } 24}
archive.get_frame
Отримання даних певного кадра. Метод підтримується лише у форматі application / x-msgpack.
Параметри запита:
- channel - ідентифікатор каналу;
- stream - ідентифікатор потоку;
- id - ідентифікатор кадра.
Вміст відповіді:
- frame - словник з метаінформацією і даними кадра.
Вміст словника "frame":
- info - словник з інформацією про кадр;
- raw_bytes - дані кадра.
Вміст словника "info" на запит відео кадра:
- timestamp - час кадра;
- gop_index - порядковий номер кадра в GOP;
- width (може бути відсутнім) - ширина кадра;
- height (може бути відсутнім) - висота кадра;
- codec - одне із значень: "h264", "mpeg4", "mjpeg".
Вміст словника "info" при запиті аудіо кадра:
- timestamp - час кадра;
- codec - зараз можливо тільки значення "pcm";
- channels - кількість каналів звуку;
- sps - кількість звітів в секунду (samples per second);
- bps - кількість бітів в секунду (bit per second).
Приклад запита:
1{ 2 "method" : "archive.get_frame", 3 "params" : 4 { 5 "channel" : 0, 6 "stream" : "video", 7 "id" : "deadbeef" 8 } 9}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "frame" : 5 { 6 "info" : 7 { 8 "timestamp" : [2016, 12, 23, 12, 54, 26, 943], 9 "gop_index" : 21, 10 "codec" : "h264" 11 }, 12 "raw_bytes" : ... 13 } 14 } 15}
archive.seek_frame
Пошук найближчого кадру в архіві. Отримання даних кадру підтримується лише в форматі application/x-msgpack.
Параметри запиту:
- channel - ідентифікатор каналу;
- stream - ідентифікатор потоку;
- start_time - час початку пошуку кадру;
- direction - напрям пошуку кадру у вигляді стрічки "forward" або "backward";
- read_data - прапорець, що вказує на необхідність прочитати дані кадру з диску додатково до інформації про нього.
Вміст відповіді:
- frame - словник із метаінформацією та даними кадру у випадку встановлення прапорця "read_data".
Вміст полів словника "frame" повністю відповідає вмісту однойменного словника у відповіді на метод "archive.get_frame".
Якщо серверу не вдалось знайти жодного кадру, буде видано помилку.
Приклад запиту:
1{ 2 "method" : "archive.seek_frame", 3 "params" : 4 { 5 "channel" : 0, 6 "stream" : "video3", 7 "start_time" : [2016, 12, 1, 13, 0], 8 "read_data" : true, 9 "direction" : "backward" 10 } 11}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "frame" : 5 { 6 "info" : 7 { 8 "timestamp" : [2016, 11, 23, 12, 54, 26, 943], 9 "gop_index" : 0, 10 "codec" : "mjpeg" 11 }, 12 "raw_bytes" : ... 13 } 14 } 15}
archive.seek_frames
Пошук найближчої послідовності кадрів у архіві.
Додаткові у порівнянні з "archive.seek_frame" параметри запиту:
- quantity - кількість результуючих послідовних кадрів відносно першого, що відповідає заданим параметрам.
Вміст відповіді:
- frames - масив, де кожен елемент відповідає словнику "frame" у відповіді на запит "archive.seek_frame".
Користувацький журнал подій
userlog.get_messages
Отримання повідомлень журналу подій.
Параметри запиту:
- backward - зворотний порядок записів (від нових до старих), типове значення: true;
- offset - початковий зсув вибірки повідомлень, типове значення при прямому порядку: 0, при зворотному: -1 (найновіше повідомлення);
- count - максимальна кількість повідомлень для вибірки, типове значення: 1000;
- filter - фільтр вибірки за допомогою алгоритму повнотекстового пошуку.
Можливі поля фільтру:
- timestamp - список підстрічок для повнотекстового пошуку за часом повідомлень;
- level - список підстрічок для повнотекстового пошуку за рівнем повідомлень;
- text - список підстрічок для повнотекстового пошуку за текстом повідомлень.
Вміст відповіді:
- message - масив, де кожен елемент відповідає одному повідомленню.
Вміст елемента масиву "messages":
- id - ідентифікатор повідомлення;
- timestamp - час;
- level - рівень, можливі значення: "info", "warn", "error";
- text - текст.
Приклад запиту списку повідомлень:
1{ 2 "method" : "userlog.get_messages", 3 "params" : 4 { 5 "count" : 2, 6 "filter" : 7 { 8 "text" : [ "signal Camera+2" ] 9 } 10 } 11}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "messages" : 5 [ 6 { 7 "id" : 7297, 8 "level" : "warn", 9 "text" : "Restored signal from camera 'Camera 2'", 10 "timestamp" : [2019,3,26,15,50,14,0] 11 }, 12 { 13 "id" : 7296, 14 "level" : "warn", 15 "text" : "Lost signal from camera 'Camera 2'", 16 "timestamp" : [2019,3,26,15,49,56,0] 17 } 18 ] 19 } 20}
Моніторинг стану сервера
monitoring.get_server_state
Отримання стану сервера (серверної частини ПО).
Вміст відповіді:
- local_time - локальний час сервера;
- start_time - час запуску серверної частини ПО.
Приклад запиту:
1{ 2 "method" : "monitoring.get_server_state", 3}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "state" : 5 { 6 "local_time" : [2019,3,29,14,34,26,889], 7 "start_time" : [2019,3,29,8,8,29,651] 8 9 } 10 } 11}
monitoring.get_network_state
Вміст відповіді:
- clients - список активних мережевих під’єднань до сервера.
Вміст елемента масиву "clients":
- address - IP-адреса клієнта;
- user - ідентифікатор користувача;
- connect_time - час під’єднання;
- archive_access - дні архіву, до яких клієнт отримував доступ.
Приклад запиту:
1{ 2 "method" : "monitoring.get_network_state", 3}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "state" : 5 { 6 "clients" : 7 [ 8 { 9 "address" : "192.168.1.230", 10 "connect_time" : [2019,3,27,8,17,51,418], 11 "user" : "00000000" 12 }, 13 { 14 "address" : "192.168.1.233", 15 "archive_access" : [[2019,3,28],[2019,3,29]], 16 "connect_time" : [2019,3,27,8,17,50,32], 17 "user" : "00000001" 18 } 19 ] 20 } 21 } 22}
monitoring.get_media_state
Вміст відповіді:
- cameras - словник, що містить стан кожної камери сервера.
Вміст елемента словника "cameras":
- enabled - чи увімкнена камера;
- streams - словник, що містить стан кожного потоку камери.
Вміст елемента словника "streams":
- enabled - чи увімкнений потік;
- active - чи оновлюються медіадані потоку;
- datarate - середня за декілька останніх секунд кількість байтів даних, що поступають потоком;
- framerate - середня за декілька останніх секунд кількість кадрів, що поступають потоком.
Приклад запиту:
1{ 2 "method" : "monitoring.get_media_state", 3}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "state" : 5 { 6 "cameras" : 7 { 8 "0" : 9 { 10 "enabled" : true, 11 "streams" : 12 { 13 "audio" : 14 { 15 "datarate" : 0.0000, 16 "enabled" : false, 17 "framerate" : 0.0000 18 }, 19 "video" : 20 { 21 "active" : true, 22 "datarate" : 49302.3810, 23 "enabled" : true, 24 "framerate" : 4.1667 25 }, 26 "video2" : 27 { 28 "active" : true, 29 "datarate" : 4772.2654, 30 "enabled" : true, 31 "framerate" : 4.1841 32 } 33 } 34 } 35 } 36 } 37 } 38}
monitoring.get_archive_state
Вміст відповіді:
- storages - список сховищ, залучених сервером.
Вміст елемента масиву "storages":
- path - шлях до сховища;
- available - прапорець доступності сховища;
- free_space - об’єм вільного місця в мегабайтах;
- write - словник з даними про записи архіву.
Вміст словника "write":
- datarate - середня за декілька останніх секунд кількість байтів даних, що поступають на запис до сховища;
- queue_size - максимальне за декілька останніх секунд відносне значення розміру черги запису сховища щодо максимально можливого;
- last_error_time - час останньої помилки запису до сховища.
Приклад запиту:
1{ 2 "method" : "monitoring.get_archive_state", 3}
Приклад відповіді:
1{ 2 "result" : 3 { 4 "state" : 5 { 6 "storages" : 7 [ 8 { 9 "available" : true, 10 "free_space" : 719937, 11 "path" : "X:\\line_archive\\", 12 "write" : 13 { 14 "datarate" : 2186664.4444, 15 "last_error_time" : [2019,3,29,8,1,23,211], 16 "queue_size" : 0.0045 17 } 18 } 19 ] 20 } 21 } 22}
Інше
Версія протоколу
URI: /version
Версія: 1.1
MIME-типи: application/json, application/xml
Методи: GET
Версія протоколу, що підтримується даним сервером. Застосовується лише метод GET
без параметрів рядка запиту.
Версія протоколу в JSON представленні виглядає наступним чином:
{ "major": /* number */, "minor": /* number */ }
В XML представленні чином:
<version> <major> <!-- xs:int --> </major> <minor> <!-- xs:int --> </minor> </version>
Приклад роботи з ресурсом:
GET /version HTTP/1.1 Host: 127.0.0.1 Accept: application/xml
HTTP/1.1 200 OK Date: Mon, 23 May 2005 22:38:34 GMT Content-Type: application/xml <?xml version="1.0" encoding="utf-8"?> <version> <major>2</major> <minor>37</minor> </version>
Зміни специфікації
Версія 1.0
- Зміни в XML представленні приведені до єдиного формату — нижній регістр символів, символ "
-
" в якості розділювача слів.
- Параметри камери (розрішення, кольоровість тощо) не видаються в представленні камери.
- Визначені типові значення для параметрів запиту зображень (розрішення, якість тощо).
- Версія протоколу 0.0 не підтримується.
Версія 1.1
- Додана підтримка об’єкту „мікрофон”.
- • Виправлена помилка описання імен тегів виду <xxx-uri> (в попередній версії були вказані як <xxx-url>).
Версія 1.2
- Додано поле <uri> до об’єкту Camera.
- Додано поле <uri> до об’єкту Microphone.
- Додана підтримка об’єкту "OSD" (on-screen display).
- Додано поле <osd-uri> до об’єкту Camera.
Версія 1.3
- Доданий колір тексту (поле <font-color>) до об’єкту OSD.
Версія 1.4
- Додані поля <width> и <height> та об’єкту Camera.
- Доданий параметр keep_aspect_ratio до об’єкту Зображення.
Версія 1.5
- Додано поле <draw-background> до об’єкту OSD.