API
Этот документ предоставит обзор API ZoneMinder.
Обзор
В рамках усилий по дальнейшему «открытию» ZoneMinder потребовался API. Это позволит быстро интегрировать ZoneMinder и развивать его.
API построено на CakePHP и находится в директории /api. Оно предоставляет RESTful-сервис и поддерживает функции CRUD (создание, получение, обновление, удаление) для Мониторов, Событий, Рамок, Зон и Настроек.
API-оболочки
pyzm - это обертка на Python для API ZoneMinder. Она поддерживает как устаревший, так и новый токен-ориентированный API, а также поддержку логов ZoneMinder/общей памяти ZoneMinder. Более подробную информацию можно найти на сайте проекта https://github.com/pliablepixels/pyzm/ . Документация находится здесь.
Эволюция API
API ZoneMinder эволюционировал со временем. Говоря в общих чертах, итерации были следующими:
До версии 1.29 на самом деле не было слоя API. Пользователям приходилось использовать те же URL-адреса, которые использовал веб-консоль для «имитации» операций, или использовать XML-оболочку
Начиная с версии 1.29, была выпущена версия 1.0, основанная на CakePHP, которая продолжает развиваться со временем. С точки зрения безопасности, она все еще была связана с ZM auth и требовала клиентских куки для многих операций. В основном, предлагалось два режима аутентификации:
Вы используете файлы cookie для поддержания состояния сессии (
ZM_SESS_ID)Вы используете хеш аутентификации для проверки себя, который включал кодирование личной информации и временных меток, что иногда вызывало проблемы с проверкой времени, особенно у мобильных потребителей
Начиная с версии 1.34, ZoneMinder вводит новую систему «токенов», основанную на JWT. Мы присвоили ей версию ID „2.0“. Эти токены не содержат никаких личных данных и могут безопасно передаваться между запросами. Он вводит концепции, такие как токены доступа, токены обновления и уровень API ревокации пользователя для управления безопасностью. Все внутренние компоненты ZoneMinder теперь поддерживают эту новую схему, и если вы используете API, мы настоятельно рекомендуем вам обновиться до 1.34 и использовать новую систему токенов (кстати, версия 1.34 также переходит от MySQL PASSWORD к Bcrypt для паролей, что также является еще одной причиной для миграции).
Обратите внимание, что начиная с версии 1.34, оба варианта доступа к API будут работать (токены и старый механизм аутентификации с использованием хэша), однако по умолчанию мы больше не используем сессии. Вам придется добавить параметр запроса
stateful=1при входе в систему, чтобы сообщить ZM о том, что нужно установить куки и сохранить необходимую информацию в сессии. Этот вариант доступен только в том случае, еслиOPT_USE_LEGACY_API_AUTHустановлен в ON.
Примечание
Для остальной части документа мы будем специально выделять только функции версии 2.0. Если вы не видите специального упоминания, предположите, что оно применимо для обеих версий API.
Включение API
ZoneMinder приходит с API включенными. Чтобы проверить, включены ли API, посетите «Параметры->Система». Если «OPT_USE_API» включен, ваши API активны. Для v2.0 API у вас есть дополнительная опция прямо под ней:
OPT_USE_LEGACY_API_AUTH, который по умолчанию включен. Когда он включен, API login.json (обсуждается позже) вернет как старые стили (auth=), так и новые (token=). Причина, по которой это включено по умолчанию, заключается в том, что любое существующее приложение, использующее API, сломается, если оно не будет обновлено до версии 2.0. (Примечание: начиная с zmNinja 1.3.057 и далее будет поддерживаться токены)
Включение секретного ключа
Важно, чтобы вы создали «Секретный ключ». Это должен быть набор трудно угадываемых символов, которые знаете только вы. ZoneMinder не создает для вас ключ. Это ваша ответственность. Если вы еще не создали его, пожалуйста, сделайте это, перейдя к «Параметры->Системы» и заполнив «AUTH_HASH_SECRET». Не забудьте сохранить.
Если вы планируете использовать версию 2.0, основанную на токенах, необходимо заполнить этот секретный ключ, так как он используется для подписи токена. Если этого не сделать, аутентификация токена будет неудачной. В версии 1.0 это требование не было обязательным.
Получение ключа API
Чтобы получить ключ API:
curl -XPOST -d "user=yourusername&pass=yourpassword" https://yourserver/zm/api/host/login.json
Если вы хотите использовать состояние соединения, так что вам не придется передавать учетные данные для аутентификации с каждым запросом, вы можете использовать следующее:
curl -XPOST -c cookies.txt -d "user=yourusername&pass=yourpassword&stateful=1" https://yourserver/zm/api/host/login.json
Это возвращает тело, подобное этому, для версии API 1.0:
{
"credentials": "auth=05f3a50e8f7<deleted>063",
"append_password": 0,
"version": "1.33.9",
"apiversion": "1.0"
}
Или для API 2.0:
{
"access_token": "eyJ0eXAiOiJK<deleted>HE",
"access_token_expires": 3600,
"refresh_token": "eyJ0eXAiOi<deleted>mPs",
"refresh_token_expires": 86400,
"credentials": "auth=05f3a50e8f7<deleted>063", # only if OPT_USE_LEGACY_API_AUTH is enabled
"append_password": 0, # only if OPT_USE_LEGACY_API_AUTH is enabled
"version": "1.33.9",
"apiversion": "2.0"
}
Используя эти ключи с последующими запросами
После того как у вас есть ключи (также известные как учетные данные (версия 1.0, версия 2.0) или токен (версия 2.0)), вы должны теперь предоставить этот ключ последующим вызовам API следующим образом:
# v1.0 or 2.0 based API access (will only work if AUTH_HASH_LOGINS is enabled
# RECOMMENDED: v2.0 token based
curl -XGET https://yourserver/zm/api/monitors.json?token=<access_token>
# or, for legacy mode:
curl -XGET https://yourserver/zm/api/monitors.json?auth=<hex digits from 'credentials'>
# or, if you specified -c cookies.txt in the original login request
curl -b cookies.txt -XGET https://yourserver/zm/api/monitors.json
Примечание
Если вы используете запрос типа HTTP GET, тотокен/авторизация должны быть переданы в качестве параметра запроса в URL. Если вы используете запрос типа HTTP POST (например, когда вы используете API для изменения монитора, например), вы можете выбрать передачу токена в качестве данных нагрузки вместо этого. Слой API игнорирует данные нагрузки для HTTP GET. Наконец, если вы не передаете ключи, вы также можете использовать куки (не рекомендуется как общий подход).
Срок действия ключа (версия 1.0)
Если вы используете старый механизм аутентификации, присутствующий в версии 1.0, то учетные данные будут истекать через время сессии PHP (если вы используете файлы cookie), или значение AUTH_HASH_TTL (если вы используете auth= и включили AUTH_HASH_LOGINS), которое по умолчанию равно 2 часам. Обратите внимание, что нет способа взглянуть на хэш и расшифровать, сколько времени осталось. Поэтому это ваша ответственность записать время, когда вы получили хэш, и предположить, что он был сгенерирован в момент его получения и повторно войдите до истечения этого времени.
Срок действия ключа (версия 2.0)
В версии 2.0 легко узнать, когда ключ истечет до его использования. Вы можете найти это из значений access_token_expires и refresh_token_expires (в секундах) после декодирования ключа JWT (для каждого языка есть библиотеки для декодирования JWT). Вам следует обновить ключи до истечения срока действия, иначе вы не сможете использовать API.
Понимание токенов доступа/обновления (версия 2.0)
Если вы используете V2.0, то вам необходимо знать, как эффективно использовать эти токены:
Токены доступа имеют ограниченный срок действия. Токены доступа от ZoneMinder действуют в течение 3600 секунд (1 час).
Токены доступа должны использоваться для всех последующих обращений к API.
Токены refresh должны использоваться только для генерации новых токенов доступа. Например, если токен доступа живет 1 час, перед тем как час закончится, вызовите API
login.jsonвыше с токеном refresh, чтобы получить новый токен доступа. ZoneMinder выдает токены refresh, которые живут 24 часа.Для генерации нового токена для повторной загрузки до истечения 24 часов вам потребуется передать свои учетные данные пользователя и пароль в файл
login.json.
В двух словах:
Передавайте свои
usernameиpasswordвlogin.jsonтолько один раз в течение 24 часов для обновления токеновПередавайте свой «токен обновления» в файл
login.jsonкаждые два часа (или какое бы значение вы ни установили дляAUTH_HASH_TTL), чтобы обновить вашaccess tokenИспользуйте свой
access tokenдля всех вызовов API.
На самом деле, версия 2.0 отклонит ваш запрос (если он не будет содержать файл login.json) в случае, если он будет содержать токен обновления вместо токена доступа, чтобы отговорить использование этого токена, когда его не следует использовать.
Это минимизирует количество чувствительной информации, передаваемой по проводу, и сроки действия сделаны такими, что если они будут скомпрометированы, вы можете перегенерировать или аннулировать их (об этом позже)
Понимание ключевых вопросов безопасности
Версия 1.0 использует хэш MD5 для генерации учетных данных. Хэш вычисляется по вашему секретному ключу (если он доступен), имени пользователя, паролю и некоторым параметрам времени (вместе с удаленным IP, если это разрешено). Это не является безопасным/рекомендуемым механизмом хэширования. Если ваш хэш аутентификации скомпрометирован, злоумышленник сможет использовать ваш хэш до истечения срока его действия. Чтобы избежать этого, вы можете отключить пользователя в ZoneMinder. Кроме того, включение удаленного IP (
AUTH_HASH_REMOTE_IP) требует, чтобы вы отправляли будущие запросы с того же IP, который сгенерировал токены. Хотя это может считаться дополнительным слоем безопасности, это может вызвать проблемы с мобильными устройствами.Версия 2.0 использует другой подход. Хэш - это просто зашифрованная base64 форма «заявлений», подписанная вашим секретным ключом. Рассмотрим, например, следующий ключ доступа:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJab25lTWluZGVyIiwiaWF0IjoxNTU3OTQwNzUyLCJleHAiOjE1NTc5NDQzNTIsInVzZXIiOiJhZG1pbiIsInR5cGUiOiJhY2Nlc3MifQ.-5VOcpw3cFHiSTN5zfGDSrrPyVya1M8_2Anh5u6eNlI
Если бы вы использовали любой токен JWT верификатор , он легко декодировал бы этот токен и показал бы:
{
"iss": "ZoneMinder",
"iat": 1557940752,
"exp": 1557944352,
"user": "admin",
"type": "access"
}
Invalid Signature
Не удивляйтесь. Токены JWT по умолчанию не предназначены для шифрования. Это просто утверждение о претензии. Он утверждает, что эмитентом этого токена была ZoneMinder, он был выпущен в (iat) среду, 15 мая 2019 года, 17:19:12 UTC и истечет в (exp) среду, 15 мая 2019 года, 18:19:12 UTC. Этот токен претендует на то, что он принадлежит администратору и является токеном доступа. Если бы ваш токен был украден, эта информация была бы доступна тому, кто его украл. Обратите внимание, что в этом заявлении нет чувствительной информации, такой как пароли.
Однако у этого человека не будет вашего секретного ключа в качестве части этого токена, и поэтому он не сможет создать новый токен JWT для получения, скажем, токена для повторной аутентификации. Однако они смогут использовать ваш токен доступа для доступа к ресурсам, как и хэш аутентификации выше, до истечения срока действия токена доступа (2 часа). Чтобы отозвать этот токен, вам не нужно отключать пользователя. Перейдите в Options->API и нажмите «Отзыв всех токенов доступа». Это немедленно аннулирует токен (эта опция аннулирует все токены для всех пользователей, и новые токены должны быть сгенерированы).
Со временем мы предоставим вам более детальный доступ к этим опциям.
Обзор хороших практик:
Используйте HTTPS, а не HTTP
По возможности используйте бесплатные сервисы, такие как LetsEncrypt , вместо самоподписанных сертификатов (в некоторых случаях это невозможно)
Храните свои токены как можно более конфиденциально и используйте их так, как рекомендуется выше
Если вы считаете, что ваши токены скомпрометированы, отозовите их, но также проверьте, не скомпрометировал ли ваш противник больше, чем вы думаете (например, они могут также иметь ваш логин/пароль или доступ к вашей системе через другие эксплойты, в результате чего они могут генерировать столько токенов/кредитных данных, сколько захотят).
Примечание
Следующие разделы не явно указывают на ключевое дополнение к API. Мы предполагаем, что вы добавите правильные ключи в соответствии с нашим объяснением выше.
Примеры
(Во всех примерах замените „сервер“ на IP-адрес или имя хоста и порт, где работает Zoneminder)
API Версия
Для получения версии API:
curl http://server/zm/api/host/getVersion.json
Возвращает список всех мониторов
curl http://server/zm/api/monitors.json
Стоит отметить, что начиная с версии ZM 1.32.3 и далее, этот API также возвращает объект Monitor_Status для каждого монитора. Он выглядит так:
"Monitor_Status": {
"MonitorId": "2",
"Status": "Connected",
"CaptureFPS": "1.67",
"AnalysisFPS": "1.67",
"CaptureBandwidth": "52095"
}
Если вы не видите этого в своем API, вы используете более старую версию ZM. Это дает вам очень удобный способ проверить статус монитора без вызова API daemonCheck, описанного позже.
Получить монитор 1
curl http://server/zm/api/monitors/1.json
Изменить состояние монитора 1
Этот API изменяет монитор 1, чтобы включить обнаружение движения и запись при обнаружении движения (аналогично старой функции Modect)
curl -XPOST http://server/zm/api/monitors/1.json -d "Monitor[Analysing]=Always&Monitor[Recording]=OnMotion"
Получить статус демона монитора 1
curl http://server/zm/api/monitors/daemonStatus/id:1/daemon:zmc.json
Добавить монитор
Эта команда добавит новый HTTP-монитор.
curl -XPOST http://server/zm/api/monitors.json -d "Monitor[Name]=Cliff-Burton\
&Monitor[Capturing]=Always\
&Monitor[Analysing]=Always\
&Monitor[Recording]=Always\
&Monitor[Protocol]=http\
&Monitor[Method]=simple\
&Monitor[Host]=usr:pass@192.168.11.20\
&Monitor[Port]=80\
&Monitor[Path]=/mjpg/video.mjpg\
&Monitor[Width]=704\
&Monitor[Height]=480\
&Monitor[Colours]=4"
Редактировать монитор 1
Эта команда изменит поле „Имя“ монитора 1 на „test1“
curl -XPUT http://server/zm/api/monitors/1.json -d "Monitor[Name]=test1"
Удалить монитор 1
Эта команда удалит Монитор 1, но не удалит никакие События, которые зависят от него.
curl -XDELETE http://server/zm/api/monitors/1.json
Мониторы «Включить/Выключить»
Эта команда заставит сработать будильник на мониторе 1:
curl http://server/zm/api/monitors/alarm/id:1/command:on.json
Эта команда отключит сигнал тревоги на мониторе 1:
curl http://server/zm/api/monitors/alarm/id:1/command:off.json
Этот команда будет сообщать о состоянии тревоги Монитор 1:
curl http://server/zm/api/monitors/alarm/id:1/command:status.json
Возвращает список всех событий
http://server/zm/api/events.json
Обратите внимание, что список событий может быть довольно большим, и этот API (как и все другие API в ZM) использует функцию прокрутки. Каждая страница возвращает определенный набор записей. По умолчанию это 25, и связано с WEB_EVENTS_PER_PAGE в меню настроек ZM.
Итак, логика для прохода по всем событиям должна выглядеть примерно так (псевдокод): (к сожалению, нет способа получить количество страниц без получения первой страницы)
data = http://server/zm/api/events.json?page=1 # this returns the first page
# The json object returned now has a property called data.pagination.pageCount
count = data.pagination.pageCount;
for (i=1, i<count, i++)
{
data = http://server/zm/api/events.json?page=i;
doStuff(data);
}
Получить событие с идентификатором 1000
curl -XGET http://server/zm/api/events/1000.json
Редактировать событие 1
Эта команда изменит поле „Имя“ события 1 на „Ищи и уничтожай“
curl -XPUT http://server/zm/api/events/1.json -d "Event[Name]=Seek and Destroy"
Удалить событие 1
Эта команда удалит Событие 1 и любые кадры, которые зависят от него.
curl -XDELETE http://server/zm/api/events/1.json
Возвращает список событий для конкретного монитора Id =5
curl -XGET http://server/zm/api/events/index/MonitorId:5.json
Обратите внимание, что та же логика прокрутки применяется, если список слишком длинный
Возвращает список событий для конкретного монитора в определенном диапазоне дат/времени
http://server/zm/api/events/index/MonitorId:5/StartTime >=:2015-05-15 18:43:56/EndTime <=:2015-05-16 18:43:56.json
Чтобы попробовать это в Curl, вам нужно URL-кодировать пробелы таким образом:
curl -XGET "http://server/zm/api/events/index/MonitorId:5/StartTime%20>=:2015-05-15%2018:43:56/EndTime%20<=:2015-05-16%2018:43:56.json"
Возвращает список событий для всех мониторов в пределах заданного диапазона дат/времени
curl -XGET "http://server/zm/api/events/index/StartTime%20>=:2015-05-15%2018:43:56/EndTime%20<=:208:43:56.json"
Вернуть количество событий на основе времени и условий
API также поддерживает удобный механизм возврата количества событий за определенный период времени.
Возвращает количество событий на монитор, зарегистрированных в течение последних одного часа
curl "http://server/zm/api/events/consoleEvents/1%20hour.json"
Возвращает количество событий на мониторе, зарегистрированных за последний день, когда было по крайней мере 10 кадров, которые были тревогами
curl "http://server/zm/api/events/consoleEvents/1%20day.json/AlarmFrames >=: 10.json"
Возврат отсортированных событий
Возвращает список событий в заданном временном диапазоне и сортирует его по убыванию
curl -XGET "http://server/zm/api/events/index/StartTime%20>=:2015-05-15%2018:43:56/EndTime%20<=:208:43:56.json?sort=StartTime&direction=desc"
API конфигурации
API позволяют вам получить доступ ко всем параметрам конфигурации ZM, которые вы обычно устанавливаете внутри веб-консоли. Это возвращает полный список параметров конфигурации:
curl -XGET http://server/zm/api/configs.json
Каждый параметр конфигурации имеет Идентификатор, Название, Значение и другие поля. Вероятно, вы будете сосредоточены только на этих трех.
Функция редактирования в API конфигураций немного странная в данный момент. Ее формат отличается от обычного процесса редактирования других API. Это будет исправлено, в конечном итоге. Пока что, чтобы изменить «Значение» ZM_X10_HOUSE_CODE с A на B:
curl -XPUT http://server/zm/api/configs/edit/ZM_X10_HOUSE_CODE.json -d "Config[Value]=B"
Для проверки, были ли внесены изменения:
curl -XGET http://server/zm/api/configs/view/ZM_X10_HOUSE_CODE.json
Состояние API Run
API ZM можно использовать для запуска/остановки/перезапуска/перечисления состояний ZM А также примеры:
curl -XGET http://server/zm/api/states.json # returns list of run states
curl -XPOST http://server/zm/api/states/change/restart.json #restarts ZM
curl -XPOST http://server/zm/api/states/change/stop.json #Stops ZM
curl -XPOST http://server/zm/api/states/change/start.json #Starts ZM
Создайте зону
curl -XPOST http://server/zm/api/zones.json -d "Zone[Name]=Jason-Newsted\
&Zone[MonitorId]=3\
&Zone[Type]=Active\
&Zone[Units]=Percent\
&Zone[NumCoords]=4\
&Zone[Coords]=0,0 639,0 639,479 0,479\
&Zone[Area]=307200\
&Zone[AlarmRGB]=16711680\
&Zone[CheckMethod]=Blobs\
&Zone[MinPixelThreshold]=25\
&Zone[MaxPixelThreshold]=\
&Zone[MinAlarmPixels]=9216\
&Zone[MaxAlarmPixels]=\
&Zone[FilterX]=3\
&Zone[FilterY]=3\
&Zone[MinFilterPixels]=9216\
&Zone[MaxFilterPixels]=230400\
&Zone[MinBlobPixels]=6144\
&Zone[MaxBlobPixels]=\
&Zone[MinBlobs]=1\
&Zone[MaxBlobs]=\
&Zone[OverloadFrames]=0"
API для управления метаданными PTZ
Управление PTZ, связанное с монитором, хранится в таблице Controls и не в таблице Monitors внутри ZM. Что это означает, так это то, что при получении подробностей о мониторе вы сможете узнать только то, является ли он управляемым (isControllable:true) и идентификатор управления. Чтобы получить информацию о PTZ, относящуюся к этому идентификатору управления, вам необходимо использовать API управления
Обратите внимание, что эти API получают только данные о контроле PTZ. Они не перемещают камеру на самом деле. См. раздел «PTZ в прямых трансляциях», чтобы переместить камеру.
Это возвращает все определения управления:
curl http://server/zm/api/controls.json
Возвращает определения управления для конкретного идентификатора управления = 5
curl http://server/zm/api/controls/5.json
API хоста
API ZM имеют различные API, которые помогают вам определить состояние хоста (также известного как ZM) дескриптора, нагрузку и т.д. Некоторые примеры:
curl -XGET http://server/zm/api/host/getLoad.json # returns current load of ZM
# Note that ZM 1.32.3 onwards has the same information in Monitors.json which is more reliable and works for multi-server too.
curl -XGET http://server/zm/api/host/daemonCheck.json # 1 = ZM running 0=not running
# The API below uses "du" to calculate disk space. We no longer recommend you use it if you have many events. Use the Storage APIs instead, described later
curl -XGET http://server/zm/api/host/getDiskPercent.json # returns in GB (not percentage), disk usage per monitor (that is,space taken to store various event related information,images etc. per monitor)
API для хранения и серверов
ZoneMinder представил много новых опций, которые позволили вам настроить конфигурации мультисерверов/мультивкладов. Хотя часть этого была доступна в предыдущих версиях, большая часть работы была проделана в рамках ZM 1.31 и 1.32. В рамках этой работы было добавлено много новых и полезных API. Некоторые из них являются частью ZM 1.32, а другие будут включены в ZM 1.32.3 (конечно, если вы строите из мастер-ветки, вы можете получить к ним доступ прямо сейчас, или подождать, пока не выйдет стабильная версия).
Это возвращает данные о хранилище для моей установки сервера. Если вы используете много хранилищ, вы увидите множество таких «Хранилищ», одно для каждого хранилища, определенного:
curl http://server/zm/api/storage.json
Возвращает:
{
"storage": [
{
"Storage": {
"Id": "0",
"Path": "\/var\/cache\/zoneminder\/events",
"Name": "Default",
"Type": "local",
"Url": null,
"DiskSpace": "364705447651",
"Scheme": "Medium",
"ServerId": null,
"DoDelete": true
}
}
]
}
«DiskSpace» - это диск в байтах. Хотя он не возвращает данные о диске так же подробно, как /host/getDiskPercent, он гораздо более эффективен.
Аналогично,
curl http://server/zm/api/servers.json
Возвращает:
{
"servers": [
{
"Server": {
"Id": "1",
"Name": "server1",
"Hostname": "server1.mydomain.com",
"State_Id": null,
"Status": "Running",
"CpuLoad": "0.9",
"TotalMem": "6186237952",
"FreeMem": "156102656",
"TotalSwap": "536866816",
"FreeSwap": "525697024",
"zmstats": false,
"zmaudit": false,
"zmtrigger": false
}
}
]
}
Это работает только в том случае, если у вас есть установленная многосерверная конфигурация. Если нет, то он вернет пустой массив.
Другие API
Это не полный список. ZM поддерживает больше параметров/API. Хороший способ погрузиться - это посмотреть на код API.
Интерфейс потоковой передачи
Разработчики, работающие над своим приложением, часто спрашивают, есть ли «API», которая позволяет получать прямые трансляции или записанные потоки событий. Возможно транслировать как прямые, так и записанные потоки. Это не строго «API» (то есть это не интегрировано в слой API на основе Cake PHP, обсуждаемый здесь), и именно поэтому мы использовали термин «Интерфейс», а не «API».
Живые трансляции
То, что вам нужно знать, это то, что если вы хотите отображать «живые трансляции», ZoneMinder отправляет вам потоковые изображения JPEG (MJPEG), которые легко можно отобразить в браузере с помощью тега img src.
Например:
<img src="https://yourserver/zm/cgi-bin/nph-zms?scale=50&width=640p&height=480px&mode=jpeg&maxfps=5&buffer=1000&&monitor=1&token=eW<deleted>03&connkey=36139" />
# or
<img src="https://yourserver/zm/cgi-bin/nph-zms?scale=50&width=640p&height=480px&mode=jpeg&maxfps=5&buffer=1000&&monitor=1&auth=b5<deleted>03&connkey=36139" />
Будет отображать живую трансляцию с монитора с идентификатором 1, уменьшенную на 50% по качеству и масштабированную до 640x480 пикселей.
Это предполагает, что
/zm/cgi-bin- это путь к вашему каталогу cgi-bin. Измените его на тот, который правильный в вашей системе«Auth» токен, который вы видите выше, необходим, если вы используете аутентификацию ZoneMinder. Чтобы понять, как получить этот токен, пожалуйста, прочтите раздел «Авторизация, выход и безопасность API» ниже.
Параметр «connkey» по сути является случайным числом, которое уникально идентифицирует поток. Если вы не укажете connkey, ZM сгенерирует свой собственный. Рекомендуется генерировать connkey, поскольку затем вы можете использовать его для «управления» потоком (пауза/возобновление и т. д.).
Вместо работы с токеном «auth», вы также можете использовать «&user=имя_пользователя&pass=пароль», где «имя_пользователя» и «пароль» - это имя пользователя и пароль для ZoneMinder соответственно. Обратите внимание, что это не рекомендуется, поскольку вы передаете их по URL, и даже если вы используете HTTPS, они могут появиться в журналах веб-сервера.
ПТЗ на прямых трансляциях
Команды PTZ в ZoneMinder довольно загадочны. Это не исчерпывающий справочник, но просто что-то, чтобы разжечь ваш аппетит:
Предположим, у вас есть монитор с идентификатором 6. Предположим, вы хотите повернуть его влево.
Вам потребуется отправить команду POST на https://yourserver/zm/index.php с данным пакетным содержимым команды (НЕ в URL)
«view=request&request=control&id=6&control=moveConLeft&xge=30&yge=30»
Очевидно, если вы используете аутентификацию, вам необходимо быть авторизованным для этого, чтобы это работало.
Как я уже сказал, на данном этапе это всего лишь предназначено для того, чтобы дать вам старт. Исследуйте код ZoneMinder и используйте «Изучить источник», как вы используете команды PTZ в исходном коде ZoneMinder. control_functions.php - отличное место для начала.
Записанные заранее (событие в прошлом) потоки
Подобно воспроизведению в режиме реального времени, если вы выбрали хранение событий в режиме JPEG, вы можете воспроизвести их следующим образом:
<img src="https://yourserver/zm/cgi-bin/nph-zms?mode=jpeg&frame=1&replay=none&source=event&event=293820&connkey=77493&token=ew<deleted>" />
# or
<img src="https://yourserver/zm/cgi-bin/nph-zms?mode=jpeg&frame=1&replay=none&source=event&event=293820&connkey=77493&auth=b5<deleted>" />
Это предполагает, что
/zm/cgi-bin- это путь к вашему каталогу cgi-bin. Измените его на тот, который правильный в вашей системеЭто будет воспроизведение события 293820, начиная с кадра 1 в виде потока MJPEG
Как и раньше, вы можете добавить больше параметров, таких как
scaleи т.д.Авторизация и ключ соединения имеют такое же значение, как и раньше, и да, вы можете заменить auth на
&user=username&pass=password, как и раньше, и те же вопросы безопасности, упомянутые выше, применимы.
Если же вы выбрали использовать режим хранения видео (MP4) для событий, вы можете напрямую воспроизвести сохраненный видеофайл:
<video src="https://yourserver/zm/index.php?view=view_video&eid=294690&token=eW<deleted>" type="video/mp4"></video>
# or
<video src="https://yourserver/zm/index.php?view=view_video&eid=294690&auth=33<deleted>" type="video/mp4"></video>
Это выше будет воспроизводить видеозапись для события 294690
Какие еще параметры поддерживаются?
Лучший способ ответить на этот вопрос - поиграть с консолью ZoneMinder. Откройте браузер, воспроизведите живой или записанный поток, и выполните «Исследование источника», чтобы увидеть, какие параметры генерируются. Измените и наблюдайте.
Дополнительное чтение
Как было описано ранее, рассматривайте этот документ как «введение» к важным частям API и интерфейсов потоковой передачи данных. Есть несколько деталей, которые еще не были документированы. Пока они не будут документированы, вот некоторые ресурсы:
zmNinja, открытое программное обеспечение для мобильного приложения ZoneMinder на 100% основано на API ZoneMinder. Исследуйте его исходный код , чтобы увидеть, как все работает.
Запустите консоль ZM в браузере и выполните «Исследование источника». Посмотрите, как отображаются изображения. Перейдите на вкладку «Сеть» консоли «Исследование источника» и посмотрите на сетевые запросы, которые делаются при паузе/воспроизведении/прокрутке потоков.
Если вы все еще не можете найти ответ, задайте свой вопрос на форумах forums (не в репозитории GitHub).