Запуск OpenIPC на камере Hikvision DS-2CD2345F-IS. Попытка №2

OpenIPC

О том, как работать с этой камерой хоть и с рядом ограничений, но зато без сложных манипуляций, рассказано в статье Работа с камерой Hikvision DS-2CD2345F-IS без Ростелеком.

Первая, не очень удачная попытка, запустить OpenIPC на этой платформе описана в статье: Запуск OpenIPC на камере Hikvision DS-2CD2345F-IS. Попытка №1. Сначала хотел переписать её, но потом решил оставить для истории. Некоторые моменты, описанные в ней, могут пригодиться при работе с другими камерами. Да и комментарии, после изменения текста статьи станут бессмысленными. Так что пусть остаётся. Единственное, что внесу кое-какие правки.

UBIFS

Основная проблема прошлой сборки заключалась в том, что в качестве файловой системы rootfs использовалась JFFS, а она не подходит для используемого типа памяти – NAND. Как следствие, периодически происходит сброс настроек системы на дефолтные значения.

Для NAND больше подходит UBIFS и специально для таких камер появилась и соответствующая сборка OpenIPC.

Кроме сборки с UBI появился ещё и универсальный бут OpenIPC, в котором процесс прошивки упрощён с помощью макросов. По идее, начинать надо именно с него, но после окирпичивания одной камеры у меня фобия и поэтому трогать бут я пока не буду. До тех пока не раскирпичу.

Камрад dubinkin оказался смелей. К тому же, у него есть программатор и необходимый скилл. Выяснилось, что бут u-boot-hi3516av100-universal.bin шить не надо, а надо шить u-boot-hi3516dv100-universal.bin. Но я всё же пока как-нибудь так…
OpenWall
Картинка с моей камеры, транслируемая на OpenWall
Прошивка OpenIPC находится в статусе разработки и это нужно учитывать при работе с ней. Всё течёт, всё меняется и когда-то OpenIPC станет универсальным и стабильным продуктом, но пока это не так. Поэтому после сборки придётся немного доработать напильником.

Возможности

• Разрешение 2МП (1920×1080)
• Разрешение 4МП (2592×1520)
• Веб-интерфейс
• Протоколы: RTSP, ONVIF, JPEG, MJPEG
• Облако IP EYE (бесплатная трансляция, только H264)
• Линейный аудиовход
• Переключение режима день/ночь
• Микрофон
• Вход, выход

Подготовка

Качаем архив с образами ядра и файловой системы для имеющегося процессора. Тут есть один нюанс – вообще, в камере установлен процессор hi3516dv100, но собранный под него образ системы OpenIPC предназначен для работы с памятью NOR, а здесь NAND, поэтому берём образ для процессора hi3516av100, в котором реализована поддержка нужного нам типа памяти. Причём образ берём не стандартный, а тот, что с поддержкой UBIFS.

Поскольку OpenIPC динамично развивается, то в каждой следующей сборке может быть как что-то добавлено и улучшено, так и сломано то, что работало ранее. Так случилось, например, с сетевым интерфейсом. Вдруг стали обращаться люди с жалобами на то, что eth0 отсутствует в системе после прошивки. После разбирательств оказалось, что причина в автодетекте сетёвки, который отключили 1.08.22. Благо в Telegram ведётся архив сборок и удалось проблему локализовать. Поэтому буду давать две ссылки на сборку. Одну – на репозиторий, где будет самая свежая версия, а вторую – на свой Яндекс.Диск, где будет лежать та версия, которую проверил лично.

Для прошивки понадобится подключиться через UART, что соответственно, потребует адаптер USB-TTL, коннектор к нему и программу-терминал. Подробнее об этом в статье Работа с загрузчиком.

Поскольку загрузчик не меняем, придётся изменить переменные окружения.

  • Подключаем коннектор к камере и адаптеру.
  • Подключаем адаптер к компьютеру – появится виртуальный COM-порт. Исхожу из того, что драйверы уже установлены.
  • Запускаем терминал.
  • Подаём питание на камеру и, как только побежит лог загрузки, нажимаем любую клавишу для остановки запуска и попадания в загрузчик.

Прошивка

Переменные окружения

Первым делом нужно задать переменные окружения и обязательно сохранить внесённые изменения в постоянную память.

  • soc – процессор. Сердце всей системы: hi3516av100.
  • sensor – сенсор. Тот элемент, который оцифровывает изображение: ov4689.
  • totalmem – общее количество памяти: 128Мб.
  • osmem – количество памяти, используемое системой: 48Мб.
  • baseaddr – адрес пользовательской области оперативной памяти.
  • bootargs – параметры загрузки и разметка флешки.
  • bootcmd – командная строка загрузки.
  • ethaddr – MAC-адрес сетевого интерфейса.
  • ipaddr – IP-адрес сетевого интерфейса.
  • netmask – маска сети.
  • gateway – шлюз сети.
  • serverip – адрес TFTP-сервера.
setenv soc hi3516av100
setenv sensor ov4689
setenv totalmem 128M
setenv osmem 48M
setenv baseaddr 0x82000000

setenv bootargs 'mem=48M console=ttyAMA0,115200 panic=20 init=/init root=ubi0:rootfs rootfstype=ubifs ubi.mtd=3,2048 mtdparts=hinand:256k(boot),768k(wtf),3072k(kernel),-(ubi) of_mdio.higmacphy=0'
setenv bootcmd 'nand read ${baseaddr} 0x100000 0x300000; bootm ${baseaddr}'

setenv ethaddr 00:12:34:56:78:90    //задать MAC-адрес камеры, если не задан
setenv ipaddr 192.168.1.10          //задать IP-адрес камеры, если не задан
setenv serverip 192.168.1.2         //задать адрес компа с TFTP-сервером

saveenv

Образ ядра и файловой системы

Теперь нужно записать в постоянную память образы ядра и файловой системы. Алгоритм стандартный – очистить область оперативной памяти, загрузить в неё с TFTP-сервера бинарный файл, очистить область постоянной памяти и сохранить в неё из оперативки полученный блок данных. Подробнее об этом – в статье Работа с памятью в загрузчике. Повторяться не буду – приведу только сами команды. Последняя команда – перезапуск.

mw.b ${baseaddr} ff 0x1000000
tftp ${baseaddr} uImage.${soc}
nand erase 0x100000 0x300000
nand write.i ${baseaddr} 0x100000 0x300000

mw.b ${baseaddr} ff 0x1000000
tftp ${baseaddr} rootfs.ubi.${soc}
nand erase 0x400000 0x7c00000
nand write.i ${baseaddr} 0x400000 ${filesize}

reset

…или в две строки (reset не считается):

mw.b ${baseaddr} ff 0x1000000; tftp ${baseaddr} uImage.${soc}; nand erase 0x100000 0x300000; nand write ${baseaddr} 0x100000 0x300000

mw.b ${baseaddr} ff 0x1000000; tftp ${baseaddr} rootfs.ubi.${soc}; nand erase 0x400000 0x7c00000; nand write ${baseaddr} 0x400000 ${filesize}

reset

Первый запуск

Не прерываем загрузку бута и наблюдаем лог запуска системы. Если всё прошло штатно и в использованной сборке ничего не отломано, то через несколько секунд увидим приглашение входа. Логинимся под пользователем root без пароля и вводим команду ifconfig eth0, чтобы увидеть полученный IP-адрес.

Веб-интерфейс

Веб-интерфейс по умолчанию доступен по порту 85. Логин: admin, пароль: 12345. При первом входе будет предложено задать новый сложный пароль, который станет также и паролем root при входе в консоль через UART или SSH

Основная часть системы – стример Majestic. Он выполняет функции захвата и трансляции изображения и делает всё остальное, что с этим связано. Надо настроить.

Пункт меню Majestic -> Image Signal Processor (ISP)

  • В поле Path to sensor configuration file выбрать /etc/sensors/ov4689_i2c_1080p.ini для разрешения 2МП либо /etc/sensors/ov4689_i2c_4M.ini для разрешения 4МП.

Пункт меню Settings -> Reset…

  • Нажать Reboot Camera для перезапуска.

После перезапуска в Preview можно увидеть картинку.

Пункт меню Majestic -> Mainstream Video (Video0)

  • Убедиться, что включен переключатель Enable Video0
  • В поле Video0 codec выбрать вариант h265

Пункт меню Majestic -> Substream Video (Video1)

  • Включить переключатель Enable Video1
  • В поле Video1 codec выбрать вариант h265

В Preview только слайд-шоу, а если хочется видеопотока, то проще всего увидеть его в VLC, выбрав в меню пункт Открыть URL и введя одну из строк:

  • rtsp://admin:password@ip-address:554/stream=0 – первый поток
  • rtsp://admin:password@ip-address:554/stream=1 – второй поток

где: password – ваш пароль, ip-address – адрес камеры.

Если дефолтные значения параметров не устраивают и кажется, что картинка может быть лучше, можно поиграть с настройками сенсора и видеопотоков, но есть шанс сломать Majestic. Для восстановления работоспособности в меню Settings -> Reset… есть пункт Reset Majestic Settings. После его использования надо сделать ещё и Reboot Camera.

Переключение день/ночь

При наступлении тёмного времени суток или выключении источников света, как правило, видеокамеры переходят в ночной режим. Происходит перевод изображения в чёрно-белый режим, отключается ИК-фильтр и включается ИК-подсветка. В обратной ситуации производятся обратные действия.

Система может определять отсутствие света либо по датчику, либо по изображению. Пока Majestic умеет работать только с датчиком. В этой модели камеры его нет. Значит надо задать параметры управляющих выходов, а управлять ими придётся с помощью скрипта. Пункт меню Majestic -> Night Mode:

  • Включить Enable night mode
  • Задать GPIO pin1 of signal for IRcut filter: 105
  • Задать GPIO pin2 of signal for IRcut filter: 104
  • Задать GPIO pin to turn on night mode illumination: 114

Теперь Majestic знает про GPIO и можно попробовать поуправлять переключением вручную с помощью кнопки.

Скрипт управления переключением режима день/ночь

Создаём файл файл скрипта:

cat > /usr/sbin/checkexp.sh

… и вставляем содержимое через буфер обмена:

#!/bin/sh
sleep 10
login=$(cat /etc/httpd.conf | grep cgi-bin | cut -d':' -f2)
pass=$(cat /etc/httpd.conf | grep cgi-bin | cut -d':' -f3)
chtime=300 #change time to check isp_again, default 300 sec
chexp=15 #change isp_again threshold (15-30)
day=1

while true; do

exp=$(curl -s http://localhost/metrics | grep ^isp_again | cut -d' ' -f2)
bri=`expr $exp / 1000`
logger "Analog gain $bri"

    if [ $bri -gt $chexp -a $day -eq 1 ] ;then
	day=0
	curl -u $login:$pass http://localhost/night/on
	logger "Night mode ON"
    fi
	
	if [ $bri -le $chexp -a $day -eq 0 ] ;then
	day=1
	curl -u $login:$pass http://localhost/night/off
	logger "Night mode OFF"
    fi

sleep $chtime
done

Жмём Enter и cохраняем файл нажав комбинацию Ctrl+D и даём разрешение на выполнение:

chmod +x /usr/sbin/checkexp.sh

Если теперь запустить скрипт, то он начнёт анализировать экспозицию и управлять ночным режимом. По умолчанию интервал проверки задан длительностью 300 секунд, то бишь 5 минут.

Для того, чтобы скрипт запускался автоматически при старте системы, создаём файл запуска:

cat > /etc/init.d/S99rc.local

… и вставляем содержимое:

./usr/sbin/checkexp.sh > /dev/null 2>&1 &
exit 0

Сохраняем файл нажав комбинацию Ctrl+D и даём разрешение на выполнение:

chmod +x /etc/init.d/S99rc.local

Теперь можно перезапускать камеру и радоваться что переключение режима работает. Благодарность за скрипт – камраду solalex.

Часовой пояс

Время в системе синхронизируется автоматически, тно для того, чтобы оно соответствовало региону размещения камеры, нужно указать правильный часовой пояс. Пункт меню Information, кнопка Change timezone. Решил написать про этот пункт, потому что там не всё так прозрачно, как кажется на первый взгляд. По умолчанию указана зона относительно GMT, но не надо искать в списке свой вариант, а надо всё стереть и начать набивать название города, которому соответствует нужный часовой пояс. Дело в том, что в этом поле ввода реализована фильтрация по содержимому и если там стоит GMT, то Asia/Ekaterinburg в списке не будет.

On-screen Display (OSD)

Следующее, что будет полезно сделать – настроить OSD. Для тех, кто не знает, OSD – это текстовая информация, выводимая поверх изображения. Обычно – это дата и время, но в OpenIPC возможности OSD несколько шире.

OSD отображается только на основном потоке

Пункт меню Majestic -> On-screen Display (OSD)

  • Включить переключатель Enable On-Screen Display (OSD)
  • В поле OSD Template указать формат строки. Поддерживается формат функции strftime().

Open Wall

Open Wall – это изображения с реальных IP-камер, работающих на прошивке OpenIPC, предоставленные их владельцами. Поскольку занимаюсь данной камерой не только для себя, а и других несчастных, у которых такой неплохой девайс есть, а использовать его не получается, то первой мыслью было – поделиться достигнутым результатом. А где ещё это сделать, как не на таком публичном ресурсе? Благо все средства для этого в прошивку встроены. Правда есть нюанс – если просто включить отправку на стену, то картинка появится, но без OSD. Если нужен OSD на Open Wall, то делаем следующее:

Пункт меню Preview

  • Нажать кнопку Open Wall settings (шестерёнка рядом с кнопкой Send to Open Wall)
  • Включить там переключатель Use HEIF format

Теперь на изображение с камеры будет накладываться нужный текст и эта картинка будет отображаться на Open Wall. По умолчанию интервал отправки – 15 минут.

Запуск OpenIPC на камере Hikvision DS-2CD2345F-IS. Попытка №2
Настройка трансляции на Open Wall

Кроме всего прочего, картинку с Open Wall можно вставить на сайт. Первая картинка в статье как раз оттуда и представляет собой последний отправленный кадр.

Развлекайтесь!

Данная статья является обобщением информации на эту тему из обсуждения в группе OpenIPC users. Присоединяйтесь!

Оцените статью
( 5 оценок, среднее 5 из 5 )
МихаТроник
Добавить комментарий

  1. FlashVagON

    Спасибо!!! прокатило с сохранением
    Работает!!!

    Ответить
    1. mixatronik автор

      Пожалуйста! Экспериментируйте дальше. Там много интересного.

      Ответить
  2. NX

    Добрый день.

    В архиве который выложили на ЯД, не работает сеть, если поднять вручную интерфес, DHCP не работает, только статика.

    У меня пошло что то не так?

    Ответить
    1. mixatronik автор

      Добрый! Скорее всего 🙂 На самом деле, это первая сборка в которой сеть работает и не нужен спец параметр в энвах. У меня интерфейс был поднят изначально и адрес получался по DHCP сразу. Если же в энвах прописать параметр, который определяет физический интерфейс, а именно of_mdio.higmacphy=0, то можно качать сборку и с гитхаба. По крайней мере, до тех пор, пока снова что-нибудь не сломается 🙂
      Нельзя исключать, что камеры этой модели могут чем-то и отличаться, если например, было несколько партий.

      Ответить
      1. NX

        Я поступил несколько иначе,добавил в скрипт проверки экспозиции строчку про поднятия сетевого интерфейса, т.к еще в процессе изучения openipc.

        Можете более подробно рассказать про энвы или дать ссылку на ман?

        Спасибо!

        Ответить
        1. mixatronik автор

          Я и сам то только в начале изучения OpenIPC, а энвы – переменные окружения. В статье они есть. Конкретно эта: mtdparts=hinand:256k(boot),768k(wtf),3072k(kernel),-(ubi) of_mdio.higmacphy=0′
          Вообще предполагалось, что ядро само детектит сетевой интерфейс, но оказалось, что это не так. Возможно не так только на этом проце. И в разных реализациях phy_addr был либо 1, либо 0, но автодетект всегда выдаёт 0. И раз автодетект не работает, решили ввести параметр, который однозначно задаёт физический интерфейс сети.

          Ответить