Є задача скидати копію зображень з відеореєстратора системи безпеки у хмару.
Є роутер TP-Link TL-WR1043N/ND v2 з OpenWrt 18.06.2.
Є власна віддалена хмара на основі nextcloud (owncloud).
У хмарі створюємо користувача для вивантажування зображень, і авторизуємося.
У openwrt будемо отримувати доступ до хмари через webdav.
Є роутер TP-Link TL-WR1043N/ND v2 з OpenWrt 18.06.2.
Є власна віддалена хмара на основі nextcloud (owncloud).
У хмарі створюємо користувача для вивантажування зображень, і авторизуємося.
У openwrt будемо отримувати доступ до хмари через webdav.
Для цього встановимо пакунок davfs2.
opkg install davfs2Налаштування davfs2 знаходяться у файлі:
/etc/davfs2/davfs2.confдодаємо рядок щоб не використовувати блокування, так як з цим є проблеми у nextcloud
use_locks 0Створюємо файл з паролем, і надаємо відповідні права :
touch /etc/davfs2/secrets chmod 600 /etc/davfs2/secrets vi /etc/davfs2/secretsДодаємо до файлу secrets параметри підключення:
https://cloud.url/remote.php/webdav/ cloudusername cloudpassword
Отримання з реєстратора інформації про час та дані про переміщення
Для цього встановимо пакунок curl.opkg install curlТак як оперативної пам'яті в пристрої не багато, прийшлося перейти з python або php до скриптів /bin/sh котрі запускаються з певним інтервалом. Код не оптимальний і заточний під виявлення тільки двох каналів, які відображаються у квадраторі зображення у DVR. Але для отримання статусу про зміни в реальному часі, і запис відео у форматі .dv4 потрібне вже використання sockets, і python скрипти працюють але за умови включення файлу під качки наприклад через swapon. Якщо у Вас є зовнішній накопичувач HDD то це не проблема, але якщо флеш диск (як у мене), то це пряма дорога до "вбивання" накопичувача постійними циклами запису.
/root/getImages-wait.sh:
#!/bin/sh securityhost=DVR.url securityport=80 securityuser=dvradmin securitypwd=dvrapwd url_machine="http://${securityhost}:${securityport}/cgi-bin/nobody/Machine.cgi?action=get_capability" url_smartm="http://${securityhost}:${securityport}/cgi-bin/guest/SmartMonitor.cgi" #-------------------- function islive_pingdvr() { #test security device on live state. ping ${securityhost} -c 1 -W 2 > /dev/null if [ $? -gt 0 ];then echo host ${securityhost} down. needwait=1 sleep 5 else needwait=0 fi } function get_dvrmachine() { dvrmachine=$(curl -s \ --max-time 1\ -X GET ${url_machine} | head -n 2 | tail -n 1) if [ -z "${dvrmachine}" ];then echo " error get machine , may be device frozen ?" sleep 5 needwait=1 else needwait=0 fi } #------------------ needwait=0 while true ; do echo Start ping... islive_pingdvr if [ ${needwait} -eq 0 ];then get_dvrmachine fi if [ ${needwait} -eq 0 ];then break; fi done echo Start monitoring while true; do triggerd=0 triggered_ch=0 triggered_time=0 while read result; do #echo "READ: ${result}" remainder=$result first="${remainder%%=*}"; remainder="${remainder#*=}" second="${remainder%%=*}"; remainder="${remainder#*=}" case ${first} in "SmartMonitor") #echo SM is $second if [ "${second}" == "Start" ];then triggerd=1 fi ;; "Channel") #echo CH is $second if [ ${triggerd} -eq 1 ];then triggered_ch=$second fi ;; "Time") #echo Time is $second if [ ${triggerd} -eq 1 ];then triggered_time=$(date -D'%Y/%m/%d %H:%M:%S' -d "${second}" +%s) fi ;; esac done << EOF $(curl -s \ --list-only \ --keepalive-time 30 \ --max-time 0 \ --ignore-content-length \ --user ${securityuser}:${securitypwd} \ -H "Content-Type: application/x-www-form-urlencoded" \ -H "Connection: keep-alive" \ --user-agent "AVTECH/1.0" \ -X POST ${url_smartm} | egrep "^SmartMonitor=Start|^Channel=|^Time=") EOF # MAIN ENGINE AFTER EVENT #echo +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ loop if [ ${triggerd} -eq 1 ];then #echo Triggered ${triggered_ch} ${triggered_time} /root/getImg.sh ${triggerd} ${triggered_ch} ${triggered_time} & >/dev/null fi done
Даний скрипт завантажує з реєстратора дані про переміщення у форматі:
0 OK SmartMonitor=Alive Channel=0x2 0 OK SmartMonitor=Start Channel=02 Time=2019/09/28 17:25:22
Знаходить зміну у періщенні коли SmartMonitor=Start і запускає скрипт завантаження зображень getImg.sh.
Хороший приклад від іншого автора є код написаний на php: AVTECH Motion Detection link to Domoticz.
Підготування теки для монтування:
mkdir /mnt/dav touch /mnt/dav/.notmounted
Отримання зображень з реєстратора
У кожного він може бути свій URL для завантаження. Так для отримання JPEG зображень з реєстратора я використовую протокол http.http://security.url/cgi-bin/guest/Video.cgi?media=JPEG&resolution=4CIFЦей запит може потребувати авторизації користувача. Його можна передати програмою завантаження, або у URL як http://username:password@security.url/....
Скрипт для завантаження getImg.sh:
#!/bin/sh if [ -z "$1" ];then echo need parameters, exit exit fi securityhost=DVR.url securityport=80 securityuser=dvradmin securitypwd=dvrapwd url_media="http://${securityhost}:${securityport}/cgi-bin/guest/Video.cgi?media=JPEG&resolution=4CIF" url_machine="http://${securityhost}:${securityport}/cgi-bin/nobody/Machine.cgi?action=get_capability" url_smartm="http://${securityhost}:${securityport}/cgi-bin/guest/SmartMonitor.cgi" triggerd=$1 triggered_ch=$2 triggered_time=$3 moving_delay=12 deltatime=0 # LIB ----------------------------------- function get_dvrmachine() { dvrmachine=$(curl -s \ --max-time 1\ -X GET ${url_machine} | head -n 2 | tail -n 1) if [ -z "${dvrmachine}" ];then echo " error get machine , may be device frozen ?" exit fi } #-------------------- function islive_pingdvr() { #test security device on live state ping ${securityhost} -c 1 -W 2 > /dev/null ; if [ $? -gt 0 ];then echo host ${securityhost} down exit fi } #-------------------- function check_mounted() { if [ -f /mnt/dav/.notmounted ] ;then echo "/mnt/dav umounted, exit" exit fi } #-------------------- function check_remotefilesystem() { #check mouning remote file system if [ -f /mnt/dav/.notmounted ] ;then echo not mounted, try mount /usr/sbin/mount.davfs -o noexec https://cloud.ctph.com.ua/remote.php/webdav /mnt/dav fi check_mounted } #-------------------- function check_remotefilesystem_video() { if [ ! -d /mnt/dav/video ] ;then echo "/mnt/dav/video umounted, exit" /usr/sbin/umount.davfs /mnt/dav/ kill $(cat /var/run/mount.davfs/mnt-dav.pid) rm /var/run/mount.davfs/mnt-dav.pid rm -r /tmp/davfs2/* exit fi } #-------------------- function make_folders() { mdate=$(date '+%Y-%m-%d') mhdate=$(date '+%Y-%m-%d-%H') odir=/mnt/dav/video/${mdate}/${mhdate} if [ ! -d ${odir} ] ;then mkdir -p ${odir} fi } #-------------------- function loging() { echo ${cdate}: ${get_motion_output} >> /root/getvideo.log } #-------------------- function get_image() { cdate=$(date '+%Y-%m-%d-%H%M%S') # loging suff="-${triggered_time}-${triggered_ch}" fname="${cdate}${suff}.jpg" # echo $fname wget -q -T 6 \ -O ${fname} \ -P ${odir} \ --user=${securityuser} \ --password=${securitypwd} \ ${url_media} } # MAIN ---------------------------------- #islive_pingdvr #get_dvrmachine check_remotefilesystem make_folders check_remotefilesystem_video if [ ${triggerd} -eq 1 ];then #echo Triggered ${triggered_ch} ${triggered_time} ltime=$(date '+%s') until [ ! $(($(date '+%s')-${ltime})) -le ${moving_delay} ] ; do #echo try load image `date` check_mounted get_image #sleep 5 done fiЦей скрипт перевіряє чи змонтована тека, для вивантаження /mnt/dav
Створює підтеку з поточним днем та для оптимізації використання dav підтеку з поточної годиною. Завантажує зображення jpg до неї у форматі поточної дати і часу.
повторює завантаження декілька разів.
Зберігаємо скрипт до домашньої теки /root і даємо права на виконання
chmod +x /root/getImg.sh
Для очищення старих версій файлів (30 діб) створюємо скрипт purgeold.sh:
#!/bin/sh if [ -f /mnt/dav/.notmounted ] ;then mount.davfs https://cloud.ctph.com.ua/remote.php/webdav /mnt/dav fi if [ -f /mnt/dav/.notmounted ] ;then exit fi /usr/bin/find /mnt/dav/video -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;Зберігаємо скрипт до домашньої теки /root і даємо права на виконання
chmod +x /root/purgeold.sh
Запускаємо скрипти за розкадом
crontab -e
0 0 * * * /root/purgeold.sh
Вивантаженні файли у хмарі |
За матеріалами:
Scripts on github.com
Немає коментарів:
Дописати коментар