Как я выводил информер в камеру Hikvision
Длиннопост-кулстори о марафоне разработчика длиной почти в сутки.
ВОРНИНГ! Пост не претендует на звание точной инструкции, хотя и содержит некоторые полезные указания ближе к концу. Ну и как всегда - автор не несет ответственности за Ваши действия и возможный ущерб.
Поступило техническое задание: придумать, как бы вывести текст на изображение с камеры. В идеале - вывести информер для отображения температуры, получаемой с погодной станции Народного мониторинга Dozor Meteo. При необходимости изменять прошивку станции можно, но лучше нельзя. Для экспериментов была выдана камера Hikvision DS-2CD2012, но, думаю, у всех творений этой фирмы одинаковый API, поэтому описанный способ применим ко всем камерам этого бренда.
Да, кстати говоря, у большинства камер видеонаблюдения (у Hikvision тоже, разумеется) по умолчанию доступен функционал OSD - наложения текстовых плашек на изображение. Например, на снимке ниже видно, что накладывается дата и текст. И на этой же камере необходимо вывести значение термометра.
Именно таким путём пошел участник одного форума. В теме опубликован скрипт, интегрируемый в систему управления умным домом MajorDoMo, который через штатный API изменял значения полей OSD камеры. На этом же форуме я нашел официальную документацию Hikvision, но о ней позже.
Буквально сразу после постановки задачи в голову пришла простая мысль - написать php-скрипт, который будет формировать пакет, включая в него значение температуры, допустим, из GET-запроса, и отправлять его в камеру, к которой уже проброшены нужные порты. Скрипт этот можно разместить на хостинге, где у меня крутится сайт dubos.tech. В тот момент у меня был только доступ к FTP сервера, поэтому я не видел иных вариантов и сразу взялся это реализовывать. Сразу скажу, что путь этот - тупиковый.
В официальной доке написано, что в камеру нужно передать HTTP PUT запрос, в теле которого должен быть XML-файл с информацией. В итоге я весь вечер изучал вопрос отправки PUT запросов через PHP curl. Все варианты заканчивались ответом камеры "3 - Device Error". Да, именно к PHP у меня претензий нет, ибо составленный вручную PUT запрос тоже не прошел.
Практически отчаявшись я, руководствуясь наработками разработчика joonhshin, написал скрипт, который по расписанию (статья про cron для начинающих, которая мне очень помогла) запускался на Raspberry Pi. Этот скрипт я планировал перенести на один из роутеров, которые, как принято, работают круглосуточно и могут без особого труда взять на себя эту обязанность.
Честно говоря, идея с роутерами тоже не оправдала себя. В наличии были два Mikrotik'а, ZyXEL Keenetic и пара дешёвых TP-Link с прошивкой OpenWRT. Язык скриптования RouterOS от Mikrotik был мне чужд, поэтому этот вариант отпал почти сразу. Роутеры на OpenWRT тоже "пролетели", поскольку на них банально не хватило места для установки линуксовой утилиты curl. А мой любимый Keenetic тоже остался не у дел, поскольку в штатной прошивке нет полноценного доступа к SSH-консоли.
К счастью, примерно в это время я получил доступ к SSH-консоли сервера хостинга. Линуксоиды знают, что если у человека есть доступ к консоли linux, у человека есть доступ ко всему. Теперь можно модифицировать скрипт, чтобы он забирал данные с сервера Народного мониторинга и выводил их на камеру.
Обратите внимание, что значения posX и posY обязательно должны быть кратны 16 (например, 0, 16, 32, 48 и т.д.)
Для работы скрипта нужно зарегистрировать на сайте Народного мониторинга приложение (Профиль - Мои Приложения - Новый ключ) и ввести ключ в строку key=... (без скобок и кавычек). В uuid=... ввести любой md5-хэш - это необходимо для работы API.
Далее нужно получить ID датчика. Первым делом нужно открыть окошко устройства на сайте Народного мониторинга. В строке с интересующим нас датчиком есть строка "S*****". Число после буквы S - и есть искомый ID. (Занимательно, что такой просто способ я обнаружил только при написании статьи, раньше же пользовался более сложным вариантом).
В последней строке скрипта, понятно, указываются данные для доступа к камере.
Чтобы скрипт запускался автоматически через равные промежутки времени, нужно сконфигурировать планировщик cron, но об этом написано множество статей, учитывающих специфику для разных систем. Обратите внимание, что API Народного мониторинга не позволяет осуществлять запросы чаще, чем 1 раз в минуту. Советую ставить интервал от 5 минут, поскольку большинство датчиков (в том числе и Dozor Meteo) отправляют показания с такой периодичностью или реже.
Таким образом, задание практически выполнено. Сегодня на объекте, где нужно измерять температуру, установили новую погодную станцию, поэтому примерно через сутки (когда сервис мониторинга одобрит новое устройство) я установлю информер на рабочую камеру. Посмотреть результат работы можно будет на сайте koktebel.top.
Arduino & Pi
1.4K поста20.6K подписчиков
Правила сообщества
В нашем сообществе запрещается:
• Добавлять посты не относящиеся к тематике сообщества, либо не несущие какой-либо полезной нагрузки (флуд)
• Задавать очевидные вопросы в виде постов, не воспользовавшись перед этим поиском
• Выкладывать код прямо в посте - используйте для этого сервисы ideone.com, gist.github.com или схожие ресурсы (pastebin запрещен)
• Рассуждать на темы политики
• Нарушать установленные правила Пикабу