Читать «Цифровая электроника для начинающих» онлайн - страница 58

Дмитрий Витальевич Елисеев

4.12. Запускаем видеонаблюдение

Используя материал предыдущей страницы, несложно сделать на базе Raspberry Pi свой сервер видеонаблюдения. Для этого достаточно добавить на наш веб-сервер код отдачи изображения, и параллельно запустить fswebcam, который будет делать снимки. Правда, это будет не совсем “видео”, а скорее “фото” наблюдение, но тем не менее, это все равно интересно.

Шаг 1. Мы уже умеем запустить веб-сервер, который будет показывать страницу index.html из текущей папки. Поменяем файл index.html, чтобы он имел следующий вид:

<html>

<head><title>Raspberry Pi server</title></head>

<body>

Camera image:<BR/>

<img src="image.jpg"/>

</body>

</html>

Как нетрудно видеть, мы добавили туда элемент img, чтобы показывалась наша картинка.

Шаг 2. Сделаем чтобы программа fswebcam запускалась при старте, и закрывалась при выходе. Это не сложно сделать средствами Python:

cmd = 'fswebcam -r 640x480 --loop 10 image.jpg'

photoThread = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)

os.kill(photoThread.pid, signal.SIGINT)

Мы создаем поток photoThread командой subprocess.Popen, а в конце работы приложения посылаем потоку команду закрытия.

Шаг 3. Добавим в наш веб-сервер возможность “отдавать” файлы jpeg. Для этого нужно добавить новый тип Content-type = 'image/jpg', чтобы браузер “знал” что передаваемые данные это картинка jpg.

Готовый код показан ниже.

from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer

import os, subprocess, signal

class Server(BaseHTTPRequestHandler):

def do_GET(self):

if "image.jpg" in self.path:

try:

self.send_response(200)

self.send_header('Content-type', 'image/jpg')

self.end_headers()

f = open('image.jpg', 'rb')

self.wfile.write(f.read())

f.close()

except:

pass

return

with open('index.html', 'r') as imgfile:

self.send_response(200)

self.send_header('Content-type', 'text/html')

self.end_headers()

data = imgfile.read()

self.wfile.write(data)

if __name__ == "__main__":

# Start photos shooting

cmd = 'fswebcam -r 640x480 --loop 10 image.jpg'

photoThread = subprocess.Popen("exec " + cmd, stdout=subprocess.PIPE, shell=True)

# Start server

server_address = ('', 8000)

httpd = HTTPServer(server_address, Server)

print 'Starting httpd...'

try:

httpd.serve_forever()

except:

pass

# Close photo shooting

os.kill(photoThread.pid, signal.SIGINT)

Как можно видеть, все вполне просто. Если в строке запроса присутствует “image.jpg”, мы загружаем картинку, иначе “index.html”. Изменить частоту обновления изображений можно, поменяв параметр loop, там же можно поменять и разрешение.

Все готово - запускаем python web.py, и с любого браузера можем зайти на страницу http://192.168.0.104:8000 (адрес может быть другим) и увидеть картинку с камеры. Это можно будет сделать и удаленно, если настроить статический IP адрес и перенаправление порта 8000 на роутере.

Чтобы сервер автоматически стартовал при запуске Raspberry Pi, нужно будет добавить строку вызова в /etc/rc.local, например так: