Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> Шелезяки —> Охранная система на 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://zgbox.ru/files/notes/lptmon.tar.gz
#tar -xzvf lptmon.tar.gz

Зеркало этого же файла:
файл скачан размер размещён примечание
lptmon.tar.gz
646 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
583 174.7kb 2011-06-15 Веб морда


см. также:
Мониторим 220 на FreeBSD через LPT
Программирование LPT под FreeBSD




Первоисточник



размещено: 2011-06-15,
последнее обновление: 2011-09-07,
автор: -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

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

AlexCo, 2011-06-26 в 18:41:37

Реализовывал подобное под Linux, подключал импульсные датчики(герконы) счетчиков воды, микроволновые датчики, пожарные датчики, но все это было ради экспериментов и не претендовало на полноценную систему, из-за нестабильности системы(зависание софта или отключение питания). Для подобных целей существует множество контроллеров и микроконтроллеров которые имеют системы защиты и сохраняют информацию даже при потере связи с компьютером. Статья конечно интересная и должна вдохновить многих на подобные эксперименты.

fox, 2011-06-26 в 20:23:15

маНяк, что я могу сказать...
Злой BSD-шный демон громко шагает наступая на пятки пингвинам с фортачками.
В общем хорошо, спасибо автору!

Andy, 2011-06-28 в 16:37:01

> Alex Keda, 2011-06-15 в 18:55:29
> Статья хорошая, но - грамматику поправьте, как минимум.
Статья то отличная, спору нет. Но как всегда - компиляем из исходников! Автор, Вам порт лень было делать?

-ZG-, 2011-06-28 в 18:01:10

а я порты не умею делать =), еще предстоит изучить...
В архиве готовые программы тоже есть, исходники до кучи положил, вдруг кто-что изменить надумает.

-ZG-, 2011-06-28 в 19:13:03

Кстати если кто хочет помоч в создании порта - давайте сделаем =)

sAs, 2011-06-29 в 11:23:36

Интересная статья, отличная идея!
1. На какое расстояние можно удалить датчики от системного блока?
2. Может еще не проникся до конца, но... Вот входят-выходят сотрудники, обычная рабочая суета. Датчики отрабатывают эти события, большая часть из которых шлак. Для контроля достаточно настроить регистрацию на камеру. Может предусмотреть режим постановки-снятия с охраны? Тогда открытия-закрытия отслеживаются в нужные моменты и в случае чего - alarm.
3. Для сообщения  о  событии на mail, с последующим уведомлением о приходе новой почты sms-кой, можно использовать ssmtp.

-ZG-, 2011-06-30 в 12:12:55

2sAs
1. да наверно на много.. мне кажется 100м без проблем. Тогда не помешает защита через оптрон.
2. можно и предусмотреть, опятьже подключив например тумблер к тому же порту на еще один пин =)

Andy, 2011-07-01 в 13:34:44

-ZG- поищите на форуме, я какому-то пользователю помогал порт делать (кстати, тоже для статьи), но уже не помню кому. Можете обращатся, попытаюсь помочь в создании порта, хотя с FreeBSD уже год или полтора не работал.

Дмитрий, 2011-07-06 в 14:22:52

Хорошая статья, можно даже дома реализовать, к примеру дверь + камера. Получится не плохо. За идею спасибо.

Andrey, 2011-07-08 в 5:14:45

не плохо, хочу добавить вот что, на rs232 так же можно использовать, у него есть два информационных сигнала для 9 пинового это пары 4-6 и 7-8. Отличия же LPT от RS232 тем что его можно по длинее заюзать.

Ытя, 2011-07-08 в 7:25:15

На МК + rs232 было бы интереснее. В этой реализации есть существенный риск, т.к. ЛПТ довольно нежные порты и КЗ созданное "датчиком открытой двери" может вырубить порт навечно. В добавок у ЛПТ ограниченная длина кабеля (существенно меньше, чем у rs-232). Делайте выводы.

ASM, 2011-07-19 в 23:46:03

QR-код улыбнул)

Mold0vanin, 2011-07-21 в 13:42:17

В каком режиме работает принтерный порт?

taras, 2011-08-12 в 18:52:30

Вот дак молодец автор!!!
Статью прочитал, дома попробовал - аж дыханье от восторга свело!!!

Теперь знаю когда дверь в квартиру открывается с течении дня. Правда учитывая, что кроме меня в квартире живёт только кот и собака, буду контролировать то, смогут ли эти двое открыть входную дверь ))

-ZG-, 2011-08-13 в 7:05:06

taras спасибо =)

taras, 2011-08-19 в 3:49:22

-ZG-, у тебя осталась документация по программированию lpt на с++ под юникс? если есть что - скинь на почту мне пожалуйста - хочется с оставшимися пинами LPT разобраться. frost-44@yandex.ru.

-ZG-, 2011-08-19 в 7:00:07

юзал поиск, найденное не сохранял, могу посоветовать только загуглить "Программирование LPT" и смотреть исходники lptmon.c как образец. Единственное что, для ног 10-13,15 используется адрес #378, для 2-9, - адрес #379

miguel, 2011-08-26 в 10:06:10

to taras
Ты лучше на котэ и собакэ навесь видеорегистраторы)))
Потом в ютуб выложить под видом артхаусного кино.

miguel, 2011-08-26 в 10:10:37

а по сабжу, да, очень неплохо, правда, имхо, надо оптронами таки развязывать, да и замыкать не на живую, а через резистор. Тут ведь можно намутить и управление демонами, скажем pppoe поднимать-разрывать.

taras, 2011-08-26 в 16:43:50

to miguel
Если навесить видеорегистраторы на них, то поучится первая часть фильма "Хищник" ))
Я, правда, только после этой статьи начал электротехнику изучать - так захватывает!!!
Кстати, по-поводу статьи: паяльник, припой, канифоль - не так уж и нужны, ведь Изолента - это королева электротехники!

PS: lissyara  - ты мой кумир!

Alex Keda, 2011-08-26 в 18:04:58

а я тут причём?
статью не я писал =)

-ZG-, 2011-09-01 в 15:59:12

накидал небольшой мануал о программировании LPT под FreeBSD  вдруг кому поможет

priest.romeo, 2011-10-23 в 22:09:48

Красавец! Спасибо.

Andy2k, 2011-12-31 в 14:42:26

На какие только извращения способны люди, не знающие о существовании проекта http://avreg.net/ :)

miguel, 2012-04-24 в 15:47:26

to Andy2k

На какие только извращения не идут луноходы, не зная, что есть FreeBSD !



 

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

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.158 секунд
Из них PHP: 51%; SQL: 49%; Число SQL-запросов: 84 шт.
Исходный размер: 57474; Сжатая: 13782