Установка Planet ICA 110 в Linux.

Завязка с ZoneMinder. HOWTO.

Oleg K. Artemjev 6 октября 2006 г.

Содержание

1 Обзор статьи.  4
2 Copyright, Лицензия, Спасибо, От автора.  6
3 Обзор камеры.  8
3.1 Выдержки из обзора БелСофт МСК  . . . . . . . . . . . . . . . . . . 8
3.2 Мой обзор . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4 Физическое подключение.  11
4.1 Важно . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.2 Условия, в которых тестировалась камера . . . . . . . . . . . . . . . 11
5 Логическое подключение  12
5.0.1 Установки по умолчанию . . . . . . . . . . . . . . . . . . . . . 12
5.0.2 Получение доступа к камере . . . . . . . . . . . . . . . . . . . 12
5.0.3 Конфигурирование Linux . . . . . . . . . . . . . . . . . . . . . 14
5.0.4 Конфигурирование камеры  . . . . . . . . . . . . . . . . . . . 15
6 Автоматизация  31
6.1 Простейшие возможности . . . . . . . . . . . . . . . . . . . . . . . . 31
6.1.1 ftp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.1.2 smtp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6.2 Автоматизация на RS-485 . . . . . . . . . . . . . . . . . . . . . . . . 31
6.2.1 Подключение кабеля . . . . . . . . . . . . . . . . . . . . . . . 31
6.2.2 Включение внешнего устройства . . . . . . . . . . . . . . . . 32
6.3 Автоматизация своими руками . . . . . . . . . . . . . . . . . . . . . 32
6.3.1 Snapshorts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6.3.2 Flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6.4 Video4Linux device emulation . . . . . . . . . . . . . . . . . . . . . . . 33
7 Установка ZoneMinder  34
7.1 Инсталяция MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
7.2 Настройка ZoneMinder . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7.2.1 Options . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
7.2.2 Добавляем камеру . . . . . . . . . . . . . . . . . . . . . . . . . 62
7.2.3 Troubleshooting . . . . . . . . . . . . . . . . . . . . . . . . . . 63
7.3 It works. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
7.3.1 Нагрузка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
7.4 Комментарии к ZoneMinder . . . . . . . . . . . . . . . . . . . . . . . 66

8 Резюме  67
8.0.1 Качество изображения . . . . . . . . . . . . . . . . . . . . . . 67
8.1 Плюсы и минусы  . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.1.1 Минусы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
8.1.2 Плюсы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
9 Замечание производителям.  69
10 GNU Free Documentation License  70
1. APPLICABILITY AND DEFINITIONS  70
2. VERBATIM COPYING  72
3. COPYING IN QUANTITY  72
4. MODIFICATIONS  73
5. COMBINING DOCUMENTS  74
6. COLLECTIONS OF DOCUMENTS  75
7. AGGREGATION WITH INDEPENDENT WORKS  75
8. TRANSLATION  75
9. TERMINATION  76
10. FUTURE REVISIONS OF THIS LICENSE  76
ADDENDUM: How to use this License for your documents  76

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

… Everything is hard, until it becomes simple. … Кто то из классиков.

…

Если у Вас паранойя - это еще не значит,

что за Вами никто не следит.

… Смешилка.

1 Обзор статьи.

Использование

Подразумевается использование в качестве ознакомительного материала при подключении под Linux ethernet камеры ^{1} planet ica 110 и аналогичных^{2} поделий компании Planet.

Компания и модели.

Не заставляя читателя лишний раз выспрашивать google приведем полные названия^{3}:

Полное название камеры (у производителя): PLANET Internet Camera ICA-110

Полное название производителя: PLANET Technology Corp.

Цель

Данная статья ставит своей целью описание подключения к Linux ethernet камеры компании Planet и автоматизации работы с ней. Конкретно - planet ica 110.

1также упоминаемой как internet-camera, network camera

2Модели, которые аналогичны данной - 110W, 100C, 100PE. Вообще говоря, если камера поддерживает motion jpeg, имеет ethernet разъем и встроенный web сервер - она уже в достаточной мере аналогична рассматриваемой здесь ethernet камере в том смысле, что пролистав эту статью, Вы наверное найдете для себя некоторую полезную информацию.

3Как обычно все торговые марки и прочие знаки отличия принадлежат их уважаемым владельцам. Текущего владельца того или иного объекта лучше всего выспросить сначала у google.

=)

Замечания по совместимости ZoneMinder:

Часть данной статьи по установке и настройке ZoneMinder, а также подгонки под него Linux системы актуальна в первую очередь для SuSE Linux 10.0, однако с мнинимальными изменениями она подойдет и для любой другой SuSE. Более того - некоторые советы, возможно, будут адекватны и для других дистрибутивов(RedHat, Debian, Slackware), ведь по большому счету все это линух, а особенности конфигурирования данного дистрибутива (философия, структура каталогов, управляющие пакеты) - всего лишь нюансы. ;)

Ethernet Camera: Если Вы ранее никогда не имели дела с ними под Linux Вы сможете получить массу полезной информации даже если у Вас другая модель, но есть поддержка Motion JPEG, ethernet port и встроенный в камеру web сервер.

Что такое ethernet camera

Ethernet Camera - устройство для получения видео изображения с последующим доступом к нему по сети Ethernet. Обычно имеет встроенный web server (а значит и свою ОС, зачастую тот же Linux(версию для embeded устройств)). В отличие от �обычной аналоговой камеры� имеет встроенный процессор для оцифровки видеоизображения, позволяет просмотр по сети ethernet^{4}.

4Протоколы просмотра - http, ftp - это Application layer (Layer 7 OSI). Ethernet это IEEE 802.3/802.3u и др. - это стандарты захватывающие уровни OSI от 1 до 2 (Physical и Data Link [sublevels: MAC,LLC])

2 Copyright, Лицензия, Спасибо, От автора.

Copyright Copyright (c) 2006 Олег К. Артемьев, <olli@digger.org.ru> .

Эта статья распространяется под лицензией GNU FDL (GFDL). Полный текст содержится тут:

http://www.gnu.org/copyleft/fdl.html

Перевод содержится тут:

http://rus-linux.net/MyLDP/histori/gpl/gfdlrus.html

В случае вопросов, разумеется, обращайтесь к оригинальной лицензии.

Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".

Текст GNU FDL находится в главе 10, страницы 70-77.

Спасибо

• Компании БелСофт МСК, Москва, http://belsoft.ru, за предоставление камеры на тестирование.

• Собчикову Владимиру Витальевичу, сотруднику БелСофт МСК (курирует вопросы видеонаблюдения) за грамотные консультации по устройствам видеоввода, а также за своевременные и качественные комментарии и технические поправки к черновым вариантам этой статьи.

От автора

Первая версия была готова 14 апреля 2006, к ней были получены замечания от Владимира Собчикова, после чего у меня была масса разнообразных проблем в результате которых статья ушла в стол до сентября 2006. Текущую дату сборки статьи видно на титульном листе. Я не планирую больше развивать эту статью и выкладываю ее для всех желающих. Заранее прошу прощения за возможные несоответствия действительному положению дел с Planet ICA 110 - сначала статья писалась, а потом уже читалась документация, а лишь спустя несколько месяцев (когда я уже смутно помнил что это за железяка вообще) я нашел в себе силы чтобы внести изменения согласно комментариям Владимира Собчикова.

Это особенно касается описания �Trigger� - как верно подметил Владимир мне хотелось от камеры совсем не того что подразумевали производители. :) Тем не менее, буду рад, если Вам пригодится мой труд. Собственно статью можно позиционировать не только как HOWTO по Planet ICA 110, но и как HOWTO по первичной установке ZoneMinder. Если Вам пригодился этот мой опус - черкните на olli@digger.org.ru пару строк - мне будет приятно увидеть отдачу от этого материала. Если у Вас вдруг возникнут какие либо вопросы по выводу команд - не забывайте, что рядом с pdf и dvi лежит оригинал макет в LaTeX, в нем вывод команд можно посмотреть целиком, не обрезанным краями страницы A4 внутри конструкций

\begin {verbatim}

\end {verbatim}

Собственно это потому что мои знания LaTeX оставляют желать лучшего - ну не знаю я какой командой автоматически выбирается размер шрифта под конструкцию verbatim. Если вдруг среди читателей есть гуру LaTeX - черкните мне как добиться нормального отображения - поправлю и скажу Вам в статье спасибо. :)

3 Обзор камеры.

3.1 Выдержки из обзора БелСофт МСК

Полностью посмотреть на planet ica-110 можно по url:

http://belsoft.ru/index.php?cont=prices&page=a&dob=2&id=17541

Обзор этого url (укороченная версия):

ICA-110/110W поддерживают проводные/беспроводные сети Ethernet. Камеры семейства ICA-110 могут быть подключены внутри локальной сети или при помощи xDSL или кабельного модема.

Используя MJPEG, семейство камер ICA-110 может передавать изображения с частотой 30 кадров в секунду при любом разрешении. Выбирая из 5 уровней алгоритма сжатия изображения можно добиться оптимального соотношения качества изображения и пропускной способности сети.

Семейство камер ICA-110 обладает управлением через WEB-интерфейс, способно работать с внешними датчиками и подключаемыми исполнительными устройствами, отправлять уведомления на электронную почту и / или FTP сервер.

Применение

Remote monitoring application (Home)

Remote monitoring application (Office)

Основные особенности

# Простота использования # Поддержка Интернет # Удаленный просмотр # Поддержка различных сетевых протоколов: SMTP,FTP и др.. # Удаленной управление # Поддержка DDNS # Поддержка UPnP # Поддержка RS-485 # Поддержка звука # Поддержка стандарта беспроводной связи 802.11g (только для ICA-110W). # Различные приложения для видеонаблюдения

Спецификация Модель ICA-110

Аппаратное обеспечение Матрица 1/3? цветная CMOS Объектив 6.0 мм, F: 1.8 Регулировка усиления Авто (AGC) Баланс белого Авто Регулировка экспозиции Авто Беспроводная сеть Нет Интерфейс Ethernet 1 x 10/100Mbps RJ-45 port. Auto-sensed, Auto-MDIX Внешние интерфейсы 1 x вход , 1 x выход, 1 x RS485

Изображение Сжатие изображения M-JPEG, 5 уровней (Lowest/Low/ Medium/High /Highest)

Разрешение 160 x 120 (30к/с), 320 x 240 (30к/с), 640 x 480 (30к/с)

Сетевые функции

Тип подключения Static IP, PPPoE, DHCP

Управление Web браузер (Internet Explorer 5.0, Netscape 6.0 или выше), Windows-утилита, поддержка ActiveX и JAVA

Поддерживаемые протоколы HTTP, FTP, TCP/IP, UDP, ARP, ICMP, DHCP, PPPoE, DDNS, SMTP, UPnP

Питание Напряжение 5В постоянного тока

Условия функционирования Температура: 5~40 градусов C Влажность: 5~95%(без образования конденсата) Разрешения CE, FCC

3.2 Мой обзор

Поделие planet за номером ICA 110^{5} умеет motion jpeg/30fps и все это за чуть менее 170 USD (на март 2006-го года).

Из документации (анонсы на сайте planet и доступные для скачивания pdf’ы) видно:

5полностью: PLANET Internet Camera ICA-110

Минусы:

• Совершенно не умеет ночной режим.^{6}

• Существенные размеры.

• Датчик движения отсутствует (вроде как софтверная реализация под оффтопик)

• невысокое разрешение матрицы

• отсутствие поддержки объективов с автоматической регулировкой диафрагмы(АРД)

Из плюсов у planet ica 110:

• motion jpeg, который вроде как лучше mpeg4. ^{7}

• 640x480

• 30fps

• Порт с получением и генерацией события.

• Наличие DI/DO - входов/выходов на внешние датчики тревоги (triggers) и устройства сигнализации.

• Микрофон �на морде�.

• крепление объектива C/CS - возможность замены объектива на максимально подходящий по условиям наблюдения.

• наличие порта RS-485 - возможность управления через сеть вращением камеры при установке ее на устройство поз иционирования (сканер)

В конце статьи будет дано более полное описание плюсов и минусов полученное практическим разбором работы этой железки.

6Правда ночной режим производитель и не обещал.

7лучше понятие относительное - качество лучше любого mpeg, проще со стоп-кадрами.. Но вот диск ест на порядок поболе. =)

4 Физическое подключение.

Тут все просто - распаковали, подцепили при необходимости штатив, в комплекте идет �прямой� ethernet кабель, то есть для подключения в hub. Если собираетесь подключать непосредственно к сетевухе в компе потребуется �кросс�-ethernet кабель ^{8} В принципе, кроссовый кабель можно купить, если обжимного инструмента или знакомого, кто мог бы его сделать для вас в пределах досягаемости нет.

4.1 Важно

При распаковке камеры переписываем ее MAC адрес, он нам пригодится. MAC нанесен на нижней части корпуса камеры и имеет вид шести пар чисел 16тиричного алфавита: XXXXXXXXXXXX . В моем случае это �00304F49B17C�. ^{9} . Собственно, на стикере есть указатель на MAC адрес, он записан под нижним из двух штрихкодов.

4.2 Условия, в которых тестировалась камера

При оценке скорости работы камеры следует учитывать, что в моих домашних условиях мне было удобно работать со своего компьютера^{10}, постоянная загрузка CPU которого составляет от 20 до 40 процентов, так что если Ваш компьютер не нагружен другими задачами - вы может быть получите лучшие результаты по производительности^{11}.

8 Кроссовый кабель получается из прямого заменой с одной стороны шнура положения пар.

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

9MAC’и записывают в разных нотациях. В windows привычно писать через тире каждую пару, в unix через двоеточие , у cisco разделяют точкой каждый три пары. Planet записывает MAC слитно.

10 CPU p3-866, 512 RAM, SuSE 10.0

11 Действительно, процессор проводит обратное преобразование сжатого видеосигнала д ля отображения на мониторе, если он слаб, то просто не будет успевать выдавать картинку даже в том качестве, как ее выдает камера. Типа, если ваша программа работает медленно - обновите компьютер ;) - by Владимир Собчиков.

5 Логическое подключение

5.0.1 Установки по умолчанию

Если камера попала к Вам из магазина - у вас стоят настройки по умолчанию. Если же Вы получили уже настроенный аппарат, к которому у Вас нет пароля, либо забыли собственный пароль - на задней стенке корпуса камеры существует утопленный в корпус переключатель. Если нажать на него и подержать несколько секунд^{12}, то настройки вернутся к заводским.

5.0.2 Получение доступа к камере

Документация

Можно пойти путем чтения документации, где, наверняка, написано, какой адрес получает камера после сброса к заводским установкам, а можно получить немного больше информации, параллельно выяснив адрес камеры. Я воспользовался вторым способом.

Своими руками

Открываем в X окошко с терминалом (konsole, xterm, rxvt and so on), делаем ’su -’, после получения приглашения пользователя с правами root запускаем ethereal (или tcpdump - на любителя). Переменная DISPLAY у меня выставляется правильно по умолчанию. Если у Вас возникли проблемы с запуском ethereal из под root, возможно, дело в переменной DISPLAY.

Она должна быть такой же, как и в терминале до запуска ’su -’. Возможно потребуется также сказать от имени пользователя ’xhost + 127.0.0.1’. Вот пример:

----------------- [ 03:53:28, olli@skylab, ~ ] $ xhost + 127.0.0.1 127.0.0.1 being added to access control list ----------------- [ 03:53:47, olli@skylab, ~ ] $ echo $DISPLAY :0.2 ----------------- [ 03:53:51, olli@skylab, ~ ] $ su - Password: ----------------- [ 03:53:57, root@skylab, ~ ] # echo $DISPLAY :0.2 ----------------- [ 03:54:01, root@skylab, ~ ] # export DISPLAY=":0.2" ----------------- [ 03:54:04, root@skylab, ~ ] # echo $DISPLAY :0.2 ----------------- [ 03:54:06, root@skylab, ~ ] # ethereal &

12 не менее 3х, поскольку просто нажатие reset предназначено для обычной перезагрузки.

Хотя я и не видел ситуаций когда она бы понадобилась - камера у меня не зависала ни разу

[1] 29630 ----------------- [ 03:54:08, root@skylab, ~ ] #

В ethereal идем в первую кнопку слева (при наведении на нее показывается надпись ’List the avaliable capture interfaces’^{13}), выбираем сетевой интерфейс который смотрит в тот же сегмент ethernet, что и камера, нажимаем ’prepare’. Жмем кнопу ’Capture Filter’, в ’Filter String’ пишем:

ether host 00:30:4F:49:B1:7C

Нажимаем ’OK’^{14}.

Теперь, если Вы уже включили камеру в ethernet^{15}, можно нажать ’Start’ и пойти заварить чайку^{16}. Пока я ходил покурить камера набросала 26 UDP пакетов. Теперь можно нажать ’Stop’.

Использование полученных результатов

Самое главное что мы получили - в колонке Source Address. В моем случае это 192.168.0.20 .

Дополнительная информация - камера отправляет SSDP advertizement на мультикастовые адреса. Очевидно, что обученная протоколу SSDP система увидит ее автоматически. Воспользовавшись глаголом современности �2google� получаем при поиске ’SSDP protocol’ описание на первом же линке:

Abstract

The Simple Service Discovery Protocol (SSDP) provides a mechanism where by network clients, with little or no static configuration, can discover network services. SSDP accomplishes this by providing for multicast discovery support as well as server based notification and discovery routing.

13 в английском интерфейсе

14 Можно сохранить фильтр под каким либо названием написав что нить в ’Filter Name’ и нажав ’Save’, тогда, если Вы еще раз захотите посмотреть трафик с камеры, вам не придется вспоминать как делается фильтр - в него можно будет ткнуть мышой.

15 я для чистоты эксперимента просто делал hardware reset со сбросом

16 После сброса камера выдает несколько пакетов практически сразу же

5.0.3 Конфигурирование Linux

Alias в той же сети

Сеть на моем домашнем ethernet интерфейсе не совпадает с сетью по умолчанию. Не беда - поднимаю alias:

----------------- [ 15:23:15, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ifconfig eth0:1 192.168.0.3 ----------------- [ 15:23:34, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ifconfig eth0 eth0 Link encap:Ethernet HWaddr 00:10:22:2F:11:AF

inet addr:192.168.3.2 Bcast:192.168.3.255 Mask:255.255.255.0 inet6 addr: fe80::290:27ff:fe2f:eaac/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1887948 errors:1 dropped:1 overruns:0 frame:1 TX packets:1873975 errors:0 dropped:0 overruns:0 carrier:0 collisions:4004 txqueuelen:1000 RX bytes:1280916868 (1221.5 Mb) TX bytes:648585723 (618.5 Mb)

----------------- [ 15:23:55, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ifconfig eth0:1 eth0:1 Link encap:Ethernet HWaddr 00:10:22:2F:11:AF

inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

----------------- [ 15:23:58, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ping 192.168.0.20 PING 192.168.0.20 (192.168.0.20) 56(84) bytes of data. 64 bytes from 192.168.0.20: icmp_seq=1 ttl=255 time=7.87 ms 64 bytes from 192.168.0.20: icmp_seq=2 ttl=255 time=2.43 ms 64 bytes from 192.168.0.20: icmp_seq=3 ttl=255 time=0.360 ms

--- 192.168.0.20 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2014ms rtt min/avg/max/mdev = 0.360/3.559/7.878/3.169 ms ----------------- [ 15:25:01, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

Теперь можно открыть мозиллу или оперу или другой браузер, которым вы любите пользоваться и сходить посмотреть на то, что предоставляет нам это �чудо техники�. Я использовал mozilla и opera.

В качестве url вбиваем:

http://192.168.0.20/

Получаем перенаправление на index.asp. Сразу видна картинка и есть линки на:

* View Image - ActiveX mode

* View Image - Java mode

* System Administration

Для того чтобы получить изображение с камеры потребовалось около 15 минут, из них 10 я курил и заваривал себе чай.

ActiveX ,

разумеется, не работает^{17}. Ну и фик с ним - не очень то и хотелось. :) Хотя знающие люди говорят, что приложив некий минимум усилий activex заводится и под линухом. =)

Для того чтобы посмотреть картинку по второму линку в мозилле делаем так:

меню->Edit->Preferences->Enable Java->OK.

По клику на �View Image - Java mode� грузится ява машина от Sun Microsystems, запрашивается подтверждение на загрузку апплета^{18} - отвечаем ’Yes’. Получаем изображение с камеры в default разрешении. В общем то, вполне пристойно, даже с учетом того, что в status bar всего от 12 до 20 fps. Если поставить галочку на получение audio звук транслируется, свое эхо я из соседней комнаты услышал (задержка на секунд). Слышно отчетливо, но явно фонит, иногда на доли секунды затыкается. Вполне вероятно, что это уже проблемы явы и ее работы с потоком данных и локальным audio устройством. Разумеется ява машина подгружает мой комп (p3-800) под самое небалуйся (до 100 процентов), так что, на мой взгляд, режим просмотра вполне рабочий, но годится лишь �на поиграться�.

Кстати, если отказать от загрузки плагина в ява моде работает получении изображения по кнопе ’Reload’ в браузере.

При нажатии reload по �base url� (по умолчанию - http://192.168.0.20/) картинка также обновляется.

5.0.4 Конфигурирование камеры

Идем в �System Administration�, там довольно много. В каждой закладке после изменений жмем ’Save’. Из того что там есть мне показались актуальными следующие настройки:

17 поделие микрософта такое, насколько я знаю, отнюдь не открытый стандарт, так что - не работает и тем лучше. =)

18 по крайней мере в моем случае.

Users

Вот тут небольшая засада с управляющим пользователем. Пользователь обозван слева как Administrator, чуть правее - как Admin, на самом деле пароль задается для пользователя �admin�. Причем при первом же ’apply’ на url уже выползает окошко авторизации с двумя пустыми полями - Username и Password. Вероятнее всего эта тонкость есть в документации.

Однако камера имеет \underline{существенный} недостаток - после того как введены и admin и пользователь первая страница доступа по пользователю не спрашивает. То есть линк ’http://192.168.0.20/index.asp’ доступен со свежим изображением всем и всегда. :/ Проверено на разных браузерах - все, включая mozilla, konquer, opera.^{19}

Так что выкладывая такую камеру в сеть общего доступа, имейте ввиду, что любой желающий сможет получить screen-short в любой момент времени (а при желании и получить ряд фото которые, при достаточной частоте обращений вполне способны заменить motion-jpeg. См. раздел по автоматизации).

Еще о нюансах с пользователями: показалось, что после входа администратором камера пускает всех какой то промежуток.

Для проверки - завел на камере администратору пароль при следующих настройках:

----------------- [ 02:32:15, root@skylab, ~ ] # ifconfig eth0:1 eth0:1 Link encap:Ethernet HWaddr 00:90:27:2F:EA:AC

inet addr:192.168.0.3 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

----------------- [ 02:36:34, root@skylab, ~ ] #

Затем сменил IP-шник:

----------------- [ 02:36:34, root@skylab, ~ ] # ifconfig eth0:1 192.168.0.2 ----------------- [ 02:36:42, root@skylab, ~ ] # ifconfig eth0:1 eth0:1 Link encap:Ethernet HWaddr 00:90:27:2F:EA:AC

inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0

19 По поводу авторизации. Естественно, после открытия сессии в течение некоторого времени сервер камеры помнит пользователя, поэтому заход с этого же адреса не требует повторной авторизации. Но если пауза была значительная - придется авторизоваться заново. насколько камера понимает смену вашего ip-ка ка компе - не знаю - нужна внутренняя диагностика. По крайней мере, у нас в офисе никогда такого не было - с разных компов при заходе всегда спрашивался пароль. - by Владимир Собчиков

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

----------------- [ 02:36:44, root@skylab, ~ ] #

И снова зашел. На удивление результат оказался разным: некоторые браузеры запоминали remote end (камеру) и автоматически подставляли нужные данные при доступе. Однако если смена IP сопровождалась перезапуском браузера - пароль таки запрашивался. Тем не менее механизм аутентификации реализован криво, так, если с данного IP уже заходили в административный режим или просмотр - камера это помнит и пускает еще долго, даже из другого браузера, что некорректно, ведь данный адрес может NAT’ить еще целую толпу машин.

Так же эта часть настроек завязана напрямую на ’Trigger’, а именно: пользователей заведенных в user list можно затем вводить в списке тех, кому доступна кнопка ’Trigger’ при просмотре изображения в ява-режиме.

После ввода пользователей и trigger email отключается или начинает глючить ява режим, а именно при попытке выбора capture отказывает с ошибкой �no video streaming�. Сброс пользователей и ввод trigger email дают примерно тот же эффект - поток с нескольких fps опускается до нуля. В общем взаимодействие ява режима и конфигурации по пользователям явно недоработанное, поскольку если зайти в просмотр в ява режиме (�View Image - Java mode�) после того как устройство было перезагружено в factory defaults, то никаких проблем в виде остановки потока не наблюдается, хотя он и падает, иногда, до 1.5 fps, судя по командной строке мозиллы.

Date/Time

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

• выставить синхронизацию даты с NNTP сервера, что приятно, но не тестировал - надо открывать под это дырочку в firewall’е - лень. С налету с ntpd у соседа по локалке не заработало, однако проблема ли это доступа или камеры смотреть не стал.

• Установить время вручную.

• Установить TimeZone

• Взять дату с компьютера. (Synhronize with this PC). У меня работает (по крайней мере в мозилле при включенной яве

Video/Audio • выставить среду работы камеры (Environment). Для Indoor появляется воз-

можность выставить частоту света, чем я пользовался - в квартире освещение ближе к 50 Гц

• выставить разрешение в котором работает камера, разумеется ставим максимум. Потому как хоть картинка и приемлемого качества, когда она меньше, но мала.

• Выставить компрессию. Тут однозначно выбираем �Lowerst�, в противном случае качество изображения хуже. На �Highest� это очень заметно.

• Frame Rate. Тут мне нужен максимум - 30 fps.

• Флипы (повороты) по горизонтали и вертикали. Хорошо что умеет, но мне пока не пригодилось, хотя и поигрался.^{20}

• Аудио - формат и громкость. Поскольку заработало по умолчанию менять что либо не видел смысла.

• Юстировка изображения. Оченно полезная вещь. Можно поиграться с яркостью и контрастностью, хоть и в небольших пределах, но качество изображения поднять чуть чуть можно.

Забавно, что если поймать устройство на выдаче картинки непосредственно после reboot’а она оказывается чуть подкрашеной, но сочнее и ярче.

При просмотре в потоковом режиме в ява моде заметно обновление картинки (мерцание, волны по изображению), однако это не мешает распознаванию картинки.

Network

• выставить IP статически

• получить IP по DHCP

• получить IP по PPPoE

• использовать DynDNS. Весьма полезно, если диапазон адресов выдаваемых по dhcp/pppoe �реальный� и, соответственно, хочется обращаться к железке по имени. Мне в локалке с �внутренним� диапазоном адресов это, разумеется, было не нужно.

• Выставить DNS’ы.

20 Повороты (развороты) - можно подсматривать камерой через зеркало, обычно выпуклое, для обеспечения большего обзора. Вот тут эта возможность рулит. - by Владимир Собчиков

• Выставить порт. Очень нужная настройка^{21}.

DHCP: Для того чтобы проверить работу по dhcp я поднял dhcpd сервер на своем домашнем шлюзе (мог и на той же машинке, на которой смотрел на камеру) со следующей конфигурацией:

----------------- [ 16:18:56, root@sungate, /etc/init.d ] # cat /etc/init.d/dhcpd

#!/bin/bash # Startup script for dhcpd #

# Source function library. . /etc/rc.d/init.d/functions

. /etc/sysconfig/network # Source networking configuration.

# Check that networking is up and the service exists. [ "$NETWORKING" = "yes" -a -x /usr/sbin/dhcpd -a -s /etc/dhcpd.conf ] || exit

DHCPD_DEVICES="eth2"

case "$1" in

start) echo -n "Starting dhcpd: " #daemon dhcpd -q eth0 eth1 #daemon dhcpd -q eth0 eth1.102 daemon dhcpd -q $DHCPD_DEVICES echo ;;

stop) echo -n "Shutting down dhcpd " killproc dhcpd echo ;;

status) status dhcpd ;;

21 А нужна она из за того, любой желающий может получить доступ к изображению, хотя администрирование и просмотр ’real time’ запаролены, но в режиме просмотра �с кнопой ’reload’ в руках� получить изображение с камеры вполне реально. Впрочем сканеры портов никто не отменял, так что настройка эта может спрятать камеру только от чайника.

restart)

$0 stop $0 start ;;

reload)

$0 restart

;;

*) echo "Usage: dhcpd {start|stop|reload|restart|status}" exit 1

esac

exit 0 ----------------- [ 16:19:45, root@sungate, /etc/init.d ] # cd /etc/rc.d/rc3.d/ ----------------- [ 16:21:04, root@sungate, /etc/rc.d/rc3.d ] # ls -l *dhcp* lrwxrwxrwx 1 root root 15 Фев 3 22:45 S65dhcpd -> ../init.d/dhcpd ----------------- [ 16:21:13, root@sungate, /etc/rc.d/rc3.d ] # ----------------- [ 16:23:11, root@sungate, /etc/rc.d/rc3.d ] # cat /etc/dhcpd.conf # DHCP server options. # See dhcpd.conf(5) and dhcpd(8) for more information. #

ddns-update-style none;

shared-network sunnet { option domain-name "digger.org.ru"; option domain-name-servers 192.168.3.1,192.168.254.2;

option routers 192.168.3.1;

subnet 192.168.3.0 netmask 255.255.255.0 {

range 192.168.3.4 192.168.3.5;

host planet {hardware ethernet 00:30:4F:49:B1:7C; fixed-address 192.168.3.3; option host-name "planet";}

}

}

----------------- [ 16:23:31, root@sungate, /etc/rc.d/rc3.d ] #

Соответственно указал в конфигурации брать адрес с dhcp. Еще сделал ’ifconfig eth0:1 192.168.0.2’ на той машинке, которой смотрел, чтоб адреса не пересекались. Заработало. Правда dns’ы с dhcp оно не факт что умеет брать. Проверять было лень, но то, что dns задается отдельно - уже говорит об этом, плюс к тому поле DNS по получении адреса с dhcp заполнено не было.

Еще прописал alias на interface чтобы поднимался автоматически при ’/etc/init.d/network restart’:

----------------- [ 03:59:18, root@sungate, ~ ] # cat /etc/sysconfig/network-scripts/ifcfg-eth2-range0 # flat LAN alias for ethernet camera IPADDR_START=192.168.0.1 IPADDR_END=192.168.0.1 CLONENUM_START=0 ONBOOT=yes NETMASK=255.255.255.0 BROADCAST=192.168.0.255

----------------- [ 03:59:35, root@sungate, ~ ] #

Выставить порт

После выбора установки порта камера просит ребут. Однако, если выбрать порты больше 1024, то доступ по прежнему порту остается, хотя никаких предупреждений не выдается. То есть выбор ’http port’ работает только для диапазона нижних портов. Хотя reboot запрашивается в любом случае.

Trigger

Output trigger - это когда камера посылает электрический сигнал на внешнее устройство - всключение сигнализации, света, ревун, GSM-модуль и прочее. Проверить его работу можно тестером - на DO появится импульс 12VAC определен ной - в зависимости от настройки - продолжительности.

Во первых , если настраивать trigger от имени администратора^{22} можно отправить тестовый email.

Например, произвожу следующие настройки:

1. SMTP Server address: 192.168.0.1

2. Sender email address: olli@digger.org.ru

3. Receiver email address: olli@sungate.digger.org.ru

Если при этом я ставлю галочку ’Send a test email’ я получаю тестовый email, в логах это выглядит так:

Feb 13 00:18:06 sungate postfix/smtpd[7401]: connect from unknown[192.168.0.20] Feb 13 00:18:06 sungate postfix/smtpd[7401]: 207AE6CE: client=unknown[192.168.0.20] Feb 13 00:18:06 sungate postfix/cleanup[30140]: 207AE6CE: message-id=<20060212211806.207AE6CE@sungate.digger.org.ru> Feb 13 00:18:06 sungate postfix/qmgr[23070]: 207AE6CE: from=<olli@digger.org.ru>, size=710, nrcpt=1 (queue active) Feb 13 00:18:06 sungate postfix/smtpd[7401]: disconnect from unknown[192.168.0.20] Feb 13 00:18:06 sungate postfix/local[14845]: 207AE6CE: to=<olli@sungate.digger.org.ru>, relay=local, delay=0, status=sent (mailbox)

В почтовой программе этот тестовый email выглядит так:

New mail has arrived. ----------------- [ 00:43:20, olli@sungate, ~ ] $ mail Mail version 8.1.2 01/15/2001. Type ? for help. "/var/mail/olli": 1 message 1 new >N 1 olli@digger.org.r Mon Feb 13 00:18 24/816 email notification test & h >N 1 olli@digger.org.r Mon Feb 13 00:18 24/816 email notification test & 1 Message 1: From olli@digger.org.ru Mon Feb 13 00:18:06 2006 Return-Path: <olli@digger.org.ru> Delivered-To: olli@sungate.digger.org.ru From: CamMailer <olli@digger.org.ru> To: <olli@sungate.digger.org.ru> Subject:email notification test MIME-Version:1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0007_01C35744.2F41F430" X-Mailer:Jack Lou This is a multi-part message in MIME format.

22 а только его и пускает, даже если заведены другие пользователи и выставлен доступ к Trigger для одного из пользователей - изменения в закладке ’Trigger’ может делать только пользователь admin (или любой, если admin password is not set)

------=_NextPart_000_0007_01C35744.2F41F430 Content-Type:text/plain;charset="big5" Content-Transfer-Encodeing:7bit

This is a Test mail.

&

Почему то без картинки в аттаче. Видимо решили, что самого факта отправки достаточно..

Кстати, если у вас не получается отправить тестовый email - возможно Вы не прописали релеинг для вашей web-камеры. Для postfix вполне достаточно сделать так:

----------------- [ 04:14:26, root@sungate, ~ ] # cat /etc/postfix/mynetworks 127.0.0.1/32 192.168.3.0/24 192.168.0.20/32

----------------- [ 04:14:32, root@sungate, ~ ] # /etc/init.d/postfix restart Shutting down postfix: [ OK ] Adjusting environment for postfix: [ OK ] Starting postfix: [ OK ] ----------------- [ 04:14:49, root@sungate, ~ ] #

Тут последняя строка разрешает принимать любую почту от хоста 192.168.0.20, т.е. с IP камеры по умолчанию.

Во вторых, производители понимают trigger по своему, например, желание получить по кнопке из web-interface’а набор картинок на email так и останется неудовлетворенным:

Если поставить галочку ’Trigger Output’ с указанием ’Time Interval’, то несмотря на это - в логах и почтовом ящике тишина. Для того чтобы проверить, не завязано ли это на motion detection выключаю свет, потом включаю его. Реакции нет. Прохожу в области изображения, машу руками - отсылки изображения нет. Опробовано с разными ’Time Interval’: не работает. Можно попробовать работает ли это при нажатой кнопке ’Trigger’ в просмотре в ява-режиме.. так вот не работает. =) Ни у админа, ни у пользователя, которому кнопень ’Trigger’ разрешена.

После того как не заработало - таки полез в документацию и выяснилось, что триггер на самом деле это переключатель который замыкает некоторую цепь на порту (подробнее, включая схемы подключения - в документации). Так что trigger нажатый в web-interface’е просто не предназначен к получению картинки по smtp.

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

Upload

Полезная фича. И работает. При входе вручную на специально поднятый по такому случаю vsftpd под пользователем вбитым в web-interface я имею строку вида:

Feb 13 01:30:43 sungate pam_tcb[26429]: vsftpd: Authentication passed for webcam from (uid=0)

Конфигурация vsftpd выглядит у меня следующим образом:

# grep -v ^\# /etc/vsftpd/conf | grep -v ^\$ anonymous_enable=YES local_enable=YES write_enable=YES anon_upload_enable=NO anon_mkdir_write_enable=NO dirmessage_enable=YES xferlog_enable=YES connect_from_port_20=YES chown_uploads=YES chown_username=nobody idle_session_timeout=90 data_connection_timeout=90 nopriv_user=novsftpd async_abor_enable=NO ftpd_banner=Welcome to the sungate ftp service. deny_email_enable=YES banned_email_file=/etc/vsftpd/banned_emails chroot_local_user=YES chroot_list_enable=YES chroot_list_file=/etc/vsftpd/chroot_list ls_recurse_enable=YES hide_ids=NO check_shell=YES listen=NO no_anon_password=YES setproctitle_enable=YES userlist_deny=YES userlist_file=/etc/vsftpd/user_list anon_root=/home/anonftp ftp_username=ftp secure_chroot_dir=/var/empty ----------------- [ 02:06:13, root@sungate, ~ ] # cat /etc/vsftpd/chroot_list olli ----------------- [ 02:08:44, root@sungate, ~ ] #

То есть все пользователи кроме olli у меня chroot’ятся, таким образом чтобы webcam писала в свой домашний каталог я указываю �Directory Path� в �/�^{23}.

Сервис ftp в xinetd описан так:

----------------- [ 02:12:32, root@sungate, ~ ] # cat /etc/xinetd.d/vsftpd # default: off # description: The vsftpd FTP server. service ftp {

disable = no socket_type = stream protocol = tcp wait = no user = root per_source = 5 instances = 50 nice = 10 rlimit_as = 16M log_on_success += PID HOST DURATION log_on_failure += HOST server = /usr/sbin/vsftpd

# server_args = } ----------------- [ 02:15:27, root@sungate, ~ ] #

23 ’/’ без кавычек, разумеется

От камеры входа на ftp я добился только после того как внимательно посмотрел в логи. =) По умолчанию у меня был запрет на соединения в xinetd со всех хостов, кроме заранее прописанных. Так что не забудьте к вышеуказанному конфигу что нибудь подобное в конфигурации xinetd:

----------------- [ 02:08:44, root@sungate, ~ ] # cat /etc/xinetd.conf # # Simple configuration file for xinetd # # Some defaults, and include /etc/xinetd.d/

defaults {

log_type = SYSLOG authpriv info

log_on_success = PID HOST DURATION log_on_failure = HOST instances = 100 per_source = 5 only_from = 127.0.0.1 only_from = 192.168.3.0/24 only_from = 192.168.254.1 only_from = 192.168.0.0/24

}

includedir /etc/xinetd.d

----------------- [ 02:12:32, root@sungate, ~ ] #

Для того чтобы все заработало мне достаточно было добавить строчку

only_from = 192.168.0.0/24

для сети �192.168.0.0� в которой, собственно, и находится камера в режиме по умолчанию.

В моем случае пробовалось в следующих режимах:

Radio-button ставился в положение �Always�, radio-button �Image frequency� ставится Seconds/Frame, значение выбирается в 1, в Base File Name прописано ’BaseFileName, radio-button File поставлен в положение Date/Time Suffix.

Перед тем как поставить галочку Upload image to FTP server просматриваем что есть в каталоге webcam:

----------------- [ 01:22:03, root@sungate, ~ ] # ls ~webcam/*.jpg -1| wc -l ls: /home/webcam/*.jpg: No such file or directory

0 ----------------- [ 01:22:51, root@sungate, ~ ] #

После чего нажимаем на Save и в терминале делаем:

----------------- [ 01:22:51, root@sungate, ~ ] # while true ; do sleep 1; ls ~webcam/*.jpg -1 | wc -l; done

1 2 2 3 4 4 5 6 6 7 8 8 9 9 10 11 11 12 13

Из чего можно сделать вывод, что либо аналог крона на камере не особо аккуратный, либо машинка загружена и просто не успевает обработать все что нужно ^{24}.

В это же время в системных логах:

Feb 22 01:31:32 sungate xinetd[17486]: START: ftp pid=18063 from=192.168.0.20 Feb 22 01:31:32 sungate pam_tcb[18063]: vsftpd: Authentication passed for webcam from (uid=0) Feb 22 01:37:04 sungate xinetd[17486]: EXIT: ftp pid=18063 duration=332(sec)

24 первый вариант мне кажется более вероятным, но это субъективное мнение, а поднимать ftpd на машинке побыстрее было влом

Последняя строчка появляется после того как снимается галочка �Upload to FTP server� и нажимается �Save�. Соответственно то, что за 332 секунды с момента входа сумела написать камера выглядит так:

----------------- [ 01:48:15, root@sungate, ~ ] # ls ~webcam/*.jpg -1 | head -5; \ echo -e "\n ----========----\n"; \ ls ~webcam/*.jpg -1 | tail -5 /home/webcam/BaseFileName20060222_01362859.jpg /home/webcam/BaseFileName20060222_01363028.jpg /home/webcam/BaseFileName20060222_01363196.jpg /home/webcam/BaseFileName20060222_01363364.jpg /home/webcam/BaseFileName20060222_01363534.jpg

----========----

/home/webcam/BaseFileName20060222_01415118.jpg /home/webcam/BaseFileName20060222_01415290.jpg /home/webcam/BaseFileName20060222_01415459.jpg /home/webcam/BaseFileName20060222_01415634.jpg /home/webcam/BaseFileName20060222_01415843.jpg ----------------- [ 01:49:21, root@sungate, ~ ] #

Строчка времени на Web interface выглядит так:

2006-02-22 01:56:42

Работает, на мой взгляд - вполне приемлемо. Еще бы камера время не теряла после перезагрузки - вообще б было хорошо. =))

Теперь посмотрим что можно получить на бОльших скоростях - ставим ’Image Frequency’ в 5 Frames/Second, нажимаем кнопку ’Save’, а на соседнем терминале смотрим:

# rm ~webcam/*.jpg >/dev/null 2>/dev/null ----------------- [ 01:56:17, root@sungate, ~ ] # while true ; do sleep 1; ls ~webcam/*.jpg -1 | wc -l; done ls: /home/webcam/*.jpg: No such file or directory

0 ls: /home/webcam/*.jpg: No such file or directory

0 1 2 3 4 7 8 9 10 12 13 14 16 17

То есть 5 фреймов в секунду оно все таки не пишет. Таки один, очень редко - два. Неприятно, но терпимо.

RS485 Вещь очень правильная - можно повесить на порт получение и выдачу события.

То есть, во первых, можно по необходимости (вручную!) заставить камеру замкнуть некую цепь (не любую - ограничения по силе тока можно посмотреть в документации, но имея слаботочный замыкатель, добиться от него замыкания цепи с большими токами не составит проблемы для любого радиолюбителя). Во вторых, по сигналу с внешнего датчика можно получить ряд изображений на smtp.^{25}

Tools

Возможность reboot с web-интерфейса весьма пользительна. Также полезна возможность отключить огоньки �на морде� устройства, а то уж больно бросается в глаза. =) Можно сделать и factory reset.

Information

Единственное интересное тут - версия прошивки. Остальное и так известно - ip, mac, model. В моем случае это:

Firmware Version 1.02 build:666

Создатели прошивки были большие шутники видать - отличный номер билда для прошивки в которой паршиво работает часть функционала^{26}. :D С другой стороны �баги� в этой прошивке не особо критичные.

25 На момент написания статьи я видимо не разобрался в этом вопросе досконально, по крайней мере комментарий Владимира Собчикова был такой: "Теоретически - можно, но нуже н будет паяльник ;-) а главное - это делается через DO, но не через 485!!!". Так что данный параграф остается на уровне моих сомнительных утверждений, поскольку прошло довольно много времени между написанием статьи и внесением правок от Владимира Собчикова и сейчас я уже просто не помню что там к чему.

26 популярная страшилка про число 666 обыгрывалась всем кому не лень. У некоторых даже получались неплохие фильмы. :))

30

6 Автоматизация

Автоматизировать обработку изображений с камеры можно двумя способами.

1. получение и обработка video потока с камеры

2. получение и обработка snapshorts (кадров) с камеры

6.1 Простейшие возможности

В ’System Administration’ есть как минимум два пункта, котрые нас интересуют с точки зрения автоматизации. Во первых, это ’Trigger’, во вторых ’Upload’.

6.1.1 ftp

Заливка по ftp работает (см. выше), но - паршивенько - порядка фрейма в секунду, даже когда просят 5 за секунду заливается в лучшем случае два^{27}.

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

6.1.2 smtp

Автоматизация с использованием smtp может быть оформлена по разному. Например либо используя .procmailrc или непосредственно из MTA. Достаточно чтобы работала отправка на smtp.

6.2 Автоматизация на RS-485

6.2.1 Подключение кабеля

Возьмем для эксперимента обрезок ethernet кабеля и закрепим в событийном порту камеры согласно стандартной разводке: бело-оранжевый(1), оранжевый(2), бело-зеленый(3), синий(4), бело-синий(5), зеленый(6). Бело-коричневый и коричневый оставим в стороне, поскольку в RS-485 всего 6 контактов. Для того чтобы вставить проводок в соответствующее отверстие на находящуюся рядом пластмассовую защелку надо нажать, а после вставления отпустить^{28}.

27 Тестировалось на старенькой слабенькой машинке, но я больше склонен не доверять камере.

=) Мнение субъективное и разбираться насколько я прав мне было лень. =)

28 Не очень удобно - я бы предпочел 6ти контактный телефонный джек - однажды обжал и работает, не перегибается, соединение получше.

6.2.2 Включение внешнего устройства

Итак, согласно документации - 5 и 6 провода (в моем случае - бело-синий и зеленый должны давать на внешнее устройство управляющее событие, а именно замыкаться по событию.

Подключаем омметр в обычном режиме - сопротивление отсутствует. Загружаем ява режим, ставим флажек �trigger� - сопротивление уходит в 0 и держится на нуле до тех пор пока галочку не снимаем.

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

6.3 Автоматизация своими руками

6.3.1 Snapshorts

Если открыть код страницы в web-browser’е, то можно легко выявить url, по которому доступен снапшот свойства которого задаются текущими настройками:

<td bgcolor=e4ebf1 align=center height=20>

<IMG SRC="/goform/capture?1072923913543922" align=center> </td>

Действительно, если открыть картинку как отдельный url:

http://192.168.0.20/goform/capture

То на каждый ’reload’ с кнопки браузера картинка будет немного другой (за счет флюктуаций освещения). То есть, самый простой вариант с получением изображения с камеры - дергать этот url скриптом с помощью командлайновых утилит работы с http (wget, links, lynx) и далее скармливать на обработку каким либо пакетам умеющим делать motion detection из двух снимков (на freshmeat такие есть).

6.3.2 Flow

Удивительно, что несмотря на все плюсы открытых стандартов, разработчики устройства делают тайну из вещей, которые должны помочь использовать камеру и, как следствие, увеличить ее продажи. Заявленный motion jpeg действительно работает - видно по просмотру в ява режиме. Собственно и ява то нужна для того чтобы организовать съем потока. Однако нигде в документации не указано по какому url можно получить оный поток.

Тем не менее, камера поддерживает motion jpeg, что, вероятно, позволит связать ее с zoneminder или другими пакетами.

Для того чтобы определить искомый url без помощи бестолковых составителей документации достаточно либо:

• Разобрать ява апплеты �на запчасти� ява декомпилятором

• Установить прокси и по логам найти требуемый url

6.4 Video4Linux device emulation

С учетом наличия исходников loop video 4 linux device, думаю, не очень сложной задачей было бы сращивание http-качалки с драйвером, который собственно будет обеспечивать передачу изображения в устройство в формате совместимом с audio4linux устройством. А уже с video4linux устройствами работает \underline{много} различных приложений.

7 Установка ZoneMinder

Идем на freshmeat.net, в поиске вводим ZoneMinder, получаем, как минимум, один проект. Когда писалась эта статья проект находился как:

http://freshmeat.net/projects/zoneminder/

Если любопытно - идем на указанную там домашнюю страницу ( на момент написания этой статьи - www.zoneminder.com). А если не особо интересно - просто дергаем мышей url на tgz, когда я скачивал это было:

http://www.zoneminder.com/downloads/ZoneMinder-1.22.0.tar.gz

Далее, по скачиванию tgz он разархивируется стандартным ’tar xzf /path/to/ZoneMinder-1.22.0.tar.gz’

После чего идем внутрь полученного каталога. В моем случае это:

# cd /usr/src/2Install/CURRENT/ZoneMinder-1.22.0/ ----------------- [ 03:39:09, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ls

.  ChangeLog  config.status depcomp  Makefile.in  README.html src  zm.conf.in
..  confdefs.h configure  INSTALL  missing  README.pdf stamp-h1

acinclude.m4 config.h configure.in install-sh mkinstalldirs README.rtf TODO

aclocal.m4  config.h.in COPYING  Makefile  NEWS  README.txt web
AUTHORS  config.log db  Makefile.am README  scripts  zm.conf

----------------- [ 03:39:14, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # less INSTALL

INSTALL коротенький и бестолковый. Делаем ’less README.txt’. Ищем слово ’Requirements’. Выясняется, что проект то монстр - ему и sql backend подавай и еще много чего.. ;)

7.1 Инсталяция MySQL

Выясняется, что сначала нам надо поставить mysql:

Firstly, it uses MySQL so you’ll need that. In order to compile you need to make sure you have a development installation and not just a runtime; this is because it needs to use the MySQL header files. If you are running an RPM based distribution then it’s probably worth installing all the pure mysql rpm files to be sure you have the right ones.

В моей системе он уже стоит , если у Вас еще нет - ставите из rpm ^{29} или собираете из исходников согласно инструкции внутри tgz с исходным кодом. Описание того как делать установку из исходников в пакете с исходниками вполне вменяемое. В любом случае - я ставил из rpm, что для домашней системы и, тем более для тестов - вполне достаточно^{30}, к тому же еще и быстрее.

Вообще говоря количество пакетов, которое у меня стоит сейчас явно превышает мои потребности, но однажды потраченное время на инсталляцию всего что только есть экономит мне теперь время на поисках пакетов. Например:

----------------- [ 04:06:04, olli@skylab, ~ ] $ rpm -qa | grep sql | wc -l 57 ----------------- [ 04:06:41, olli@skylab, ~ ] $ rpm -qa | grep mysql | wc -l 23 ----------------- [ 04:16:23, olli@skylab, ~ ] $

На всякий случай приведу список того что относится конкретно к mysql:

----------------- [ 04:19:43, olli@skylab, ~ ] $ rpm -qa | grep -i mysql mysql-devel-4.1.13-3 mysql-4.1.13-3 ulogd-mysql-1.23-2 mysql-query-browser-1.1.12-2 mysql-client-4.1.13-3 libgda-mysql-1.3.91-5 mysql-shared-4.1.13-3 qt3-mysql-3.3.4-28 rekall-mysql-2.2.1-11 mysql-administrator-1.0.22a-2 python-mysql-1.2.0-4 perl-DBD-mysql-3.0002-2 mysql-Max-4.1.13-3 mysql-bench-4.1.13-3 php4-mysql-4.4.0-6 apache2-mod_auth_mysql-2.8.1-5 postfix-mysql-2.2.5-5 php5-mysql-5.0.4-9 qt-sql-mysql-4.0.1-10 bytefx-data-mysql-1.1.8.3-6 php5-mysqli-5.0.4-9 ruby-mysql-2.6.3-5 mysql-connector-java-3.1.8-3 ----------------- [ 04:20:17, olli@skylab, ~ ] $

29 ’rpm -i /path/mysqlrpmfile.rpm’, если возникают проблемы с зависимостями пакетов - находите в сети или на Вашем инсталляционном диске нужное и доставляете, ну или сносите то, что мешает.

30 а если еще точнее - выбрал установку mysql пакетов (и прочих sql-aware пакетов) при инсталляции системы

Соответственно после того как mysql поставлен его надо настроить.

Внимание: в моей системе используются пути отличные от путей по умолчанию. Будьте внимательны - если у Вас что то не получилось с mysql по этому HOWTO - дело вполне может быть �в путях�.

Делаем следующее ^{31}:

----------------- [ 04:23:35, olli@skylab, ~ ] $ rpm -ql mysql-4.1.13-3 | grep ^/etc /etc/init.d/mysql /etc/logrotate.d/mysql /etc/my.cnf ----------------- [ 04:23:49, olli@skylab, ~ ] $ cat /etc/init.d/mysql | wc -l 274 ----------------- [ 04:25:39, olli@skylab, ~ ] $

В SuSE init скрипты, как и в RedHat подобных системах весьма монстрообразны. =) Но работают и обычно не требуют вмешательства - вот, для примера, последняя команда из вышеуказанных показывает количество строк в /etc/init.d/mysql - 274.

Если вдруг у вас нет стартового скрипта, то Вы можете сам сваять нечто попроще или воспользоваться вот этим примером:

#!/bin/sh

# Source function library. . /etc/rc.d/init.d/functions

[ -f /usr/local/libexec/mysqld ] || exit 0

[ -f /etc/my.cnf ] || exit 0

RETVAL=0 # See how we were called. case "$1" in

31 на вашей системе версии пкетов могут отличаться, плюс у меня индивидуальны настройки

start)

# Start daemons. echo -n "Starting mysqld: " daemon /usr/local/libexec/mysqld -u mysql --default-character-set=koi8_ru --skip-nam

e-resolve --datadir=/home/mysql/db --pid-file=/var/run/mysql.pid >/dev/null 2>&1 & RETVAL=$? [ $RETVAL -eq 0 ] && touch /var/lock/subsys/mysqld echo ;;

stop)

# Stop daemons. echo -n "Shutting down mysqld: " killproc mysqld

# /usr/local/bin/mysqladmin shutdown RETVAL=$? [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/mysqld echo ;;

status)

/usr/local/bin/mysqladmin status

# /usr/sbin/ndc -c /var/named/var/run/ndc status exit $? ;;

restart) $0 stop $0 start ;;

reload) /usr/local/bin/mysqladmin reload /usr/local/bin/mysqladmin refresh exit $? ;;

probe) # to offer to restart every time /usr/local/bin/mysqladmin reload >/dev/null 2>&1 || echo start exit 0 ;;

*)

echo "Usage: mysqld {start|stop|status|restart}" exit 1 esac

exit $RETVAL

Всего на 57 строчек. Кстати, не забудьте заменить пути на соответствующие Вашей системе. =)

Теперь следующий шаг - настраиваем /etc/my.cnf. В моей системе следующие опции:

----------------- [ 05:03:46, root@skylab, ~ ] # cat /etc/my.cnf | grep -v ^\$| grep -v ^\# [client] port = 3306 socket = /var/lib/mysql/mysql.sock default-character-set=koi8r [mysqld] bind-address = 127.0.0.1 port = 3306 socket = /var/lib/mysql/mysql.sock skip-locking key_buffer = 24M max_allowed_packet = 2M table_cache = 128 sort_buffer_size = 1024K net_buffer_length = 16K read_buffer_size = 372K read_rnd_buffer_size = 640K myisam_sort_buffer_size = 9M default-character-set=koi8r log-bin server-id = 1 [safe_mysqld] err-log=/var/log/mysql/mysqld.log default-character-set=koi8r [mysqldump] quick max_allowed_packet = 16M default-character-set=koi8r [mysql] auto-rehash # tab completition default-character-set=koi8r [isamchk] key_buffer = 30M sort_buffer_size = 30M read_buffer = 3M write_buffer = 3M default-character-set=koi8r [myisamchk] key_buffer = 30M sort_buffer_size = 30M read_buffer = 3M write_buffer = 3M default-character-set=koi8r [mysqlhotcopy] interactive-timeout default-character-set=koi8r ----------------- [ 05:04:02, root@skylab, ~ ] #1

для информации - в стартовом скрипте к mysql от сузи у меня зашиты следующие данные, которые используются как defaults, когда не установлено значение соответствующей переменной:

----------------- [ 05:05:40, root@skylab, ~ ] # grep = /etc/init.d/mysql | head -30 | grep mysql| grep -v ^\ datadir=/var/spool/mysql mysql_daemon_user=mysql mysql_daemon_group=mysql pid_file=/var/run/mysql/mysqld.pid socket=/var/lib/mysql/mysql.sock MYADMIN=/usr/bin/mysqladmin export TMPDIR=/tmp/mysql/tmp ----------------- [ 05:05:53, root@skylab, ~ ] #

Добавляем mysql в автозапуск на 3й и 5й runlevel’ы:

----------------- [ 05:23:11, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ls -l /etc/rc.d/rc[35].d/*mysql* lrwxrwxrwx 1 root root 8 2006-02-20 05:21 /etc/rc.d/rc3.d/K14mysql -> ../mysql lrwxrwxrwx 1 root root 8 2006-02-20 05:21 /etc/rc.d/rc3.d/S12mysql -> ../mysql lrwxrwxrwx 1 root root 8 2006-02-20 05:21 /etc/rc.d/rc5.d/K14mysql -> ../mysql lrwxrwxrwx 1 root root 8 2006-02-20 05:21 /etc/rc.d/rc5.d/S12mysql -> ../mysql ----------------- [ 05:23:43, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

Я делаю это в SuSE ястом(SuSE menu->System->Yast->System Services (Runlevel)), очень удобно, но можно и просто в shell: ’cd /etc/rc.d/rc3.d/; ln -s ../mysql S12mysql’ и т.д.

Теперь стартуем его, если старт произошел впервые, то напишет нечто похожее на нижеследующее:

---------------- [ 05:23:43, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # /etc/init.d/mysql start Creating/Updating MySQL privilege database... Installing all prepared tables Fill help tables PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER ! To do so, start the server, then issue the following commands: /usr/bin/mysqladmin -u root password ’new-password’ /usr/bin/mysqladmin -u root -h skylab.digger.org.ru password ’new-password’ See the manual for more instructions.

You can test the MySQL daemon with the benchmarks in the ’sql-bench’ directory: cd sql-bench ; perl run-all-tests

Please report any problems with the /usr/bin/mysqlbug script!

The latest information about MySQL is available on the web at http://www.mysql.com Support MySQL by buying support/licenses at https://order.mysql.com Fixing privilege tables... Starting service MySQL done ----------------- [ 05:26:26, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

Делаем ему пароль, чтоб не ворчал:

----------------- [ 06:45:03, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # /usr/bin/mysqladmin -u root password MySql ----------------- [ 06:51:35, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # /usr/bin/mysqladmin -u root -pMySql -h 127.0.0.1 password MySql ----------------- [ 06:51:59, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

Использовать такие простые пароли никому не рекомендую. Но для тестового прогона сойдет. ;)

Теперь, когда mysql у нас должен работать мы можем проверить это, а заодно убить всякие бесполезные БД создаваемые при инсталляции:

----------------- [ 07:03:14, olli@skylab, ~ ] $ mysql -u root -h 127.0.0.1 -pMySql Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 5 to server version: 4.1.13-Max

Type ’help;’ or ’\h’ for help. Type ’\c’ to clear the buffer.

mysql> show databases; +----------+ | Database | +----------+ | mysql | | test | | tmp | +----------+ 3 rows in set (0.01 sec)

mysql> use mysql Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A

Database changed mysql> drop database test; Query OK, 0 rows affected (0.11 sec)

mysql> drop database tmp; Query OK, 0 rows affected (0.02 sec)

mysql> \q Bye ----------------- [ 07:13:31, olli@skylab, ~ ] $

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

mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> delete from user where Password=’’; Query OK, 3 rows affected (0.01 sec)

mysql> delete from db where host=’%’; Query OK, 2 rows affected (0.02 sec)

mysql>

Таким образом я избавляюсь от всех остатков безпарольных входов и от остатков сохранившихся от тестовых баз.

Поскольку в SuSE /etc/my.cnf имеет права доступа 660 при использовании набора прав ’secure’,

----------------- [ 05:56:15, root@skylab, ~ ] # ls -l /etc/my.cnf -rw-rw---- 1 mysql mysql 5135 2006-02-20 06:40 /etc/my.cnf ----------------- [ 05:56:23, root@skylab, ~ ] #

то от обычного пользователя настройки клиента из этого файла прочесть будет невозможно, так что делаем /.my.cnf следующего содержания:

----------------- [ 05:07:45, olli@skylab, ~ ] $ cat /home/olli/.my.cnf # In this file, you can use all long options that a program supports. # If you want to know which options a program supports, run the program # with the "--help" option.

# The following options will be passed to all MySQL clients [client] port = 3306 socket = /var/lib/mysql/mysql.sock

auto-rehash # enable tab completition

# set default encoding. default-character-set=koi8r

----------------- [ 05:07:57, olli@skylab, ~ ] $

Внимание: в SuSE еще неплохо бы иметь root/.my.cnf с правами 600, о чем сказано в соответствующем скрипте ротации логов:

----------------- [ 05:16:00, root@skylab, /etc ] # grep ^\# /etc/logrotate.d/mysql | tail -12 # If the root user has a password you have to create a # /root/.my.cnf configuration file with the following # content: # # [mysqladmin] # password = <secret> # user= root # # where "<secret>" is the password. # # ATTENTION: This /root/.my.cnf should be readable ONLY # for root ! ----------------- [ 05:16:05, root@skylab, /etc ] #

Поэтому делаем вот такой файлик:

----------------- [ 05:16:05, root@skylab, /etc ] # ls -l ~root/.my.cnf -rw------- 1 root root 252 2006-03-06 05:01 /home/root/.my.cnf ----------------- [ 05:18:18, root@skylab, /etc ] # cat ~root/.my.cnf # # This file is required to be presend WITH PASSWORD for automated logrotating. # [mysqladmin] password = MySql user= root port = 3306 socket = /var/lib/mysql/mysql.sock # set default encoding. default-character-set=koi8r

----------------- [ 05:18:23, root@skylab, /etc ] #

Теперь можно вернуться к документации на ZoneMinder:

Next it does things with JPEGs so you’ll need at least libjpeg.a which I think come as standard nowadays with most distributions. Users have reported varying degrees of success with other jpeg libraries such as jpeg-mmx but these are not officially supported. If you plan to use network cameras then the Perl Compatible Regular Expression library (libpcre.a) can prove useful but is not always essential. ZoneMinder also uses the netpbm utilities in a very limited way to generate thumbnails under certain circumstances though this can be modified.

Это у меня есть:

----------------- [ 07:26:28, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # find / -type f -name libjpeg.a /usr/lib/libjpeg.a ----------------- [ 08:03:18, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # rpm -qf /usr/lib/libjpeg.a libjpeg-devel-6.2.0-5 ----------------- [ 08:06:28, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # find /usr/lib -name libpcre.a /usr/lib/libpcre.a ----------------- [ 08:06:36, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # rpm -qa | grep -i netpbm netpbm-10.26.12-5 libnetpbm-1.0.0-636 ----------------- [ 08:08:17, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # rpm -qf /usr/lib/libpcre.a pcre-devel-6.2-2 ----------------- [ 08:09:34, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

Так же я уже ставил себе ffpmeg, который упоминается в zoneminder’е, используя следующий скрипт-обертку к configure:

# cat /usr/src/Installed/ffmpeg/build.sh #!/bin/bash

# touch /home/olli/.cvspass # cvs -z9 -d:pserver:anonymous@mplayerhq.hu:/cvsroot/ffmpeg co ffmpeg make clean ./configure \

--prefix=/usr/local \ --enable-libogg \ --enable-vorbis \

--enable-theora \ # --enable-faadbin \

--enable-faac \ --enable-libgsm \ --enable-xvid \ --enable-x264 \ --enable-a52 \ --enable-dts \ --enable-pp \ --enable-shared \ --enable-amr_if2 \ --enable-dc1394 \ --enable-gpl \ --cpu=686

make make install make installlib ----------------- [ 08:12:39, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

В скрипте закомментирован собственно способ забора ffmpeg с CVS. Впрочем на сайте откуда берут ffmpeg все написано. По умолчанию в SuSE ffmpeg и еще много чего нет всвязи с лицензионными противоречиями. Опции для сборки в другом дистрибутиве, разумеется, могут быть другими.

После сборки ffmpeg надо обновить /etc/ld.so.conf :

----------------- [ 12:23:02, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # grep ffmpeg /etc/ld.so.conf /usr/local/ffmpeg/lib ----------------- [ 12:24:48, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

и запустить ldconfig чтобы зависимости обновились.

----------------- [ 12:24:33, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ldconfig ----------------- [ 12:24:02, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

Возвращаясь к документации ZoneMinder видим следующее:

Finally, there is quite a bit of image streaming in the package. So if you don’t have FireFox or another browser that supports image streaming natively I recommend you get the excellent Cambozola java applet from http://www.charliemouse.com/code/cambozola/ which will let you view the image stream in Internet Explorer and others. Otherwise you’re limited to just refreshing still images or mpeg based streams, if you have compatible plugins.

Не то чтобы у меня не было FireFox, но, во первых, хотелось получить максимум возможностей, а во вторых FireFox у меня заглючил в свое время и мне было проще его снести, чем разбираться (о чем я запостил отдельный bug-report в SuSE:

https://bugzilla.novell.com/show_bug.cgi?id=143269&x=0&y=0

).

На момент составления этого howto плагин скачивался по следующему url: http://www.charliemouse.com/code/cambozola/cambozola-latest.tar.gz

Читая далее выясняем, что для сборки нужен некий ant. Идем на указанный url ( http://ant.apache.org/ ), там в первых же строках понятно о чем речь^{32}:

Apache Ant

Apache Ant is a Java-based build tool. In theory, it is kind of like Make, but without Make’s wrinkles.

К счастью у меня в системе оно уже есть из коробки:

----------------- [ 06:13:57, olli@skylab, ~ ] $ rpm -qa | grep -i ant| grep -v dante| grep -v Messan|grep -v Quant| grep -v ^wpa| grep -v ^hant| grep -v ^xsupp|grep -v ^merg anthy-devel-6801-2 ant-javadoc-1.6.2-7 ant-manual-1.6.2-7 antlr-jedit-2.7.4-8 ant-javamail-1.6.2-7 ant-apache-oro-1.6.2-7 ant-swing-1.6.2-7 ant-junit-1.6.2-7 antlr-2.7.4-8 ant-nodeps-1.6.2-7 ant-jdepend-1.6.2-7 kdenetwork3-InstantMessenger-3.4.2-11 ant-apache-bcel-1.6.2-7 ant-trax-1.6.2-7 enchant-1.1.6-3 ant-scripts-1.6.2-7 anthy-6801-2 ant-1.6.2-5 ant-apache-regexp-1.6.2-7 antlr-manual-2.7.4-8 ant-apache-bsf-1.6.2-7 ant-apache-log4j-1.6.2-7 ant-antlr-1.6.2-7 ant-jmf-1.6.2-7 ant-apache-resolver-1.6.2-7 antlr-javadoc-2.7.4-8 ----------------- [ 06:16:17, olli@skylab, ~ ] $

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

В результате:

----------------- [ 06:44:54, olli@skylab, ~/tmp ] $ cd /usr/src/2Install/CURRENT/ ----------------- [ 06:44:57, olli@skylab, /usr/src/2Install/CURRENT ] $ tar xzf cambozola-latest.tar.gz ----------------- [ 06:45:06, olli@skylab, /usr/src/2Install/CURRENT ] $ cd cambozola-0.68/ ----------------- [ 06:45:14, olli@skylab, /usr/src/2Install/CURRENT/cambozola-0.68 ] $ ls application.properties bldsrc build.xml dist dist.sh example.html LICENSE README.html src watermarks ----------------- [ 06:45:15, olli@skylab, /usr/src/2Install/CURRENT/cambozola-0.68 ] $

ant заявлен как аналог make, так что остается, самое очевидное, это набрать ant, как и написано в readme к cambozola:

----------------- [ 06:47:56, olli@skylab, /usr/src/2Install/CURRENT/cambozola-0.68 ] $ ant Buildfile: build.xml

init:

[mkdir] Created dir: /usr/src/2Install/CURRENT/cambozola-0.68/build

[mkdir] Created dir: /usr/src/2Install/CURRENT/cambozola-0.68/pkg

[mkdir] Created dir: /usr/src/2Install/CURRENT/cambozola-0.68/pkg/cambozola-0.68 [mkdir] Created dir: /usr/src/2Install/CURRENT/cambozola-0.68/deploy

[propertyfile] Creating new property file: /usr/src/2Install/CURRENT/cambozola-0.68/build.number

compile:

[echo] Compiling with JVM Version 1.5.0_03 [javac] Compiling 21 source files to /usr/src/2Install/CURRENT/cambozola-0.68/build [javac] Note: * uses or overrides a deprecated API.

[javac] Note: Recompile with -Xlint:deprecation for details.

[copy] Copying 1 file to /usr/src/2Install/CURRENT/cambozola-0.68/build

[copy] Copying 17 files to /usr/src/2Install/CURRENT/cambozola-0.68/build

dist:

[jar] Building jar: /usr/src/2Install/CURRENT/cambozola-0.68/dist/cambozola.jar

[jar] Building jar: /usr/src/2Install/CURRENT/cambozola-0.68/dist/cambozola-server.jar

BUILD SUCCESSFUL Total time: 13 seconds ----------------- [ 06:48:18, olli@skylab, /usr/src/2Install/CURRENT/cambozola-0.68 ] $

Внутри cambozola ссылки на другое ПО которое можно использовать для работы с web-камерами, в числе прочих там ZoneMinder:

Webcam software

If you want to stream from your own server, you’ll need to use some streaming webcam software, some Linux-friendly package are:

* W3CAM: http://mpx.freeshell.net/

* V4l-col: http://www.sr.bham.ac.uk/~mpc/pulsar/qcam/index.shtml

* Palantir: http://www.fastpath.it/products/palantir

* Camsource: http://camsource.sourceforge.net/

* Camserv: http://camserv.sourceforge.net/

Users of Cambozola

* Zoneminder: http://www.zoneminder.com/

* Motion: http://www.lavrsen.dk/sources/webcam/motion_guide.htm

* Wings of Cabarete: Dominican Republic beach cam

Далее возвращаясь к документации на ZoneMinder желательно освоить раздел "Components"чтобы ориентироваться в инсталируемой системе. После чего можно спокойно приступать собственно к сборке пакета, описанной в секции Building документации к ZoneMinder:

Building

To build ZoneMinder the first thing you need to do is run the included configure script to define some initial configuration. If you are happy with the default settings for the database host (‘localhost’), name (‘zm’), user (‘zmuser’) and password (‘zmpass’) then you can just type

./configure --with-webdir=<your web directory> --with-cgidir=<your cgi directory>

where --with-webdir is the directory to which you want to install the PHP files, and --with-cgidir is the directory to which you want to install CGI files. These directories could be /var/www/html/zm and /var/www/cgi-bin for example.

Откуда можно догадаться, что ZoneMinder завязан помимо sql’я еще и на апач. В моей системе apache уже установлен:

----------------- [ 07:39:54, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # rpm -qa | grep apach apache2-doc-2.0.54-10 apache2-devel-2.0.54-10 ant-apache-oro-1.6.2-7 apache2-mod_fastcgi-2.4.2-4 apache2-mod_ruby-1.2.4-5 apache2-mod_php4-4.4.0-6 ant-apache-bcel-1.6.2-7 apache2-example-pages-2.0.54-10 apache2-mod_perl-2.0.1-4 ant-apache-regexp-1.6.2-7 apache2-2.0.54-10 apache2-mod_python-3.1.3-43 apache2-mod_auth_mysql-2.8.1-5 ant-apache-bsf-1.6.2-7 ant-apache-log4j-1.6.2-7 apache2-mod_macro-1.1.6-5 ant-apache-resolver-1.6.2-7 apache2-prefork-2.0.54-10 apache2-mod_tidy-0.3-2 ----------------- [ 07:40:39, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

Соответственно берем webdir согласуясь с конфигурацией апача:

----------------- [ 07:45:48, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # rpm -ql apache2-2.0.54-10 | grep /etc | grep conf /etc/apache2/conf.d /etc/apache2/default-server.conf /etc/apache2/errors.conf /etc/apache2/httpd.conf /etc/apache2/listen.conf /etc/apache2/mod_autoindex-defaults.conf /etc/apache2/mod_info.conf /etc/apache2/mod_log_config.conf /etc/apache2/mod_mime-defaults.conf /etc/apache2/mod_status.conf /etc/apache2/mod_userdir.conf /etc/apache2/mod_usertrack.conf /etc/apache2/server-tuning.conf /etc/apache2/ssl-global.conf /etc/apache2/sysconfig.d /etc/apache2/uid.conf ----------------- [ 07:45:57, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

В сузе httpd.conf разнесен по кусочкам для удобства, вот что в httpd.conf:

# Overview of include files, chronologically: # # httpd.conf # | # |-- uid.conf . . . . . . . . . . UserID/GroupID to run under # |-- server-tuning.conf . . . . . sizing of the server (how many processes to start, ...) # |-- sysconfig.d/loadmodule.conf . [*] load these modules # |-- listen.conf . . . . . . . . . IP adresses / ports to listen on # |-- mod_log_config.conf . . . . . define logging formats # |-- sysconfig.d/global.conf … [*] server-wide general settings # |-- mod_status.conf . . . . . . . restrict access to mod_status (server monitoring) # |-- mod_info.conf . . . . . . . . restrict access to mod_info # |-- mod_usertrack.conf . . . . . defaults for cookie-based user tracking # |-- mod_autoindex-defaults.conf . defaults for displaying of server-generated directory listings # |-- mod_mime-defaults.conf … defaults for mod_mime configuration # |-- errors.conf . . . . . . . . . customize error responses # |-- ssl-global.conf . . . . . . . SSL conf that applies to default server _and all_virtual hosts # | # |-- default-server.conf . . . . . set up the default server that replies to non-virtual-host requests # | |--mod_userdir.conf . . . . . . . enable UserDir (if mod_userdir is loaded) # | ‘--conf.d/apache2-manual?conf … add the docs (’?’ = if installed) # | # |-- sysconfig.d/include.conf . . . . . [*] your include files # | (for each file to be included here, put its name # | into APACHE_INCLUDE_* in /etc/sysconfig/apache2)

# | # ‘-- vhosts.d/ . . . . . . . . . . .for each virtual host, place one file here # ‘-- *.conf . . . . . . . . . .(*.conf is automatically included) # # # Files marked [*] are created from sysconfig upon server restart: instead of # these files, you edit /etc/sysconfig/apache2

Соответственно нам нужно в listen.conf выставить на каких интерфейсах и портах апач будет слушать. Я для себя сделал так^{33}:

# be private Listen 127.0.0.1:80 Listen 127.0.0.1:443

До кучи можно выставить в /etc/apache2/sysconfig.d/global.conf ServerAdmin и ServerName.

Далее в /etc/apache2/default-server.conf выясняется собственно default document root:

----------------- [ 08:04:43, root@skylab, ~ ] # grep ^DocumentRoot /etc/apache2/default-server.conf DocumentRoot "/srv/www/htdocs" ----------------- [ 08:05:00, root@skylab, ~ ] #

Там же можно выставить для default server email для ServerAdmin (как выше) и ServerName.

Чтобы не мудрствовать лукаво, возьмем в качестве webdir каталог рядом с default DocumentRoot:

----------------- [ 08:26:54, root@skylab, ~ ] # mkdir /srv/www/zoneminder ----------------- [ 08:27:16, root@skylab, ~ ] # mkdir /srv/www/zoneminder-cgi-bin ----------------- [ 08:28:35, root@skylab, ~ ] #

И, так как от дефолтного сервера на localhost не много толку, то просто заменим его ZoneMinder’ом:

33 У Вас может быть по другому

----------------- [ 05:00:07, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # cat /etc/apache2/default-server.conf | grep -v ^\# | grep -v ^\$ DocumentRoot "/srv/www/zoneminder" <Directory "/srv/www/zoneminder">

# Possible values for the Options directive are "None", "All",

# or any combination of:

# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn’t give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs-2.0/mod/core.html#options # for more information.

Options FollowSymLinks # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # Options FileInfo AuthConfig Limit

AllowOverride All

# Controls who can get stuff from this server.

Order allow,deny Allow from all </Directory> Alias /icons/ "/usr/share/apache2/icons/" <Directory "/usr/share/apache2/icons"> Options Indexes MultiViews AllowOverride None Order allow,deny Allow from all </Directory> ScriptAlias /cgi-bin/ "/srv/www/zoneminder-cgi-bin/" <Directory "/srv/www/zoneminder-cgi-bin"> AllowOverride None Options +ExecCGI -Includes Order allow,deny Allow from all </Directory> Include /etc/apache2/conf.d/*.conf Include /etc/apache2/conf.d/apache2-manual?conf ServerName skylab ServerAdmin root@skylab.digger.org.ru ----------------- [ 05:00:10, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

�AllowOverride All� поставлено чтобы не возиться с тонкой настройкой apache. В рабочей конфигурации так делать не следует. =) �Options FollowSymLinks� необходимо чтобы в дальнейшем не было ошибок при попытке ява-скрипта перейти на index.php по симлинку.

Теперь перезапустим apache:

---------------- [ 05:00:10, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # /etc/init.d/apache2 configcheck Syntax OK ----------------- [ 05:01:31, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # /etc/init.d/apache2 restart Syntax OK Shutting down httpd2 (waiting for all children to terminate) done Starting httpd2 (prefork) done ----------------- [ 05:01:43, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

Поскольку в SuSE:

----------------- [ 08:28:35, root@skylab, ~ ] # grep apache /etc/passwd wwwrun:x:30:8:WWW daemon apache:/var/lib/wwwrun:/bin/false ----------------- [ 08:31:12, root@skylab, ~ ] # grep apache /etc/group ----------------- [ 08:31:18, root@skylab, ~ ] # grep :8: /etc/group www:x:8: ----------------- [ 08:31:48, root@skylab, ~ ] #

используем:

--with-webuser=wwwrun \ --with-webgroup=www \

В конечном итоге у меня получился следующий командный файл для сборки:

----------------- [ 12:56:59, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # cat ./build.sh #!/bin/sh make clean ./configure \

--prefix=/usr/local/zoneminder \ --sysconfdir=/etc/zoneminder \ --with-webdir=/srv/www/zoneminder \ --with-cgidir=/srv/www/zoneminder-cgi-bin \ --with-ffmpeg=/usr/local/ffmpeg \ --with-extralibs=/usr/local/ffmpeg/lib/lib* \

--with-webuser=wwwrun \ --with-webgroup=www \ --with-mysql=/usr \ --enable-debug \

--with-libarch echo -e "\n\ncheck configure results, then ’enter’ to continue." echo "(Warnings about libavcodec,libavformat,libavutil are OK.)" read wait make echo "Before running make install proceed w/ mysql part from README.txt"

----------------- [ 13:04:18, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

При этом весьма актуально в процессе запуска configure с приведенными параметрами смотреть на WARNING’и которые выдает программа. Вот например:

configure: WARNING: Device::SerialPort is required for RS232/RS485 PTZ camera control configure: WARNING: X10::ActiveHome is required for X.10 support

поскольку в моей SuSE 10.0 этого нету - если бы я захотел управлять камерой через имеющийся в ней RS485 порт, мне пришлось бы идти на CPAN ( http://cpan.org/ ) за этими модулями к perl.

Однако, продолжим инсталляцию. С учетом установленного пароля на root’овый доступ к базе надо сделать следующее:

----------------- [ 13:09:30, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # mysql -p mysql < db/zm_create.sql Enter password: ----------------- [ 13:12:06, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

поскольку я использовал defaults для database host, dbname, dbuser и пароля:

If you are happy with the default settings for the database host (‘localhost’), name (‘zm’), user (‘zmuser’) and password (‘zmpass’) then you can just type

то далее:

# mysql -p mysql Enter password: Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A

Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 6 to server version: 4.1.13-Max-log

Type ’help;’ or ’\h’ for help. Type ’\c’ to clear the buffer.

mysql> grant select,insert,update,delete on zm.* to

-> ’zmuser’@localhost identified by ’zmpass’; Query OK, 0 rows affected (0.19 sec)

mysql> \q Bye ------------- [ 00:44:22, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # mysqladmin reload

собственно что мы имеем в mysql на этот момент:

mysql> show databases; +----------+ | Database | +----------+ | mysql | | zm | +----------+ 2 rows in set (0.01 sec)

mysql> use zm; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A

Database changed mysql> show tables; +----------------+ | Tables_in_zm | +----------------+ | Config | | Controls | | Events | | Filters | | Frames | | Groups | | MonitorPresets | | Monitors | | States | | Stats | | TriggersX10 | | Users | | ZonePresets | | Zones | +----------------+ 14 rows in set (0.00 sec)

mysql>

Стартовый скрипт ZoneMinder называется zm и, согласно документации не инсталлируется make install, поскольку не факт что будет работать где либо, кроме RedHat подобных дистрибутивов:

The ’zm’ script does not get installed automatically as it is not necessary for the operation of the ZoneMinder setup per se and is not necessarily likely to work correctly for distributions other than those from the RedHat or Fedora families.

Действительно:

----------------- [ 23:30:57, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # find /usr/local/zoneminder /srv/www/zoneminder* . -name zm ./scripts/zm ----------------- [ 23:31:52, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

Соответственно чтобы ZoneMinder поднимался при старте системы:

----------------- [ 23:31:52, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # cp ./scripts/zm /etc/init.d/ZoneMinder ‘./scripts/zm’ -> ‘/etc/init.d/ZoneMinder’ ----------------- [ 23:36:37, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # chmod 755 /etc/init.d/ZoneMinder

Теперь нужно его �довести до ума� чтоб работал под SuSE^{34}. У меня получился вот такой скрипт:

34 под Вашу систему возможно не потребуется изменений, если это RedHat, или же потребуются другие изменения

#!/bin/sh # description: Control ZoneMinder as a Service # chkconfig: 2345 99 99 # # Originally by ZoneMinder package. # Fixed for SuSE by Olli <olli@digger.org.ru> # ### BEGIN INIT INFO # Provides: ZoneMinder # Required-Start: $local_fs $network $mysql $apache2 # Should-Start: # Required-Stop: # Should-Stop: # Default-Start: 2 3 5 # Default-Stop: 0 1 6 # Description: ZoneMinder start control script . ### END INIT INFO

echo_success() { # just a stub. echo -n "success.." }

echo_failure() { # echo -n "failed.." }

prog=ZoneMinder ZM_PATH_BIN="/usr/local/zoneminder/bin" command="$ZM_PATH_BIN/zmpkg.pl"

start() { echo -n "Starting $prog: " $command start RETVAL=$? [ $RETVAL = 0 ] && echo_success [ $RETVAL != 0 ] && echo_failure echo [ $RETVAL = 0 ] && touch /var/lock/subsys/zm return $RETVAL } stop() { echo -n "Stopping $prog: " $command stop RETVAL=$? [ $RETVAL = 0 ] && echo_success [ $RETVAL != 0 ] && echo_failure echo [ $RETVAL = 0 ] && rm -f /var/lock/subsys/zm } status() { result=‘$command status‘ if [ "$result" = "running" ]; then echo "ZoneMinder is running" RETVAL=0 else echo "ZoneMinder is stopped" RETVAL=1 fi }

case "$1" in ’start’) start ;; ’stop’) stop ;; ’restart’) stop start ;; ’status’) status ;; *) echo "Usage: $0 { start | stop | restart | status }" RETVAL=1 ;; esac exit $RETVAL

Кстати, если у Вас возникли проблемы коннекта к mysql, то убедитесь, что все каталоги в пути к сокету имеют права на вход для всех:

----------------- [ 01:22:30, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ls /var/lib/mysql/ -ld drwxrwxr-x 2 mysql root 4096 2006-03-09 00:29 /var/lib/mysql/ ----------------- [ 01:22:40, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ls /var/lib/ -ld drwxr-xr-x 111 root root 4096 2006-03-08 04:35 /var/lib/ ----------------- [ 01:24:30, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ls /var/ -ld drwxr-xr-x 18 root root 4096 2006-01-28 04:57 /var/ ----------------- [ 01:24:34, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ls / -ld drwxr-xr-x 24 root root 4096 2006-02-13 09:04 / ----------------- [ 01:24:37, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

Далее, как и предлагается manual’ом:

----------------- [ 01:51:21, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # chkconfig --add ZoneMinder ZoneMinder 0:off 1:off 2:on 3:on 4:off 5:on 6:off ----------------- [ 01:51:51, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

В yast в SystemServices (Runlevel) ZoneMinder теперь присутствует.

В результате имеем:

----------------- [ 01:53:28, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # /etc/init.d/ZoneMinder status ZoneMinder is stopped ----------------- [ 01:53:44, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

В логах:

Mar 9 01:53:44 skylab zmpkg[11468]: INF [Command: status] Mar 9 01:53:44 skylab su: (to wwwrun) root on /dev/pts/29

и после:

----------------- [ 01:53:44, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # /etc/init.d/ZoneMinder start Starting ZoneMinder: success.. ----------------- [ 01:55:12, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

в логах:

Mar 9 01:53:44 skylab zmpkg[11468]: INF [Command: status] Mar 9 01:53:44 skylab su: (to wwwrun) root on /dev/pts/29 Mar 9 01:53:44 skylab last message repeated 2 times Mar 9 01:55:03 skylab zmpkg[11479]: INF [Command: start] Mar 9 01:55:03 skylab su: (to wwwrun) root on /dev/pts/29 Mar 9 01:55:04 skylab last message repeated 4 times Mar 9 01:55:05 skylab zmdc[11498]: INF [Server starting at 06/03/09 01:55:05] Mar 9 01:55:08 skylab su: (to wwwrun) root on /dev/pts/29 Mar 9 01:55:08 skylab zmdc[11522]: INF [’zmfilter.pl’ started at 06/03/09 01:55:08] Mar 9 01:55:08 skylab zmdc[11498]: INF [’zmfilter.pl’ starting at 06/03/09 01:55:08, pid = 11522] Mar 9 01:55:09 skylab su: (to wwwrun) root on /dev/pts/29 Mar 9 01:55:10 skylab zmdc[11528]: INF [’zmaudit.pl -c’ started at 06/03/09 01:55:10] Mar 9 01:55:10 skylab zmdc[11498]: INF [’zmaudit.pl -c’ starting at 06/03/09 01:55:10, pid = 11528] Mar 9 01:55:10 skylab zmfilter[11522]: INF [Scanning for events] Mar 9 01:55:10 skylab su: (to wwwrun) root on /dev/pts/29 Mar 9 01:55:11 skylab zmdc[11534]: INF [’zmwatch.pl’ started at 06/03/09 01:55:11] Mar 9 01:55:11 skylab zmdc[11498]: INF [’zmwatch.pl’ starting at 06/03/09 01:55:11, pid = 11534] Mar 9 01:55:11 skylab su: (to wwwrun) root on /dev/pts/29 Mar 9 01:55:12 skylab zmwatch[11534]: INF [Watchdog starting] Mar 9 01:55:12 skylab zmwatch[11534]: INF [Watchdog pausing for 30 seconds] Mar 9 01:55:12 skylab zmdc[11539]: INF [’zmupdate.pl -c’ started at 06/03/09 01:55:12] Mar 9 01:55:12 skylab zmdc[11498]: INF [’zmupdate.pl -c’ starting at 06/03/09 01:55:12, pid = 11539] Mar 9 01:55:13 skylab Update agent starting at 06/03/09 01:55:13

Чтож, мы практически закончили с инсталляцией. Осталось только добиться совместной работы с apache. Однако сразу после перезапуска apache у меня ZoneMinder не заработал - я использую AppArmor, оченно приятную утилиту от Novell, которая следит за тем, чтобы приложения не проявляли непредусмотренной активности. В данном случае apache2 было запрещено лезть в каталог, который не имеет ничего общего с настройками по умолчанию:

Mar 9 05:02:43 skylab kernel: SubDomain: REJECTING r access to /srv/www/zoneminder/zm.php (httpd2-prefork(30941) profile /usr/sbin/httpd2-prefork active /usr/sbin/httpd2-prefork)

Пришлось перевести AppArmor в режим обучения для apache2:

----------------- [ 05:32:05, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # complain /usr/sbin/httpd2-prefork Setting /usr/sbin/httpd2-prefork to complain mode. ----------------- [ 05:33:22, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

Как следствие - сразу же после этого ZoneMinder заработал - я увидел его консоль по адресу http://127.0.0.1/ , в текстовом режиме она выглядит примерно так:

ZM - Console

Thu 9th Mar, 5:50am ZoneMinder Console - Running - v1.22.0 Load: 0.46 / Disk: 40%

0 Monitors  Configured for low bandwidth  Options

Id Name Function Source Events Hour Day Week Month Archive Zones Order Mark

[ Refresh ] [ Add New Monitor ] [ Filters ] 0 0 0 0 0 0 0 [ Delete ]

7.2 Настройка ZoneMinder

Как и многие пользователи имеющие несколько лет опыта работы с компьютером за плечами я предпочитаю сначала попробовать добиться работы программы своими силами и только если не заработает - лезть в документацию - это очень часто экономит время.

7.2.1 Options

Первым делом идем в настройки (Options)^{35}

Tools

CAMBOZOLA

В закладке Tools имеется галочка для

ZM_OPT_CAMBOZOLA

, ее можно поставить, поскольку cambozola мы собрали (см. выше). Соответственно cambozola.jar и cambozola-server.jar копируем в /srv/www/zoneminder .

MPEG, FFMPEG

ZM_OPT_MPEG, ZM_PATH_FFMPEG

Тут выбираем имеющийся ffmpeg. Путь к ffmpeg - /usr/local/bin/ffmpeg^{36}:

----------------- [ 08:13:35, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ls /usr/local/bin/ffmpeg -l -rwxr-xr-x 1 root root 3142628 2006-01-20 23:01 /usr/local/bin/ffmpeg ----------------- [ 08:13:37, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

35 При этом следует помнить, что после изменений на закладке рекомендуется нажимать кнопку ’Save’, иначе изменения могут не сохраниться.

36 В вашей системе путь может быть другим.

NETPBM

ZM_OPT_NETPBM

У меня netpbm стоит:

# rpm -qa | grep netpbm netpbm-10.26.12-5 libnetpbm-1.0.0-636 ----------------- [ 08:14:44, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

так что тут я ставлю галочку.

7.2.2 Добавляем камеру

Очевидный выбор - добавить монитор. Вылезает меню с закладками. В секциях заполняем соответствующие поля:

General

Name: planet Source type: remote Function: Monitor Enabled: ставим галочку Maximum FPS: 30 Reference Image Blend: 7 (оставил по умолчанию) Про Triggers пишет что none avaliable. Видимо потому что не установлено соответствующих перловых модулей.

Source

Remote Host Name: 192.168.0.20 Remote Host Port: 80 Remote Host Path^{37}: /goform/capture Remote Image Colours: 24 bit color Capture Width (pixels): 640 Capture Height (pixels): 480 Orientation: normal Timestamp

37 этот путь получается по правой кнопке в мозилле ’Open image’

Тут особой нужды что либо менять нет. Строка

%%s - %y/%m/%d %H:%M:%S

меня вполне устроила. =)

Buffers Это тоже можно оставить по умолчанию.

Misc

Вот эта закладка явно неочевидная и для настроек потребует чтения документации. Оставляем пока по умолчанию.

По заполнению можно нажать на save. =)

7.2.3 Troubleshooting

После всего этого у меня система не заработала. А именно в логах я получил следующее^{38}:

----------------- [ 08:23:52, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # tail -n 5 /tmp/zmdc.log zmdc[11498].INF [’zmc -m 1’ starting at 06/03/09 08:23:45, pid = 3682] zmdc[11498].ERR [’zmc -m 1’ crashed, exit status 255] zmdc[3687].INF [’zmc -m 1’ started at 06/03/09 08:23:56] zmdc[11498].INF [’zmc -m 1’ starting at 06/03/09 08:23:56, pid = 3687] zmdc[11498].ERR [’zmc -m 1’ crashed, exit status 255] ----------------- [ 08:23:56, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ----------------- [ 08:25:54, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # tail -n 5 /tmp/zmwatch.log zmwatch[11534].INF [Restarting capture daemon for planet, shared memory not valid] zmwatch[11534].INF [’zmc -m 1’ starting at 06/03/09 08:25:41, pid = 3737] at /usr/local/zoneminder/bin/zmwatch.pl line 118 zmwatch[11534].ERR [Can’t get shared memory id ’7a6d2001’, 1: No such file or directory] zmwatch[11534].INF [Restarting capture daemon for planet, shared memory not valid] zmwatch[11534].INF [’zmc -m 1’ started at 06/03/09 08:25:52] at /usr/local/zoneminder/bin/zmwatch.pl line 118 ----------------- [ 08:26:02, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

В результате в Options->Debug я выставил флаг

ZM_EXTRA_DEBUG и далее в

38 Путь по умолчанию к логам в zoneminder абсолютный, шаблон /tmp/[scriptname].log

ZM_EXTRA_DEBUG_TARGET

указал �_zmc�, выставив

ZM_EXTRA_DEBUG_LEVEL, для

начала, в 1. После чего требуется перезагрузить ZoneeMinder чтобы изменения вступили в силу.

Результат меня не впечатлил - видимо я ошибся в названии соответствующего компонента

ZM_EXTRA_DEBUG_TARGET

(откуда брать список компонентов в online help не написано).

В результате я оставил

ZM_EXTRA_DEBUG_TARGET пустым чтобы отладка применилась ко всем

компонентам и еще раз перегрузил zoneminder.

Приемлемого уровня детализации сообщений я добился только при

ZM_EXTRA_DEBUG_LEVEL

равном 5-ти.

zmc_m1[12651].DB1-zm_monitor.cpp/156 [shm.size=36864708] zmc_m1[12651].ERR-zm_monitor.cpp/160 [Can’t shmget, probably not enough shared memory space free: Invalid argument]

Этого достаточно для определения корня проблем:

----------------- [ 14:36:10, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # cat /proc/sys/kernel/shmall 2097152 ----------------- [ 14:36:59, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # cat /proc/sys/kernel/shmmax 33554432 ----------------- [ 14:37:11, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # cat /proc/sys/kernel/shmmni 4096 ----------------- [ 14:37:24, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] # ipcs -ml ------ Shared Memory Limits -------- max number of segments = 4096 max seg size (kbytes) = 32768 max total shared memory (pages) = 2097152 min seg size (bytes) = 1

----------------- [ 14:37:33, root@skylab, /usr/src/2Install/CURRENT/ZoneMinder-1.22.0 ] #

Решение выглядит так:

----------------- [ 14:47:13, root@skylab, /tmp ] # echo 50331648 > /proc/sys/kernel/shmmax ----------------- [ 14:47:28, root@skylab, /tmp ] # cat /proc/sys/kernel/shmmax 50331648 ----------------- [ 14:47:30, root@skylab, /tmp ] #

это увеличит на 16 мегабайт размер сегмента shared memory^{39}.

7.3 It works.

Для проверки всего выше проделанного по окончании troubleshooting’а запускаем ZoneMinder..

Уря. Заработало - во второй колонке (Name) данного монитора теперь линк содержащий картинку - ткнувшись в �planet� я получил соответствующее изображение, согласно мануалу.=) Изменив Function с Monitor на Motion detect я получил соответствующие events, а поставив Mocord - получил запись соответствующих событий с возможностью последующего просмотра^{40}:

ZM - Console

Thu 9th Mar, 3:42pm ZoneMinder Console - Running - v1.22.0 Load: 4.55/Disk: 87%

1 Monitor  Configured for low bandwidth  Options

Id Name Function Source Events Hour Day Week Month Archive Zones Order Mark

39 Чтобы это работало всегда - соответствующие изменения должны быть внесены либо в системные скрипты конфигурирующие sysctl при загрузке системы, либо в скрипт стартующий ZoneMinder (в моем случае - /etc/init.d/ZoneMinder)

40 текстовый скриншот немного подредактирован^{41} чтобы влезал в документ, для сохранения адекватности картинки изменен layot некоторых элементов с сохранением смысла.

1. planet Mocord 192.168.0.20 11  11 11 11 11  0  1  [ ]
11  11 11 11 11  0  1

[Refresh] [Add New Monitor] [Filters] [ Delete ]

Кстати, просмотр событий отвязан от запуска сервера. То есть уже после того как я остановил ZoneMinder я зашел на web-interface к нему и с удобством просмотрел информацию по зарегистрированным событиям.

7.3.1 Нагрузка

В момент работы ZoneMinder монитор загрузки камня показывал 100 процентов. Не могу сказать, что интерфейс очень уж сильно тормозил, но нагрузка для моей машинки и так загруженной штатными задачами не менее чем на треть была весьма приличной. Так что, как минимум, требуется дополнительная оптимизация - как на этапе сборки (под cpu), так и на этапе конфигурирования.

7.4 Комментарии к ZoneMinder

Что хотелось бы отметить по данному продукту:

• Инсталяция в �default settings� достаточно сильно грузит компьютер, поэтому, во первых весьма желательна конфигурационная оптимизация (что не входит в задачи поставленные автором при создании этой статьи), а во вторых по любому гораздо лучше, когда у Вас стоит выделенная на это дело машинка и все свои ресурсы тратит на обработку video.

• Сам по себе ZoneMinder после установки удобен, интерфейс в первом приближении интуитивно понятен - мне не потребовалось дочитать мануал до конца, чтобы заставить его работать. Огромное спасибо автору за этот продукт. Заслуживает всяческих похвал.

• ZoneMinder является компромиссным решением - благодаря связке C-кода и скриптовых языков. Возможно это не самое быстрое из возможных решений, но во всяком случае достаточно гибкое

8 Резюме

8.0.1 Качество изображения

Вполне приемлемое, особенно если говорить о snapshort’ах. В любом случае, достаточное для опознания человека.^{42}. Кстати при дневном освещении изображение получается гораздо лучше. В особенности по цветопередаче.

Документация

Документация оставляет желать лучшего. Увы. Впрочем, �поднятие� устройства в минимальном режиме (�чтоб работало�) у меня заняло не более 15 минут, включая установку. Без чтения документации. :)

8.1 Плюсы и минусы

8.1.1 Минусы

• SSDP при старте после сброса на factory defaults не отключается. Хотя и перестает рассылаться после того как камера отконфигурирована.

• Не умеет ночной режим (вообще).

• Паршивое security - после установки пользователей и пароля администратору изображение таки доступно, пусть и в режиме фотографии, любому желающему - при нажатии reload по �base url� (по умолчанию - http://192.168.0.20/) картинка обновляется без запроса пароля.^{43}

• Невнятное описание администрирования в документации.

• Невнятное описание trigger в интерфейсе.^{44}

• smtp trigger работает только по событию с внешнего датчика.

• глюки после настроек пользователя/trigger с ява режимом просмотра.

• нет отладочной информации об ошибках в процессе работы^{45}

• http port задается только в пределах нижних портов.

• Производитель игнорирует, что его устройство поддерживается linux. Глупо.

42 тестировалось на расстояниях до 3м.

43 в нормальной, на мой взгляд, ситуации устройство не должно отдавать изображения без пароля \underline{вообще.}

44 Замена в соответствующих местах слова ’trigger’ на пару слов ’software trigger’ и ’hardware trigger’ избавила бы от нужды читать документацию на trigger. =)

45 устройство не дает пользователю никакой отладочной информации о происходящем.

• Дата и время/часовой пояс сбрасываются даже при �мягкой� (�software�) перезагрузке.

• Большие размеры.^{46}

Вообще с документацией у Planet плохо, что впрочем не мешает его использовать грамотному человеку. ;)

8.1.2 Плюсы

• Приемлемое по качеству изображение. ^{47}

• Возможность фокусировки объективом.

• Боле-менее рабочий ява апплет - в моей SuSE 10.0 работал корректно и с передачей потока видео и звука^{48}.

• Наличие возможности повесить событие на порт и генерировать событие на порт^{49}.

• Удобно/просто синхронизируется время с компьютером, с которого открыта web панель управления камерой.

• Гибкие настройки по освещению и юстировке изображения.

• Позволяет 30fps на 640x480.

• Возможность поворота изображения.

• Автоматизация возможна и работает (см. раздел с описанием установки ZoneMinder).

В конечном итоге я выбрал более компактное аналоговое решение с платой видеоввода в ПК. Тем не менее, как показывает данная статья - камера вполне работоспособна, возможно ее применение в linux, в том числе полная автоматизация (и это даже без снятия потока motion jpeg) с реализацией Motion Detection.

46 Если плату тупо порезать пополам сделав соединения половинок на гибком шлейфе, то можно добиться, минимум, вдвое меньших размеров.

47 При освещении коридора всего одной лампочкой камера давала узнаваемое изображение.

48 по крайней мере в режиме �установки по умолчанию� все OK. ;)

49 правда описано в документации это недостаточно подробно

9 Замечание производителям.

Открытые технологии и стандарты - это будущее IT. Поэтому, если Вы хотите чтобы Ваши устройства приобрели большую популярность на рынке - не забывайте о поддержке Ваших устройств открытыми операционными системами, в частности, Linux.

Если Вы хотите HOWTO для Linux для Вашего устройства

Если Вы заинтересованы в продвижении вашей продукции на рынке за счет поддержки открытыми ОС (Linux, BSD and others), то Вы заинтересованы в хорошей документации по установке Ваших продуктов на этих операционных системах.

В мире Linux наличие howto по настойке устройства весьма ценно. Данное HOWTO создавалось в процессе выбора решения для видеонаблюдения. В процессе работы я определился с тем, что мне нужно и как это должно работать.

Если Вам понравилось это HOWTO и Вы заинтересованы в создании аналогичного HOWTO для Вашего устройства - Вы можете связаться со мной по email (olli@digger.org.ru) и обговорить условия, на которых мне было бы интересно заняться этой работой. Пожалуйста используйте subject со словами ’HOWTO request’ чтобы я случайно не удалил Ваше письмо с прочим спамом. От себя отмечу, что в любом случае, - документация, которую я буду создавать для Вас должна будет распространяться под лицензией GNU FDL, независимо от того договоримся ли мы о какой либо оплате или же Вы заинтересуете меня возможностью получить опыт при работе над интересным проектом.

Еще раз хочу выразить признательность компании BelSoft, Москва, а особенно Владимиру Витальевичу Собчикову, без которых этого HOWTO бы не было. Признателен им за проявленное терпение, поскольку в силу малого количества свободного времени я, потратив, на эту работу суммарно пару дней, продержал камеру у себя почти месяц.

10 GNU Free Documentation License

Version 1.2, November 2002 Copyright \begin{matrix}c \\ ◯ \end{matrix}2000,2001,2002 Free Software Foundation, Inc.

51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA

Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed.

Preamble

The purpose of this License is to make a manual, textbook, or other functional and useful document "free"in the sense of freedom: to assure everyone the effective freedom to copy and redistribute it, with or without modifying it, either commercially or noncommercially. Secondarily, this License preserves for the author and publisher a way to get credit for their work, while not being considered responsible for modifications made by others.

This License is a kind of "copyleft which means that derivative works of the document must themselves be free in the same sense. It complements the GNU General Public License, which is a copyleft license designed for free software.

We have designed this License in order to use it for manuals for free software, because free software needs free documentation: a free program should come with manuals providing the same freedoms that the software does. But this License is not limited to software manuals; it can be used for any textual work, regardless of subject matter or whether it is published as a printed book. We recommend this License principally for works whose purpose is instruction or reference.

1. APPLICABILITY AND DEFINITIONS

This License applies to any manual or other work, in any medium, that contains a notice placed by the copyright holder saying it can be distributed under the terms of this License. Such a notice grants a world-wide, royalty-free license, unlimited in duration, to use that work under the conditions stated herein. The "Document", below, refers to any such manual or work. Any member of the public is a licensee, and is addressed as "you". You accept the license if you copy, modify or distribute the work in a way requiring permission under copyright law.

A "Modified Version" of the Document means any work containing the Document or a portion of it, either copied verbatim, or with modifications and/or translated into another language.

A "Secondary Section" is a named appendix or a front-matter section of the Document that deals exclusively with the relationship of the publishers or authors of the Document to the Document’s overall subject (or to related matters) and contains nothing that could fall directly within that overall subject. (Thus, if the Document is in part a textbook of mathematics, a Secondary Section may not explain any mathematics.) The relationship could be a matter of historical connection with the subject or with related matters, or of legal, commercial, philosophical, ethical or political position regarding them.

The "Invariant Sections" are certain Secondary Sections whose titles are designated, as being those of Invariant Sections, in the notice that says that the Document is released under this License. If a section does not fit the above definition of Secondary then it is not allowed to be designated as Invariant. The Document may contain zero Invariant Sections. If the Document does not identify any Invariant Sections then there are none.

The "Cover Texts" are certain short passages of text that are listed, as Front-Cover Texts or Back-Cover Texts, in the notice that says that the Document is released under this License. A Front-Cover Text may be at most 5 words, and a Back-Cover Text may be at most 25 words.

A "Transparent" copy of the Document means a machine-readable copy, represented in a format whose specification is available to the general public, that is suitable for revising the document straightforwardly with generic text editors or (for images composed of pixels) generic paint programs or (for drawings) some widely available drawing editor, and that is suitable for input to text formatters or for automatic translation to a variety of formats suitable for input to text formatters. A copy made in an otherwise Transparent file format whose markup, or absence of markup, has been arranged to thwart or discourage subsequent modification by readers is not Transparent. An image format is not Transparent if used for any substantial amount of text. A copy that is not "Transparent"is called "Opaque".

Examples of suitable formats for Transparent copies include plain ASCII without markup, Texinfo input format, LaTeX input format, SGML or XML using a publicly available DTD, and standard-conforming simple HTML, PostScript or PDF designed for human modification. Examples of transparent image formats include PNG, XCF and JPG. Opaque formats include proprietary formats that can be read and edited only by proprietary word processors, SGML or XML for which the DTD and/or processing tools are not generally available, and the machine-generated HTML, PostScript or PDF produced by some word processors for output purposes only.

The "Title Page" means, for a printed book, the title page itself, plus such following pages as are needed to hold, legibly, the material this License requires to appear in the title page. For works in formats which do not have any title page as such, "Title Page"means the text near the most prominent appearance of the work’s title, preceding the beginning of the body of the text.

A section "Entitled XYZ" means a named subunit of the Document whose title either is precisely XYZ or contains XYZ in parentheses following text that translates XYZ in another language. (Here XYZ stands for a specific section name mentioned below, such as "Acknowledgements", "Dedications", "Endorsements", or "History".) To "Preserve the Title" of such a section when you modify the Document means that it remains a section "Entitled XYZ"according to this definition.

The Document may include Warranty Disclaimers next to the notice which states that this License applies to the Document. These Warranty Disclaimers are considered to be included by reference in this License, but only as regards disclaiming warranties: any other implication that these Warranty Disclaimers may have is void and has no effect on the meaning of this License.

2. VERBATIM COPYING

You may copy and distribute the Document in any medium, either commercially or noncommercially, provided that this License, the copyright notices, and the license notice saying this License applies to the Document are reproduced in all copies, and that you add no other conditions whatsoever to those of this License. You may not use technical measures to obstruct or control the reading or further copying of the copies you make or distribute. However, you may accept compensation in exchange for copies. If you distribute a large enough number of copies you must also follow the conditions in section 3.

You may also lend copies, under the same conditions stated above, and you may publicly display copies.

3. COPYING IN QUANTITY

If you publish printed copies (or copies in media that commonly have printed covers) of the Document, numbering more than 100, and the Document’s license notice requires Cover Texts, you must enclose the copies in covers that carry, clearly and legibly, all these Cover Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on the back cover. Both covers must also clearly and legibly identify you as the publisher of these copies. The front cover must present the full title with all words of the title equally prominent and visible. You may add other material on the covers in addition. Copying with changes limited to the covers, as long as they preserve the title of the Document and satisfy these conditions, can be treated as verbatim copying in other respects.

If the required texts for either cover are too voluminous to fit legibly, you should put the first ones listed (as many as fit reasonably) on the actual cover, and continue the rest onto adjacent pages.

If you publish or distribute Opaque copies of the Document numbering more than 100, you must either include a machine-readable Transparent copy along with each Opaque copy, or state in or with each Opaque copy a computer-network location from which the general network-using public has access to download using public-standard network protocols a complete Transparent copy of the Document, free of added material. If you use the latter option, you must take reasonably prudent steps, when you begin distribution of Opaque copies in quantity, to ensure that this Transparent copy will remain thus accessible at the stated location until at least one year after the last time you distribute an Opaque copy (directly or through your agents or retailers) of that edition to the public.

It is requested, but not required, that you contact the authors of the Document well before redistributing any large number of copies, to give them a chance to provide you with an updated version of the Document.

4. MODIFICATIONS

You may copy and distribute a Modified Version of the Document under the conditions of sections 2 and 3 above, provided that you release the Modified Version under precisely this License, with the Modified Version filling the role of the Document, thus licensing distribution and modification of the Modified Version to whoever possesses a copy of it. In addition, you must do these things in the Modified Version:

A. Use in the Title Page (and on the covers, if any) a title distinct from that of the Document, and from those of previous versions (which should, if there were any, be listed in the History section of the Document). You may use the same title as a previous version if the original publisher of that version gives permission.

B. List on the Title Page, as authors, one or more persons or entities responsible for authorship of the modifications in the Modified Version, together with at least five of the principal authors of the Document (all of its principal authors, if it has fewer than five), unless they release you from this requirement.

C. State on the Title page the name of the publisher of the Modified Version, as the publisher.

D. Preserve all the copyright notices of the Document.

E. Add an appropriate copyright notice for your modifications adjacent to the other copyright notices.

F. Include, immediately after the copyright notices, a license notice giving the public permission to use the Modified Version under the terms of this License, in the form shown in the Addendum below.

G. Preserve in that license notice the full lists of Invariant Sections and required Cover Texts given in the Document’s license notice.

H. Include an unaltered copy of this License.

I. Preserve the section Entitled "History Preserve its Title, and add to it an item stating at least the title, year, new authors, and publisher of the Modified Version as given on the Title Page. If there is no section Entitled "History"in the Document, create one stating the title, year, authors, and publisher of the Document as given on its Title Page, then add an item describing the Modified Version as stated in the previous sentence.

J. Preserve the network location, if any, given in the Document for public access to a Transparent copy of the Document, and likewise the network locations given in the Document for previous versions it was based on. These may be placed in the "History"section. You may omit a network location for a work that was published at least four years before the Document itself, or if the original publisher of the version it refers to gives permission.

K. For any section Entitled "Acknowledgements"or "Dedications Preserve the Title of the section, and preserve in the section all the substance and tone of each of the contributor acknowledgements and/or dedications given therein.

L. Preserve all the Invariant Sections of the Document, unaltered in their text and in their titles. Section numbers or the equivalent are not considered part of the section titles.

M. Delete any section Entitled "Endorsements". Such a section may not be included in the Modified Version.

N. Do not retitle any existing section to be Entitled "Endorsements"or to conflict in title with any Invariant Section.

O. Preserve any Warranty Disclaimers.

If the Modified Version includes new front-matter sections or appendices that qualify as Secondary Sections and contain no material copied from the Document, you may at your option designate some or all of these sections as invariant. To do this, add their titles to the list of Invariant Sections in the Modified Version’s license notice. These titles must be distinct from any other section titles.

You may add a section Entitled "Endorsements provided it contains nothing but endorsements of your Modified Version by various parties–for example, statements of peer review or that the text has been approved by an organization as the authoritative definition of a standard.

You may add a passage of up to five words as a Front-Cover Text, and a passage of up to 25 words as a Back-Cover Text, to the end of the list of Cover Texts in the Modified Version. Only one passage of Front-Cover Text and one of Back-Cover Text may be added by (or through arrangements made by) any one entity. If the Document already includes a cover text for the same cover, previously added by you or by arrangement made by the same entity you are acting on behalf of, you may not add another; but you may replace the old one, on explicit permission from the previous publisher that added the old one.

The author(s) and publisher(s) of the Document do not by this License give permission to use their names for publicity for or to assert or imply endorsement of any Modified Version.

5. COMBINING DOCUMENTS

You may combine the Document with other documents released under this License, under the terms defined in section 4 above for modified versions, provided that you include in the combination all of the Invariant Sections of all of the original documents, unmodified, and list them all as Invariant Sections of your combined work in its license notice, and that you preserve all their Warranty Disclaimers.

The combined work need only contain one copy of this License, and multiple identical Invariant Sections may be replaced with a single copy. If there are multiple Invariant Sections with the same name but different contents, make the title of each such section unique by adding at the end of it, in parentheses, the name of the original author or publisher of that section if known, or else a unique number. Make the same adjustment to the section titles in the list of Invariant Sections in the license notice of the combined work.

In the combination, you must combine any sections Entitled "History"in the various original documents, forming one section Entitled "History"; likewise combine any sections Entitled "Acknowledgements and any sections Entitled "Dedications". You must delete all sections Entitled "Endorsements".

6. COLLECTIONS OF DOCUMENTS

You may make a collection consisting of the Document and other documents released under this License, and replace the individual copies of this License in the various documents with a single copy that is included in the collection, provided that you follow the rules of this License for verbatim copying of each of the documents in all other respects.

You may extract a single document from such a collection, and distribute it individually under this License, provided you insert a copy of this License into the extracted document, and follow this License in all other respects regarding verbatim copying of that document.

7. AGGREGATION WITH INDEPENDENT WORKS

A compilation of the Document or its derivatives with other separate and independent documents or works, in or on a volume of a storage or distribution medium, is called an "aggregate"if the copyright resulting from the compilation is not used to limit the legal rights of the compilation’s users beyond what the individual works permit. When the Document is included in an aggregate, this License does not apply to the other works in the aggregate which are not themselves derivative works of the Document.

If the Cover Text requirement of section 3 is applicable to these copies of the Document, then if the Document is less than one half of the entire aggregate, the Document’s Cover Texts may be placed on covers that bracket the Document within the aggregate, or the electronic equivalent of covers if the Document is in electronic form. Otherwise they must appear on printed covers that bracket the whole aggregate.

8. TRANSLATION

Translation is considered a kind of modification, so you may distribute translations of the Document under the terms of section 4. Replacing Invariant Sections with translations requires special permission from their copyright holders, but you may include translations of some or all Invariant Sections in addition to the original versions of these Invariant Sections. You may include a translation of this License, and all the license notices in the Document, and any Warranty Disclaimers, provided that you also include the original English version of this License and the original versions of those notices and disclaimers. In case of a disagreement between the translation and the original version of this License or a notice or disclaimer, the original version will prevail.

If a section in the Document is Entitled "Acknowledgements "Dedications or "History the requirement (section 4) to Preserve its Title (section 1) will typically require changing the actual title.

9. TERMINATION

You may not copy, modify, sublicense, or distribute the Document except as expressly provided for under this License. Any other attempt to copy, modify, sublicense or distribute the Document is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.

10. FUTURE REVISIONS OF THIS LICENSE

The Free Software Foundation may publish new, revised versions of the GNU Free Documentation License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. See http://www.gnu.org/copyleft/.

Each version of the License is given a distinguishing version number. If the Document specifies that a particular numbered version of this License "or any later version"applies to it, you have the option of following the terms and conditions either of that specified version or of any later version that has been published (not as a draft) by the Free Software Foundation. If the Document does not specify a version number of this License, you may choose any version ever published (not as a draft) by the Free Software Foundation.

ADDENDUM: How to use this License for your documents

To use this License in a document you have written, include a copy of the License in the document and put the following copyright and license notices just after the title page:

Copyright \begin{matrix}c \\ ◯ \end{matrix}YEAR YOUR NAME. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".

If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, replace the "with...Texts."line with this:

with the Invariant Sections being LIST THEIR TITLES, with the Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.

If you have Invariant Sections without Cover Texts, or some other combination of the three, merge those two alternatives to suit the situation.

If your document contains nontrivial examples of program code, we recommend releasing these examples in parallel under your choice of free software license, such as the GNU General Public License, to permit their use in free software.