MYCSS

2019-09-20

Зберігання зображення з dvr до хмари з nextcloud через 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
Вивантаженні файли у хмарі
В результаті у хмару вивантажуються зображення з реєстратора з інтервалом кожні 10 сек, зберігаються у теках по дням, термін зберігання 30 діб.

За матеріалами:

Scripts on github.com

Немає коментарів:

Коли забув ти рідну мову, біднієш духом ти щодня...
When you forgot your native language you would become a poor at spirit every day ...

Д.Білоус / D.Bilous
Рабів до раю не пускають. Будь вільним!

ipv6 ready