geektimes

Видеонаблюдение удалённого объекта на Debian+AVReg+gsm

  • пятница, 7 ноября 2014 г. в 02:10:30
http://geektimes.ru/post/241050/

Может, кому-то пригодится мое решение для оффлайн-наблюдения за объектом.

Появился у меня участок земли под строительство дома и пришла в голову мысль организовать удаленное наблюдение за ним на предмет выявления посторонних (или кто там без меня шарится). С самим наблюдением и записью проблем не наблюдалось, проблема стояла как передать данные домой, не имея выделенного канала (да и вообще никакого канала).

Задача:
1. Зафиксировать движение в кадре и записать;
2. Разложить по папкам;
3. Передать домой для просмотра.

В наличии имелась пара камер с видео-выходом, старенький компьютер, плата видеозахвата, gsm-модем 1550 usb, желание.

С софтом определился достаточно быстро. Это система Debian и AVReg для фиксации. Почему именно такая связка? Все просто, Windows не подходит для бюджетного видеонаблюдения даже не в плане настройки, а в плане к требованию железа, ему требуется на порядок выше мощности. Debian мне понравился лаконичностью, возможностью установить систему без рабочего стола из коробки, к тому же Debian, как мне кажется, более серверная система после freebsd. AVReg я выбрал потому, что у него нормально описана установка и настройка, а так-же есть 4 бесплатные лицензии (как раз для дома-огорода), с другими пришлось бы разбираться вообще конкретно, а я не такой уж и специалист в linux.

Немного про настройку AVReg. По умолчанию он настроен на создание фотографий. Детектор движения заставил принудительно делать фото каждые 30 минут, т.к. иногда движения может не быть половину дня.

С софтом разобрались, почти.

Железо такое: Celeron 2.26GHz с материнкой, 1Gb ОЗУ, 40Gb винчестер, плата видеозахвата на чипе Bt878:

image

USB-модем Huawei E1550:



Камеры накопались вот такие простенькие.



Как видите, на Windows с такой конфигурацией никакое приличное видеонаблюдение не полетит.

С установкой Debian и AVReg проблем не возникло, все описание есть в интернете на домашних сайтах.

Теперь стояла задача передать накопленную информацию домой. Онлайн-канал 24х7 через GSM нереально (не у нас в городе), от этого выходит, что сервер сам должен позвонить и слить данные. Отсюда вылился вот такой скрипт, он прописан в /etc/crontab на исполнение каждый час.
скрипт

#! /bin/sh
echo=on
PATH=/bin:/usr/bin:/sbin:/usr/sbin

sudo /etc/init.d/wvdial start
sleep 15s

kat=`date '+%m.%d.%y.%H.%M'`
cd /home
mkdir $kat

cd /var/spool/avreg/
cp --parents $(find -name *.jpg -mtime -1) /home/$kat/

cd /home/$kat/
sensors > sensors.txt
smartctl --all /dev/sda > smart.txt
apcaccess status > ups.txt

cd /home/
tar -cvzf $kat.tar.gz /home/$kat
rm -R /home/$kat

ls -l /home

ftp -n -d «адрес сервера» <<INPUT_END
quote USER «имя пользователя»
quote PASS «пароль»
passive
cd pub
prompt
binary
mput *.tar.gz
INPUT_END
echo "*** ПРОГРАММА ЗАВЕРШЕНА"

rm -f /home/*.tar.gz
sleep 5s

/etc/init.d/wvdial stop


Настройка wvdial

Проблема работы usb gprs модемов на linux, zte mf-180 и Huawei 1550.
Проблема в linux, неправильно срабатывает переключение в режим модема, точнее вообще по умолчанию не работает.
Решение: в любом windows втыкаем модем в порт, копируем куда-нибудь софт, устанавливаем софт, после этого модем переключится из режима карт-ридера в режим модема.
Открываем гипертерминал и выбираем COM порт, на который повещался модем.
Даем команды
AT+ZCDRUN=Ern
Или
AT+ZCDRUN=8
В ответ он пишет ……… result (0:fail 1:success):1 т.е. у нас 1, команда принята
Я дал обе команды (на всякий случай) модем перестал при включении определяться как карт-ридер и стал сразу определятся как модем на COM портах.

Копируем wvdial.conf в /etc/ и wvdial в /etc/init.d/
запуск /etc/init.d/wvdial start
раскоментируем параметр noauth в настройках ppp /etc/ppp/options

настройки wvdial.conf для «мегафон»
[Dialer Defaults]
Init1 = ATZ
Stupid Mode = on
Init3 = AT+CGDCONT=1,«IP»,«internet»
Password = gdata

Phone = *99***1#

New PPPD = yes
Abort on Busy = off
Modem Type = Analog Modem
Baud = 115200

Modem = /dev/ttyUSB0
ISDN = 0
Username = gdata
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0
Auto Reconnect = on


Настройки wvdial были взяты на просторах интернета (вроде использовался для спутникового интернета).

настройки wvdial
#!/bin/bash
echo=on
case "$1" in
start)
killall wvdial
killall pppd

/usr/bin/wvdial

;;
stop)

killall wvdial # Не самое удачное решение, есть где додумать
killall pppd
;;
esac

exit 0




Что делает основной скрипт:
— запускает wvdial ждёт 15 сек. Для нормального установления связи;
— формирует переменную даты-времени и создает каталог с их именем в /home;
— копирует с выборкой по маске *.jpg;
— также создаётся-копируется сенсоры с мат.платы, smart диска и состояние UPS;
— весь этот бардак пакуется в архив и удаляется каталог;
— потом архив передаётся по FTP на удалённый ресурс;
— удаляется архив и закрывается сессия связи.

Почему я сделал именно так. В самом начале я понимал, что для меня аналога FTP нет, а передать кучу файлов надо. Пробовал curlftpfs (это библиотека подключает ресурс FTP как каталог в системе), но вышла большая проблема, копировалось пару файлов и всё это добро повисало. После танцев решил запаковать в архив и передавать, сначала передавал раз в 5 часов, но когда добавилась 3 камера, размер архива превысил лимит сессии ftp пришлось передавать чаще.

С FTP тоже случилось заморочка, с налёту не смог найти бесплатный FTP сервер (http://net2ftp.ru/ мне понравился, но не сложилось у меня с ним), пришлось поднимать свой FTP сервер дома.

На домашнем сервере тут же образовалась куча мала архивов, которые надо было разбирать, написал скрипт, который в этот же каталог всё аккуратно распаковывает.

скрипт распаковки
#! /bin/sh
echo=on
PATH=/bin:/usr/bin:/sbin:/usr/sbin

ls *.tar.gz | while read i; do tar xzvf $i home/${i%%.tar.gz}/smart.txt home/${i%%.tar.gz}/sensors.txt home/${i%%.tar.gz}/up$
#ls *.tar.gz | while read i; do tar xzvf $i home/${i%%.tar.gz}/sensors.txt; done
#ls *.tar.gz | while read i; do tar xzvf $i home/${i%%.tar.gz}/ups.txt; done
#ls *.tar.gz | while read i; do tar xzvf $i home/${i%%.tar.gz}/syslog; done

#ls *.tar.gz | while read i; do tar xzvf $i --strip-components=2 home/${i%%.tar.gz}/2014-04; done
#ls *.tar.gz | while read i; do tar xzvf $i --strip-components=2 home/${i%%.tar.gz}/2014-05; done
#ls *.tar.gz | while read i; do tar xzvf $i --strip-components=2 home/${i%%.tar.gz}/2014-06; done
#ls *.tar.gz | while read i; do tar xzvf $i --strip-components=2 home/${i%%.tar.gz}/2014-07; done
#ls *.tar.gz | while read i; do tar xzvf $i --strip-components=2 home/${i%%.tar.gz}/2014-08; done
#ls *.tar.gz | while read i; do tar xzvf $i --strip-components=2 home/${i%%.tar.gz}/2014-09; done
ls *.tar.gz | while read i; do tar xzvf $i --strip-components=2 home/${i%%.tar.gz}/2014-10; done


Итоги: схема работает уже года 2, принципиальных сбоев нет (кроме проблем с железом, энергией). Я доволен и получаю вот такие кадры.

В планах добавить Arduino как метеостанцию и, конечно же, построить умный дом (с датчиками, автоматикой, автономный, для души и комфортной жизни).