Мы — долго запрягаем, быстро ездим, и сильно тормозим.

FreeBSD
  настройка
  подсчёт трафика
  программы
  почтовые системы
  Шелезяки
  Мелочи
  Файловая система
  WWW
  Security
  system
  Games Servers
  X11
  Programming
  Socket сервер на FreeBSD.
  Создание программ на QT4/С++
  PerlQT4 (Использование С++ классов в Perl скриптах)
  CRUD Perl Web
  MVC Catalyst
  Zyxel Configuration
  Охранная система на FreeBSD+LPT
Очумелые Ручки
OpenBSD
Cisco


www.lissyara.su —> статьи —> FreeBSD —> Programming —> Охранная система на FreeBSD+LPT

Охранная система на FreeBSD + LPT c видеорегистрацией

Автор: -ZG-.


В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт с возможностью ведения видеорегистрации при срабатывании/работе охранных устройтсв, отправки смс, ведением лога событий устройств в mysql базу.

Общая схема подключения системы:



Задача:

Сделать так, чтоб при наличии активности (изменении объема / теплового излучения) в помещении, или еще каком событии на винт сохранялись jpeg кадры с ip Камеры.
Велись логи срабатывания охранных устройств.
Велись логи открытия и закрытия входной двери(ей).
Мониторинг текущих состояний охранных устройств.
Выполнение скриптов при изменениях состояний охранных устройств.

Инструменты:

FreeBSD + MySQL server
LPT порт
программа lptmon
IP-Камера с веб мордой (у меня Axis-205)
Объемник
Паяльник, припой, канифоль =)
Провода
Прямые руки

Об объемнике:



Такая вот штука, питание 9..15в так что от блока питания компа работает на ура.
Имеет два контакта в качестве сигнального выхода, по умолчанию замкнуты. разрываются при появлении активности. Другие объемники работают по этому же принципу, Если снять с него крышку, там будет плата, на ней клеммы для подключения питания и 2-3 перемычки: вкл выкл индикацию диодом на корпусе объемника, режим сильного\слабого мониторинга, и ченибудь еще, в данном случае режим памяти. Но я его не юзал и все перемычки выключил, оставил только на повышенную чувствительность.

После подачи напряжения объемник инициализируется (до 1 минуты) мигая диодом, замеряет так сказать пространство, определяет отправную точку. Потом начинает работать.

Распиновка LPT порта:



Схема подключения устройств к LPT порту



Пример работы:

Cтоит FreeBSD, на нем lptmon мониторит LPT Порт к которому напрямую подключен объемник
и датчик идущий на дверь (простая кнопка, замкнутая или разомкнутая при закрытой двери)

Открывается дверь, в базу mysql пишутся логи что во столькото открыласт дверь и во столькото закрылась.  Некое вошедшее в дверь тело перемещается по кабинету, срабатывает объемник, пишет логи в базу, и пока он работает - каждую секунду выполняется скрипт который качает текущий кадр с камеры к себе на винт.

Еще можно отправить СМС если сегодня 1й раз открылась дверь или на любое другое событие.

Логика работы:

У LPT порта есть 5 ног чтения (они же пины) 10,11,12,13 и 15, заметьте 14й тут нет!.
Они являются входами и используются принтерами как тумблеры, при событиях например:
кончилась бумага,
принтер занят,
ошибка печати, итд итп.

Они то нам и нужны, к ним можно подключить 5 разных устройств.

Под FreeBSD работает программа lptmon которая мониторит эти пины.
Если взять кусок проволоки и замкнуть любой из вышеперечисленных пинов на землю (земля - любой с 18 по 25 пин этого же LPT порта) то программа будет считать что пин включился. Каждый пин может вызывать 3 события при которых можно выполнять комманды или запускать скрипты:
1. Пин включился
2. Пин работает (срабатывает каждую секунду пока пин замкнут)
3. Пин выключился

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

Приступаем к реализации.

Задача состоит в подключении к порту датчика двери и объемника а также реализации видеорегистрирования путем сохранения скришотов с ip камеры.
разделим ее на несколько этапов:
1. настройка софта и проверка lpt порта
2. подключение датчика открытости двери и объемника к lpt порту
3. настройка скриптов чтоб сохранялись кадры с камеры при наличии активности от объемника и велись логи в базу mysql

Настройка софта:

Создаем директорию /usr/local/etc/lptmon
качаем архив lptmon.tar.gz с программой lptmon с примерами скриптов и распаковываем:
#mkdir /usr/local/etc/lptmon
#cd /usr/local/etc/lptmon
#fetch http://zg.odmining.ru/files/notes/lptmon.tar.gz
#tar -xzvf lptmon.tar.gz

Зеркало этого же файла:
файл скачан размер размещён примечание
lptmon.tar.gz
7 25.7kb 2011-06-15 lptmon

В архиве лежит lptmon.c - это исходники программы, писал я ее сам, это моя первая программа на С++ под FreeBSD как и в прочем первая на C =) так что если есть примечения, дополнения - в студию.
Также там лежит сам уже откомпелированный файл lptmon, можно юзать его, установив chmod 777 lptmon если необходимо, а можно откомпелировать исходники коммандой
#CC lptmon.c -o lptmon_compiled

Директория to_rc.d содержит скрипт lptmon который необходимо скопировать директорию в /usr/local/etc/rc.d/ он нужен для автоматического запуска программы lptmon при старте FreeBSD. Также необходимо в файл /etc/rc.conf прописать lptmon_enable="YES" иначе никакого (авто)запуска он выполнять небудет. Собсно делаем:
#cp to_rc.d/lptmon /usr/local/etc/rc.d/lptmon
#echo lptmon_enable="YES" >> /etc/rc.conf

Теперь программа lptmon будет стартовать с системой, также ее можно стартовать вручную как просто запустив ./lptmon так и выполнив rc.d скрипт /usr/local/etc/rc.d/lptmon start или stop
В запуске нет ничего особенного, просто запускается /usr/local/etc/lptmoon/lptmon а при stop убивается коммандой killall lptmon
Но пока не нужно ничего запускать, сначала нужно настроить конфиг, об этом чуть пожже.
Директория testlpt, в ней лежит программа pr22 и ее исходник для тестирования lpt порта. Работает просто: запускается, получает состояния с 10 по 15 пинов и если какойто пин замкнут на землю то выдает pin10 on
у меня в данный момент 10й пин замкнут на что программа отвечает
#./pr22
pin10 on

Ее тоже можно смело использовать в своих скриптах.
Итак собсно пробуем замнкть один или несколько из 10,11,12,13,15 пинов на землю (на любой с 18 по 25 пин) и запустить ./pr22
Если программа показывает что замкнутые пин(ы) в состоянии on значит все ок, если нет - то я хз почему не видит ваш lpt порт, ковыряйте исходники %)

Переходим к настройке самого lptmon
Итак, исходя из того, что у нас будет подключен объемник ну допустим к 10 пину и датчик открытия двери на 11 пин то сконфигурим так, чтоб при событиях объемника при старте, работе, и запуске выполнялись скрипты 10_start, 10_cycle, 10_end.
Для датчика двери только два скрипта при открытии 11_door_open и закрытии 11_door_close

Кладем конфиг lptmon.config из распакованного архива в /usr/local/etc/lptmon.config и редактируем любимым редактором, у меня это mcedit
#cp lptmon.config /usr/local/etc/lptmon.config
#mcedit /usr/local/etc/lptmon.config

файл lptmon.config
#конфиг файл lptmon.config программы lptmon
#должн лежать в /usr/local/etc/
#в параметрах допускаются табы и пробелы
#ковычки не допустимы!

#каждый пин может вызывать 3 события (выполнять комманды) при смене состояния:
#1. при переходе из пассивного состояния в активное
#2. при работе в цикле (срабатыват каждый раз при опросе если пин в 
#активном состоянии)
#3. при переходе из активного состояния в пассивное

#пример настройки 10го пина
#опция pin10enable включает\выключает работу программы с пином

pin10enable = yes

#опция pin10revers определяет какое состояние для пина является
#пассивным, оно же ждущий режим. (нормально разомкнутое или нормально 
#замкнутое)
#если по умолчанию пин не замкнут на землю и будет переводиться в рабочее
#состояние при замыкании его на землю, то эта опция устанавливается в "no"
#или не указывается
#Если пин по умолчанию замкнут на землю и переводится в рабочее состояние
#при размыкании его с землей (например для объемника, т.к он срабатывает 
#разрывая цепь), то опция устанавливается в yes

pin10revers = yes

#комманда выполняемая при переходе пина из пассивного состояния в активное

pin10onstart = /usr/local/etc/lptmon/10_start


#комманда pin10oncycle выполняемая каждый раз при опросе пина
#если он уже находится активном состоянии

pin10oncycle = /usr/local/etc/lptmon/10_cycle


#комманда pin10onend выполняемая при переходе пина из активного 
#состояния в пассивное

pin10onend = /usr/local/etc/lptmon/10_end

#Остальные пины 11,12,13,15 настраиваются по тому же принципу

pin11enable = yes
pin11revers = no
pin11onstart = /usr/local/etc/lptmon/11_door_open
pin11onend = /usr/local/etc/lptmon/11_door_close

MySQL и таблицы:

Подразумевается чтоб мускул уже установлен и настроен. У меня на данный момент стояла версия 5.0. В проекте используется 2 таблицы:
objects - в которой хранится список подключенных устройств, их текущее состояние
objects_hist  - это лог срабатываний устройств.
Имя базы: security.
Дамп всех таблиц также лежит в архиве и называется dump_security.sql
Естественно необходимо завести базу с именем security и экспортировать в нее таблицы из дампа.

Затем в таблицу objects добавить наши устройства указав их obname - имя объекта.
В нашем случае для объемника добавить запись с obname = scanner для датчика двери и obname = door.
Эти имена прописаны в скриптах.

Немного о скриптах:

Листинг скрипта (10_start) для события pin10onstart вызываемого при появлении активности от объемника, т.е. переход из спящего в рабочее состояние.
#!/bin/sh

db_host=localhost
db_pass=pass
db_user=root
db_name=security
obname=scanner

sql="use $db_name; insert into objects_hist (obname,status,dt) 
values ('$obname','up',now());"
#echo $sql
/bin/echo $sql | /usr/local/bin/mysql -h$db_host -u$db_user -p$db_pass

sql="use $db_name; update objects set status='working', dtstart=now() where 
obname='$obname';"
/bin/echo $sql | /usr/local/bin/mysql -h$db_host -u$db_user -p$db_pass


/usr/local/etc/lptmon/cam_screen
/usr/local/etc/lptmon/sms_start_activity

Данный скрипт выполняет два sql запроса к mysql. В таблицу objects_hist пишет логи срабатываний (в данном случае включение устройства), обновляет в таблице objects текущее состояние устройства с именем scanner см строку "obname=scanner". т.е присваивает ячейке ststus состояние working для объекта scanner

Помимо запросов скрипт выполняет еще два скрипта cam_screen который сохраняет скриншот с камеры в нужное место и sms_start_activity который через почтовый шлюз, один раз в сутки отправляет мне смс на телефон о том что мол во столько то началась активность в кабинете. Например начальник внепланово зашел в кабинет в 8:29 и что-то взял, а прийдя на работу я могу посмотреть скришоты с камеры и выяснить что ему было нужно =) Эти два скрипта также выполняются всеми другими скриптами 10_end, 11_start, 11_end чтоб обеспечить наибольшую скриншотосохранность.

Скрипт sms_start_activity отправляет смс путем отправки обычных писем на почтовый шлюз оператора. Правдо использует для этой цели простую программу smtp-cli которую можно установить из портов.

Скрипт cam_screen просто скачивает скриншот с камеры fetch'ем в тихом режиме и ложит в папку.

Подключение датчика и объемника к LPT порту

Тут ничего сложного, руководствуясь этой схемой (она же в начале статьи после распиновки LPT) подключаем датчик двери и объемник к lpt разъему. Я разобрал старый шнур от принтера, отпаял все ненужное и припаял нужное. И втыкаем его в комп.
запускаем pr22 и смотрим что он показывает
#/usr/local/etc/lptmon/testlpt/pr22
pin10 on

Видит что 10й пин замкнут объемником, закрываем дверь и пробуем снова:
#/usr/local/etc/lptmon/img/1/testlpt/pr22
pin10 on
pin11 on

Теперь видно что 11 пин (который идет на дверь) замкнулся. Т.е все устройства работают нормально.

Проверяем пишут ли скрипты данные в базу путем их ручного запуска. Если да то можно запускать lptmon и наслаждаться процессом
#/usr/local/etc/rc.d/lptmon start
Server start ok ! ok. PID=60997
reading settings..
interval=1000
p10os=/usr/local/etc/lptmon/10_start
start working

Звиняйте за кривоватый вывод программы, над ним еще не работал, самое важное тут это строка start working которая появляется когда конфиг успешно прочитан и началась работа. Если этой строки нет - скорее всего нет конфига в /usr/local/etc/lptmon.config или произошла какая-то ошибка, возможно с портом, но я у себя не разу такого не наблюдал.

Даже нарисовал веб морду для этого дела:


файл скачан размер размещён примечание
web_lptmon.zip
7 174.7kb 2011-06-15 Веб морда




Оригинал статьи



Ссылка на обсуждение: http://forum.lissyara.su/viewtopic.php?f=14&t=33137.

размещено: 2011-06-15,
последнее обновление: 2011-06-15,
автор: -ZG-

оценить статью:

Alex Keda, 2011-06-15 в 18:55:29

Морда зачётная на веб-морде =))

Статья хорошая, но - грамматику поправьте, как минимум.

-ZG-, 2011-06-16 в 10:35:08

ок =)

levantuev, 2011-06-19 в 19:23:17

Вот это прикол! ) Молодчина! Спасибо...

-ZG-, 2011-06-20 в 10:26:43

спасибо за спасибо, пожалуйста! =)


Оставьте свой комментарий:
Ваше имя:   *
e-mail:  
жирный
наклонный
подчёркнутый
ссылка
цвет
Нынешний год:   *
 


Хостинг HOST-FOOD

2011-03-13, terminus
ng_nat

Описание работы ng_nat, практическое использование, достоинства и недостатки в сравнении с ipfw nat
2011-02-20, Капитан
Nagios+Digitemp

Статья описывает создание системы оповещения о превышении температуры в специальных помещениях на основе Nagios с использованием программы Digitemp.
подписка

    вверх      
Статистика сайта
Сейчас на сайте находится: 15 чел.
За последние 30 мин было: 51 человек
За сегодня было
9272 показов,
666 уникальных IP
 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.2158 секунд
Из них PHP: 53%; SQL: 47%; Число SQL-запросов: 83 шт.
Исходный размер: 80232; Сжатая: 16555