Навчимося звідусіль отримувати доступ до зображення з веб-камери свого Raspberry Pi, розміщуючи його на сайті. Це дозволить підключатися до RPi з унікальним доменним ім'ям і спостерігати за своїм будинком або домашніми тваринами, коли знаходимося далеко.
Що необхідно для заняття
1. Локальна мережа
2. Mac або ПК
3. Модуль камери RPi, або сумісна веб-камера
4. RPi з запущеною ОС Raspbian "Jessie"
5. Доменне Ім'я
6. Маршрутизатор, здатний підтримувати DynDNS, noip чи іншу динамічну службу DNS; або програмне забезпечення на основі динамічного DNS-клієнта
7. Веб-сервер, запущений на RPi
8. Кабель HDMI (*опція)
9. Клавіатура (*опція)
10. Миша (*опція)
11. Монітор з входом HDMI (*опція)
*Якщо RPi налаштований як машина «без голови», то не потрібні монітор, клавіатура і миша - тільки інший комп'ютер, який буде використовуватися для віддаленого доступу до RPi через SSH за допомогою мережі.
Завантаження
Покрокове керівництво (стиснута версія - для просунутих користувачів)
lsusb
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libjpeg8-dev imagemagick libv4l-dev
sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
sudo apt-get install subversion
cd ~
svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/ mjpg-streamer
cd mjpg-streamer
make mjpg_streamer input_file.so input_uvc.so output_http.so
sudo cp mjpg_streamer /usr/local/bin
sudo cp output_http.so input_file.so input_uvc.so /usr/local/lib/
sudo cp -R www /usr/local/www
sudo nano ~/.bashrc
export LD_LIBRARY_PATH=/usr/local/lib/
source ~/.bashrc
/usr/local/bin/mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg"-o "output_http.so -w /usr/local/www"
sudo nano /usr/sbin/livestream.sh
#!/bin/bash
/usr/local/bin/mjpg_streamer -i "/usr/local/lib/input_uvc.so" -o "/usr/local/lib/output_http.so -w /var/www/html/stream -c username:password"
sudo chmod 755 /etc/init.d/livestream.sh
sudo update-rc.d livestream.sh defaults
Короткий план
1. Оновити RPi і встановити програмне забезпечення залежностей
2. Завантажити вихідний код MJPG-Streamer
3. Компілювати вихідний код
4. Захопити зображення з веб-камери і розмістити його на веб-сторінці
5. Налаштувати MJPG- Streamer для запуску при завантаженні
Два способи: модуль камери або USB веб-камера
Можемо використовувати модуль камери RPi, або будь-який іншу сумісну USB веб-камеру. Метод з веб-камерою USB простіший і є можливість вибору якісної камери, але наведемо інструкції для обох методів. У керівництві, буде використана веб-камера USB. Інструкції щодо модуля камери RPi знайдете у додатку.
Покрокове керівництво (детальна інструкція)
Перевірка, чи визначає RPi вебкамеру
Підключіть USB веб-камеру і виконайте команду:
lsusb
Знайдіть запис, що відноситься до вашої веб-камери. Це буде хорошою ознакою того, що камера розпізнана.
Оновлення RPi і встановлення залежностей
По-перше, оновіть RPi, а потім встановіть деякі з залежності MJPG-Streamer:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libjpeg8-dev imagemagick libv4l-dev
Треба зробити налаштування: файл videodev.h замінити на videodev2.h, але ця заміна має бути зроблена вручну. Щоб зробити її, просто створіть символічне посилання:
sudo ln -s /usr/include/linux/videodev2.h /usr/include/linux/videodev.h
Завантаженя та компіляція MJPG-Streamer
На жаль, MJPG-Streamer не доступний через apt-get, таким чином, ми повинні cкомпілювати його з вихідного коду. Це трохи складніше, ніж налаштування веб-камери з використанням Motion, але MJPG-Streamer менш ресурсоємний, тому додаткова складність встановлення варта того.
Є кілька різних способів установки MJPG-Streamer. Найпростіший - з допомогою subversion, про що розповідається тут. Якщо хочете дізнатися про деякі інші методи, то перегляньте додаток внизу поста.
Завантаження за допомогою Subversion (SVN)
Встановіть subversion (якщо необхідно):
sudo apt-get install subversion
Потім завантажте копію вихідного коду MJPG-Streamer в домашню папку і перейдіть в каталог mjpg-streamer, коли завершиться завантаження:
cd ~
svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer/ mjpg-streamer
cd mjpg-streamer
В MJPG-Streamer входить багато плагінів, але ми скомпілюємо лише три. Якщо плануєте використовувати тільки веб-камеру USB, то можете змінити команду нижче, щоб задовольнити свої потреби. Просто викиньте ті елементи, які вам не потрібні.
• input_uvc.so (для USB веб-камери): копіює JPG-файли з одного входу (в даному випадку, з веб-камери) до одного або більше вихідних модулів. Це добре для потокової передачі великих зображень з більш високою частотою кадрів і при меншому завантаженні процесора.
• input_file.so (для модуля камери): аналогічно описаному вище, але копіює їх з каталогу.
• output_http.so: потокова передача файлів на веб-сервер
make mjpg_streamer input_file.so input_uvc.so output_http.so
Крім того, запустивши make, ви можете скомпілювати все, що прийшло з MJPG-Streamer. Тут вибране для встановлення тільки те, що було необхідно, щоб заощадити об’єм сховища і ресурси.
Копіюваня MJPG-Streamer в інше місце
Можете запустити MJPG-Streamer після компіляції прямо з папки ( ./mjpg_streamer), але було б краще перемістити його на постійне місце.
Виконайте наступні команди, щоб скопіювати MJPG-Streamer в більш глобально доступний каталог:
sudo cp mjpg_streamer /usr/local/bin
sudo cp output_http.so input_file.so input_uvc.so /usr/local/lib/
sudo cp -R www /usr/local/www
/usr/local/ є загальним місцем для сторонніх предметів або речей, доданих в систему адміністратором. Але ви могли б скопіювати його туди, куди вам подобається, або просто залишити там, де він є. Після цього в покроковому керівництві треба просто змінити шляхи на інші.
Експортування шляхів
Якщо зараз спробувати запустити mjpg_streamer, то, ймовірно, повернеться повідомлення про помилку при пошуку шляхів (error about search paths). Це тому, що прямо зараз система не знає, де знайти файли. Це легко виправити. Просто додайте наступний рядок в ~/.bashrc (якщо ви викликали команди вище, щоб скопіювати файли в /usr/local/). Буде зроблена постійна його заміна, так що не треба буде робити це щоразу, коли входите:
export LD_LIBRARY_PATH=/usr/local/lib/
Можете вийти і зайти знову, але простіше виконати команду source, щоб застосувати зміни (це має той же ефект, що і перезавантаження):
source ~/.bashrc
Тепер, можете просто викликати mjpg_streamer, незалежно від того, в якій директорії знаходитесь. Ми майже готові розпочати зйомки.
Використання input_uvc.so для захоплення зображень
Запустіть mjpg_streamer за допомогою команди:
/usr/local/bin/mjpg_streamer -i "/usr/local/lib/input_uvc.so" -o "/usr/local/lib/output_http.so -w /usr/local/www"
Ця команда має такі параметри:
• -i: використовує input_uvc.so (USB веб-камера) як вхід
• -o: output_http.so для виходу (відправка зображення на веб-сервер)
• -w: каталог, який має HTML, CSS, JS і файли: /usr/local/www
Ви можете скасувати потік, натиснувши Ctrl + C. Якщо хочете поекспериментувати з деякими іншими параметрами, то деякі з них перераховані нижче:
• -b: запуск у фоновому режимі
• -p: встановити інший порт за замовчуванням, а не порт 8080 за замовчуванням
• -c: запитує ім'я користувача:пароль
• -у YUYV: дозволяє формат YUYV й відключає режим MJPEG
• -f: частота кадрів (у секундах)
Якщо використали параметр -b, то будете отримувати підказку на екрані. Отже, як зупинити запущений потік? Після команди запуску, ви побачите рядок, типу:
forked to background (4979)
Якщо хочете зупинити потік, просто запустіть:
kill 4979
що просто вбиває процес ID (PID) MJPG-Streamer.
Перегляд потокового відео з веб-камери через браузер (при підключенні до локальної мережі)
Навіть, якщо вже маєте веб-сервер, то можете, як і раніше, працювати з ним без проблем, тому що потік доступний на іншому порту (за замовчуванням): 8080. Тому, коли заходите на нього з браузера, просто додайте :8080 після IP-адреси:
• локально: http://localhost:8080
• з іншого пристрою в мережі: http://<ip_адреса_raspberry_pi>:8080
Доступ до RPi через Інтернет
Перегляд зображення з веб-камери при підключенні до локальної мережі - це здорово, але покажемо, як отримати доступ до веб-камери з будь-якого місця, ввівши URL типу: myDomain.com:8080. Цей потік може бути захищений паролем, але це насправді не дуже безпечно, тому будьте обережні, якщо зробите веб-камеру доступною онлайн.
Попередні умови
• Перенаправлення порта 8080 на ваш RPi
• Включення служби динамічного DNS на маршрутизаторі
• (опціонально) Налаштування веб-сервера з каталогом, захищеним паролем
Після того, як описане вище завершено, зможемо отримати доступ до відео потоку зі своєї веб-камери з будь-якого браузера, перейшовши на http://myDomainName.org:8080. Але ще немає пароля! Будь-хто в Інтернеті зможе побачити вашу веб-камеру.
Ми можемо задати, щоб MJPG-Streamer використовував пароль, за допомогою параметра -c. Даний пароль не надто безпечний (це тільки кодування base 64), але він може бути першою лінією оборони. Дехто зможе легко перехопити і розшифрувати пароль, але якщо ви знаходитесь в довіреній мережі, то це не така вже й проблема.
Команда буде виглядати наступним чином:
/usr/local/bin/mjpg_streamer -i "/usr/local/lib/input_uvc.so" -o "/usr/local/lib/output_http.so -w /usr/local/www -c username:password"
Кращий спосіб добитися безпеки будь-якого інтернет-ресурсу - використання моделі пошарової оборони. Тому, перш ніж захочете винести це в Інтернет, можете захиститися за допомогою інших інструментів.
Вбудовування відеопотоку на веб-сторінку
Для простоти, зробимо сторінку в тому ж каталозі, в якій знаходяться HTML-файли (/usr/local/www/ для цього заняття). Це полегшує перевірку, що сторінка працює. Після того, як переконаєтесь, що все працює, сторінку можна перемістити будь-куди, але треба буде просто налаштувати шляхи. Введіть наступний HTML-код, створивши файл mycam.html, і сторінка буде готова до роботи:
<html>
<head><title>My Live-stream</title></head>
<body>
<center><h1>My Camera</h1></center>
<center>
<img src="/?action=stream" />
</center>
<body>
</html>
Тепер, перейдіть на сторінку, щоб побачити її:
• http://192.168.1.100:8080/mycam.html (в локальній мережі)
• http://myDomainName.org:8080/mycam.html (через Інтернет
де 192.168.1.100 треба замінити на ІР-адресу RPi.
Запуск MJPG-Streamer як демона (фонову службу)
Дотепер ми запускали MJPG-Streamer у міру потреби, запускаючи команду з нашими параметрами. Якщо хочете зробити це більш постійним і запускати відео потік при завантаженні RPi, то повинні задати, щоб це виконувалось.
Нижче є два сценарії: дуже простий, який виконує команди, і просунутий сценарій, який дозволить вам використовувати команду служби, щоб контролювати його:
sudo service livestream.sh start
sudo service livestream.sh stop
sudo service livestream.sh restart
Простий сценарій
Дуже простий сценарій нижче:
sudo nano /etc/init.d/livestream.sh
#!/bin/bash
/usr/local/bin/mjpg_streamer -i "/usr/local/lib/input_uvc.so" -o "/usr/local/lib/output_http.so -w /usr/local/www -c username:password"
Збережіть сценарій. Зробіть його виконуваним:
sudo chmod 755 /usr/sbin/livestream.sh
Наступна команда зробить, щоб він виконувався під час завантаження:
sudo update-rc.d livestream.sh defaults
Розширений сценарій
Нижче наводиться сценарій, який буде завантажувати MJPG-Streamer при запуску RPi і дозволить використовувати команду служби:
#!/bin/sh
# /etc/init.d/livestream.sh
### BEGIN INIT INFO
# Provides: livestream.sh
# Required-Start: $network
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: mjpg_streamer for webcam
# Description: Streams /dev/video0 to http://IP/?action=stream
### END INIT INFO
f_message(){
echo "[+] $1"
}
# Carry out specific functions when asked to by the system
case "$1" in
start)
f_message "Starting mjpg_streamer"
/usr/local/bin/mjpg_streamer -b -i "/usr/local/lib/input_uvc.so" -o "/usr/local/lib/output_http.so -w /usr/local/www -c username:password"
sleep 2
f_message "mjpg_streamer started"
;;
stop)
f_message "Stopping mjpg_streamer…"
killall mjpg_streamer
f_message "mjpg_streamer stopped"
;;
restart)
f_message "Restarting daemon: mjpg_streamer"
killall mjpg_streamer
/usr/local/bin/mjpg_streamer -b -i "/usr/local/lib/input_uvc.so" -o "/usr/local/lib/output_http.so -w /usr/local/www -c username:password"
sleep 2
f_message "Restarted daemon: mjpg_streamer"
;;
status)
pid=`ps -A | grep mjpg_streamer | grep -v "grep" | grep -v mjpg_streamer. | awk ‘{print $1}’ | head -n 1`
if [ -n "$pid" ];
then
f_message "mjpg_streamer is running with pid ${pid}"
f_message "mjpg_streamer was started with the following command line"
cat /proc/${pid}/cmdline ; echo ""
else
f_message "Could not find mjpg_streamer running"
fi
;;
*)
f_message "Usage: $0 {start|stop|status|restart}"
exit 1
;;
esac
exit 0
Після збереження, виконайте ті ж команди, що й вище:
sudo chmod 755 /etc/init.d/livestream.sh
sudo update-rc.d livestream.sh defaults
Успіх!
Тепер ваша веб-камера доступна через Інтернет і запускається при включенні RPi.
Додаток
Завантаження MJPG-Streamer за допомогою curl або wget
wget http://sourceforge.net/code-snapshots/svn/m/mj/mjpg-streamer/code/mjpg-streamer-code-182.zip
unzip mjpg-streamer-code-182.zip
Закінчити роботу запущених команди можна з розділу subversion.
Завантаження MJPG-Streamer за допомогою scp
Завантажте MJPG-Streamer на іншому пристрої, а потім використайте SCP, щоб скопіювати його на RPi.
scp ~/Downloads/ This email address is being protected from spambots. You need JavaScript enabled to view it.:~/
де 192.168.1.100 замыныть на ІР-адресу RPi.
Закінчити роботу запущених команд можна з розділу subversion.
Використання input_file.so для захоплення зображень
Для цього методу, необхідно встановити камеру, щоб почати запис зображення, використовуючи команду raspistill. Ви також буде потрібна папка для зберігання файлів; для прикладу, просто зробимо її в /tmp:
mkdir /tmp/stream
Потім увімкніть камеру з командою, аналогічною наступній:
raspistill --nopreview -w 640 -h 480 -q 5 -o /tmp/stream/pic.jpg -tl 100 -t 9999999 -th 0:0:0 &
Параметри команди пояснені нижче, тому змініть їх, як вважаєте за потрібне:
• --nopreview: Не відображати вікно попереднього перегляду
• -w і -h: ширина і висота зображення (в пікселях)
• -q: якість <1-100>
• -o: записати у файл (з ім'ям pic.jpg)
• -tl: час (у мс) затримки, перш ніж буде зроблений знімок і вимкнеться і прив'яже останнє повне зображення до файлу
• -t: час (9999999ms)
• -th: встановити параметри мініатюри (x:y:quality)
• &: посилає завдання у фоновому режимі (не входить в raspistill)
Після того, як зображення почали захоплюватися камерою, вводимо:
/usr/local/bin/mjpg_streamer -i "input_file.so -f /tmp/stream -n pic.jpg" -o "output_http.so -w /usr/local/www"
Тепер зможемо переглядати відеопотік камери RPi з будь-якого браузера - лише не забудьте крім адреси EPi вказати порт 8080. Приємного перегляду :)
(За матеріалами: jacobsalmela.com)