Dahua IP cam --> narodmon.ru

Aug 02, 2022 15:58


Теперь загружаем на narodmon.ru снимки камеры Dahua (взял на авито б/у). У меня DH-IPC-HFW2320RP-ZS. Раз уж регистратора у меня нет, а снимки всё равно кладутся на ftp XigmaNAS.
Кладутся они каждые 900 секунд - в камере есть такая настройка.

Файлы попадают в директорию, доступную FTP-серверу, которую камера сама создаёт по предоставленному ей адресу, руководствуясь своим серийным номером, например у меня это 2H033*******690. В ней образуются поддиректории, итого путь к файлу становится таким: /2H033*******690/2022-07-08/001/jpg/18/42/59[R][0@0][0].jpg, где:

2022-07-08 - текущая дата
001/jpg - приятное дополнение
18 - час
42 - минута
59 - секунда создания файла
[R][0@0][0] - ещё одно дополнение. ОК, пусть будет.

Эти имена каждый раз немного разные, поскольку камера может быть включена в произвольный момент времени, поэтому наш скрипт должен просто брать самый свежий файл и загружать его командой curl. Но curl на моём старом NAS отсутствует. Поэтому curl и его библиотеку libcurl сначала его нужно туда положить (я предварительно собрал на FreeBSD 10.3), желательно туда же, куда onebuttoninstaller кладёт устанавливаемые им пакеты. Мда, несколько непортабельно получается.

Чтобы добраться до самого свежего файла, нужно найти самую свежую директорию. Листинг директорий получаем как обычно, командой ls. С ключом -r мы получим reverse order, и самая свежая директория окажется первой. Эту первую строку отрежем грепом, grep -m1.

Итого:
# помещаем в d имя самой новой директории - по смыслу это наша дата, 2022-07-08
d=`ls -r $1 |grep -m1 -`
# переменную $1 мы передаём скрипту в качестве параметра - это путь к директории 2H033*******690.

Затем заходим в d и там делаем то же самое:
# помещаем в h имя самой свежей директории - это час создания снимка, 18
h=`ls -r $1/$d/001/jpg |grep -m1 ..`

То же самое делаем с минутой и секундой создания снимка:
m=`ls -r $1/$d/001/jpg/$h |grep -m1 ..`  # минута создания снимка, 42
s=`ls -r $1/$d/001/jpg/$h/$m |grep -m1 ..`  # секунда создания снимка, 59

Поскольку скрипт может запускаться чаще, чем поступают снимки с камеры, нужно ограничить его способность загружать снимки повторно. Для этого нужно хранить имена уже загруженных снимков. Думаю, достаточно хранить имя последнего загруженного. Ну или доставать из файла имён последнее имя командой tail:

left=`tail -n1 $1/path.txt` # в переменную left помещаем последнюю строку файла path.txt

Этот файл имён мы же сами и создадим. Для этого при загрузке, если имени файла нет в списке, добавляем его туда [1] :

# собираем полный путь к файлу из даты, часа, минуты и секунды:
right=$1/$d/001/jpg/$h/$m/$s

if [[ "$left" == "$right" ]]; then
   date > $1/skip.txt # прочитанное из файла имя равно собранному, повторно загружать не будем, но текущее время запишем в файл skip.txt
else
   echo $1/$d/001/jpg/$h/$m/$s >> $1/path.txt # имя новое, добавим его в файл имён, как и обещали в строке [1]
   date >> $1/alter.txt  # запишем в файл alter.txt текущее время
   curl -F 'XXXXXXX=@"$right"' http://narodmon.ru/post >> $1/errors.txt
   # вызываем curl с ключом -F, а XXXXXXX это идентификатор камеры, который нам  дал narodmon при её регистрации
fi

Всё. В файле errors.txt можно будет найти отклик сервера. Обычно там должно быть OK.

Previous post Next post
Up