rss
Навигация
ИнструментыЯмаПолезные ссылкиЗачем мне блог?Рейтинг контентаКодекс админаФотогалереяi-payrss
Последние записи
Смонтировал видюху, моменты из жизни 2013-15На уазике до ск. Верблюд по Торгашинскому хребтуBreaks волна #9 осенний funkК нам на дачу пришел медведьСтарая бомба! Крутой рифмоплет
Каменты [еще]
2017-05-17 11:25:31 [articles] Владимир:
2016-12-20 17:49:41 [articles] Виталик:
2016-12-01 23:34:25 [news] Meteor:
2016-11-11 03:35:47 [articles] Tata10:
2016-07-27 14:28:19 [articles] Сергей:
2016-05-17 09:56:26 [articles] юра:
2016-04-29 18:03:48 [articles] agatsky.dn:
Теги
Друзья
Блог малова Лучшие стихи зая =) Мед в Красноярске Daniil V. Savenkoff Blog | То, что мне когда-то пригодилось... Велкам в друзья!

Охранная система на FreeBSD + LPT

Июня
2011 года
15
Теги: freebsd, программинг, паяльник, сделай сам, lpt,
Раздел: zgbox.ru -> Статьи -> FreeBSD -> Охранная система на FreeBSD + LPT
Просмотров: 4382
В этой статье описана попытка реализации простой охранной системы на базе FreeBSD с подключением к ней охранных устройтсв на LPT порт с возможностью ведения видеорегистрации при срабатывании/работе охранных устройтсв, отправки смс, ведением лога событий устройств в mysql базу.

image


Задача:


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

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


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

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

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

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

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


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

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

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

Что к чему:


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

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

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

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

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


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

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


Создаем директорию /usr/local/etc/lptmon
качаем архив с программой lptmon и примерами скриптов

Файл lptmon.tar.gz lptmon + исходники (C++ unix) Размещен
размер 0.03 mb 2011-07-18 11:56:23
Скачан 481

и распаковываем:
#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.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 от mc
#cp lptmon.config /usr/local/etc/lptmon.config
#mcedit /usr/local/etc/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 - это имя объекта.
В нашем случае для объемника имя scanner для датчика двери имя 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 разъему. Я разобрал старый шнур от принтера, отпаял все ненужное и припаял нужное. И втыкаем его в комп.
запускаем pr22 и смотрим что он показывает
#/usr/local/etc/lptmon/testlpt/pr22
pin10 on
Видит что 10й пин замкнут объемником, закрываем дверь и пробуем снова:
#/usr/local/etc/lptmon/img/1/testlpt/pr22
pin10 on
pin11 on
Теперь видно что 11 пин (что идет на дверь) замкнулся. Т.е все устройства работают нормально.

Проверяем пишут ли скрипты данные в базу путем их ручного запуска. Если да то можно запускать lptmon и наслаждаться процессом
zgBsd# /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 или произошла какаято ошибка, возможно с портом, но я у себя ниразу такого не наблюдал.

Нарисовал веб морду для всего этого дела:
image

Файл web_lptmon.zip Веб морда для системы безопасности Размещен
размер 0.17 mb 2011-07-18 11:58:53
Скачан 98


(Дополнение от 05-10-2012)

Управление внешними устройствами подключенными к LPT порту


Для управление устройствами подключенными к LPT из тогоже FreeBSD была написана программа pr23! =)
Программа умеет получать текущее состояние пинов LPT порта, отображать в каком состоянии они находятся, что сейчас висит на пине, ноль или единица. Также может включатьи выключать нужные пины, то есть подавать на них 0 или 1 в результате на пинах вывода (любой с 2 по 9 и 1,14,16,17) возникает напряжение 5 вольт которое мы используем для управления внешними устройствами, будь то чайник, лампа, ворота итд.

Файл lptprog.tar Программа+исходники для работы с пинами LPT порта из FreeBSD. Позволяет смотреть состояние пинов и подавать на них сигнал 0 или 1 Размещен
размер 0.03 mb 2011-09-01 19:44:26
Скачан 375

Программа работает из коммандной строки, с указанием параметров, и смело может быть использована в скриптах. В качестве первого параметра - программе сообщается порядковый номер пина LPT порта, если сообщен только первый параметр то программа выведет текущее состояние пина на данный момент.
Второй параметр позволяет управлять пинами вывода (любой с 2 по 9 и 1,14,16,17) по сути другими пинами
управлять и нет возможности т.к. из них остались только пины ввода (10,11,12,13,15), с них только можно получать состояние, а остальные пины - это земля или минус (с 18 по 25)
Пример вызова:
жирным выделена комманда
    ./pr23 1 - выведет on или off в зависимости от состояния пина номер 1
    ./pr23 5 on - пошлет единицу на 5й пин, и на нем появится 5 вольт
    ./pr23 7 off - пошлет ноль на 7й пин, и на нем пропадет 5 вольт если была единица
    ./pr23 12 - выведет on или off в зависимости от состояния пина номер 12
Более подробно про работу LPT и эту программу можно почитать в статье Программирование LPT под FreeBSD

смотрите также:
Мониторим 220 на FreeBSD через LPT
Программирование LPT под FreeBSD
Комментарии к записи:
Vdaf 2011-06-17 09:59:16 [ответить]
Кросавчегг! Можно дешёвую охранку мутить.. :-)
-ZG- 2011-06-17 10:05:46 [ответить]
чуть пожже прикручу графики активности в кабинете, через rrdtools чтоб как на 240.odmin.info =)
sed 2012-07-02 12:48:37 [ответить]
у меня странное поведение проги, периодически на секунду порты чтения то открыты то закрыты, и так постоянно
=ZG= IP:95.170.187.9 2012-07-02 13:08:43 [ответить]
хм, ничего такого не наблюдал за год пользования.
может в биосе какие lpt настройки покрутить?
или просто неконтакт?
sed IP:176.32.128.253 2012-07-02 14:12:31 [ответить]
приеду домой проверю контакт, да и в биосе надо тоже поэкспериментировать
sed 2012-09-04 13:49:50 [ответить]
сколько не мучал биос так и ведет себя странно lpt порт, если пин замкнут о все работает нормально, а если открыт то периодически значение меняется с открытого на закрытое хаотично, хотя геркон в это врем разомкнут
=ZG= IP:95.170.187.9 2012-09-06 12:37:23 [ответить]
странно, может это геркон!?
а что если вместо геркона попробовать просто кнопку, можно понаблюдать как себя ведет порт с подключенным герконом, кнопкой или без всего и сделать вывод - провода это или комп.
Еесли геркон, то может есть смысл поставить резистор в цепь с герконом последовательно. Чтоб лишние наводки гасил и посмотреть что будет.
sed 2012-09-06 13:56:45 [ответить]
путем экспериментов тоже думаю резистор поставить, просто эта же система была подключена к другому серваку и там наводок не наблюдалось, вот тут с номиналом резистора как определиться. Проверял замыкание перемычки в самом lpt наводок нет
=ZG= IP:95.170.187.9 2012-09-07 00:02:39 [ответить]
по резистору 390ом должно быть нормально
sed IP:176.32.128.253 2012-09-10 14:32:13 [ответить]
а ларчик просто открывался, может в будущем кому то поможет: нужно заземлить комп, ибо наводки в lpt просто дикие что и приводит кложным срабатываниям. Сейчас ищу как сделать нормальную "землю", но решение на 99% верное
Romeo 2012-10-03 00:24:50 [ответить]
Странно, у меня работает как надо только десятый пин. На 15 только на открывание срабатывает. На 11 ваще никак не реагирует, на других тоже черт и чо... pr22 на замыкание пинов реагирует как надо. В чем проблема может быть? FreeBSD 9.0 релиз.

p.s. тем не менее - автору спасибо! Одну дверь под охрану поставил, теперь хочется вторую :-)
Romeo 2012-10-03 00:30:07 [ответить]
Тьху ты! pin10enable был только прописан! Заенаблил другие - все заработало! Автору еще раз спаибо! ;-)
=ZG= IP:95.170.187.9 2012-10-03 00:37:26 [ответить]
yeee новый камент со спасибкой,
удачи в реализации своей идеи! =)
Romeo 2012-10-05 01:49:35 [ответить]
Идеи реализованы. Обе двери под охраной. Но, система работает на "вход", а на "выход" будет доработки? Ну, всмысле, открылась дверь №1, на каконить пин ушла команда, замкнулась релуюшка, а там... Сирена, прожектор, огнемет для нарушителя и кофеварка для админа? :-)
=ZG= IP:95.170.187.9 2012-10-05 11:10:13 [ответить]
Так все уже есть для вывода, только было это в другой статье.
В общем я дополнил эту статью разделом "управление устройствами подключенными к LPT порту" =)
Сам кстати хотел купить мигалку и повешать гденибудь =)))

Добавление комментария

Ваше имя: (Антиспам) Какой сейчас год?
Ваш комментариий: