Bài 26: Camera an ninh

Có thể thiết kế hệ thống camera an ninh với RPI bằng cách sử dụng từ webcam rẻ tiền đến IP camera độ phân giải cao. Hệ thống này có những tính năng

  1. Phát hiện chuyển động
  2. Phát hiện đối tượng bảo vệ bị mất
  3. Chụp hình tại thời điểm phát sinh sự kiện
  4. Quay video liên tục hay gián đoạn
  5. Gởi cảnh báo bằng SMS hay email
  6. Cất giữ hình trên thẻ nhớ, HDD hay ổ đĩa đám mây

1-4 là các tính năng căn bản thường được trang bị sẵn cho IP camera, 5-6 là tính năng nâng cao.

A. Chuẩn bị

  • Gắn webcam vào RPI và chạy lệnh lsusb để kiểm tra, nếu webcam tương thích với RPI ta thấy kết quả tương tự như
Bus 001 Device 006: ID 046d:0825 Logitech, Inc. Webcam C270
  • Nếu dùng IP Camera, cài đặt IP tĩnh cho IP camera qua giao diện web

B. Cài đặt RPI nối mạng với IP tĩnh

(xem Bài 5Bài 6)

C. Cài đặt motion

Motion, ứng dụng phát hiện chuyển động, có thể quản lý tín hiệu video từ một hay nhiều camera và có thể biết được nếu một phần nào đó trong vùng quan sát bị thay đổi trong khi chuyển động được phát hiện.

Cài đặt motion bằng câu lệnh sau

sudo apt-get install motion

Soạn thảo file /etc/default/motion, đặt

start_motion_daemon=yes

Các option khác của motion nằm trong file cấu hình /etc/motion/motion.conf

  • daemon: đặt ON để chạy motion thường trực mỗi khi khởi động
daemon on
  • webcam_localhost: đặt OFF để có thể truy cập webcam từ máy khác
webcam_localhost off 
  • control_localhost: đặt OFF để có thể cập nhật tham số motion từ xa qua giao diện web
control_localhost off
  • control_port: port của giao diện web (mặc định 8080)
  • webcam_port: port của video stream (mặc định 8081)
  • width/height: độ phân giải của hình
width 1280
height 720
  • rotate: xoay ảnh góc tính bằng độ
rotate 180
  • framerate: số frame/giây được webcam bắt hình. Cảnh báo: đặt trên 5 fps sẽ làm chậm RPI
framerate 2
  • pre_capture, post_capture: chỉ định số frame hình được ghi trước/sau khi chuyển động bị phát hiện
pre_capture 2
post_capture 2
  • snapshot_interval: tự động ghi ảnh snapshot sau bao nhiêu giây
  • max_mpeg_time: thời gian ghi video (giây) khi phát hiện chuyển động
max_mpeg_time 600
  • ffmpeg_video_codec: định dạng video được ghi, chọn msmpeg4 để tương thích với nhiều player
ffmpeg_video_codec msmpeg4
  • control_authentication: chứng thực kết nối http với username/password
control_authentication SOMEUSERNAME:SOMEPASSWORD
  • on_picture_save: đoạn mã được gọi ngay sau khi ảnh được ghi lại
on_picture_save wput –B ftp://username:password@yourftpserver %f
  • on_motion_detected: đoạn mã được gọi ngay khi chuyển động được phát hiện
on_motion_detected python test.py
  • target_dir: thư mục ghi video
target_dir /mnt/camshare

+++ Chạy motion bằng lệnh

sudo service motion start

Chờ vài giây để motion chạy

+++ Truy cập trang web cấu hình motion theo địa chỉ

http://myrpi_IP:8080

+++ Truy cập trang web xem video stream theo địa chỉ

http://myrpi_IP:8081

+++ Mở video stream bằng VLC.

Media -> Open Network Stream và nhập http://IP_của_RPI:8081

D. Cài đặt ffmeg

ffmpeg có nhiều thư viện và ứng dụng dùng để xử lý dữ liệu multimedia, bao gồm cả audio và video codec thông dụng. Cài đặt ffmpeg qua dòng lệnh

apt-get install ffmpeg

Trong trường hợp cài đặt motion cùng với ffmpeg, có thể chỉ định motion dùng ffmpeg tạo video bằng cách biên tập file cấu hình

ffmpeg_cap_new on
ffmpeg_video_codec msmpeg4

E. Cấu hình cho webcam/IP Camera

IP camera không gắn trực tiếp vào RPI mà giao tiếp qua mạng, vì vậy cần thông báo đường dẫn đến video stream cho motion qua tham số netcam_url, ngoài ra giao tiếp với IP camera cần có mật khẩu được cung cấp qua tham số netcam_userpass

Trong file /etc/motion/motion.conf mặc định cấu hình cho motion dùng webcam thông qua dòng

videodevice /dev/video0

+++ Cấu hình webcam

videodevice /dev/video0
rotate 180
text_left CAM_0
target_dir /mnt/motion/cam0
webcam_port 8082

+++ Cấu hình IP camera

netcam_url http://url/channel2
netcam_userpass admin:password
text_left CAM_1
target_dir /mnt/motion/cam1
webcam_port 8083
  • netcam_url là đường dẫn đến ảnh jpeg hay mjpeg stream của IP camera (xem tài liệu của IP camera), có thể dùng các protocol http://, ftp://, file:///
  • webcam_port đặt sao cho không trùng với các port đã dùng

F. Sử dụng nhiều webcam và IP Camera

Để đơn giản, xóa tất cả các dòng cấu hình webcam trong file /etc/motion/motion.conf và tạo file cấu hình riêng cho từng thiết bị, thí dụ /etc/motion/cam0.conf /etc/motion/cam1.conf … và nối thêm vào cuối file /etc/motion/motion.conf các dòng

thread /etc/motion/cam0.conf
thread /etc/motion/cam1.conf
thread /etc/motion/cam2.conf

Chạy lệnh motion để kiểm tra cấu hình. Nếu không có thông báo lỗi thì dùng browser mở tiếp các địa chỉ http://IP_RPI:PORT với các PORT khai báo trong các file cấu hình, nếu nhận được hình ảnh từ webcam/IP camera thì đã thành công.

G. Email hay SMS cảnh báo khi phát hiện chuyển động

Tạo đoạn mã gởi email (xem Bài 16 hay Bài 17) hay SMS (xem Bài 22) và gán vào option on_picture_save hay on_motion_detected

H. Cất giữ snapshot và video lên ổ đĩa đám mây

Dùng webdav để mount ổ đĩa đám mây như thư mục cục bộ (xem Bài 10) hay lưu tạm thời trên RPI và move lên ổ đĩa đám mây bằng FTP hay bằng CopyCmd (xem Bài 11). Webdav luôn tạo cache trên RPI chiếm dung lương không nhỏ, vi vậy phương án sao chép file lên ổ đĩa đám mây rồi xoá file gốc trên RPI có lẻ tốt hơn.

+++ Dùng webdav

Mount ổ đĩa đám mây box.com

mount -t davfs https://dav.box.com/dav /mnt/box.com

Sau đó sửa file cấu hình của thiết bị, đặt

target_dir /mnt/box.com

+++ Dùng CopyCmd

Sửa file cấu hình của thiết bị, đặt

on_picture_save /mnt/motion/move2copy.sh %f

trong đó /mnt/motion/move2copy.sh có nội dung như sau

/root/copy/CopyCmd Cloud -username=lnt@ly-le.info -password=password put $1 /cam1/
rm $1

+++ Để tiện quản lý, mỗi camera upload lên một thư mục của ổ đĩa đám mây, mỗi ngày một thư mục con

date=$(date +%Y%m%d)
/root/copy/CopyCmd Cloud -username=$USR -password=$PWD put -r $1 /camera_1/$date

+++ Mỗi tuần xóa bớt file cũ quá 7 ngày

copycmd="/mnt/copy.com/CopyCmd Cloud -username=$USR -password=$PWD"
nday=7
folder=$(date --date "- $nday day" +%Y%m%d)
sf=$(${copycmd} ls $cam | tail -n +3 | awk '{print $2}')
for f in $sf; do
    [ "$f" \< "$folder" ] && ${copycmd} rm "/$cam/$f"
done

I. Truy cập motion từ internet

Nếu RPI có địa chỉ IP WAN động, cần dùng đến một dịch vụ DDNS cập nhật IP động cho một tên miền. May mắn là có nhiều dịch vụ miễn phí như vậy, http://changeip.com là một thí dụ.

  • Đăng ký một tài khoản từ changeip.com, sau đó tạo tên miền phụ từ changeip.com, thí dụ me.ddns.name
  • Định kỳ cập nhật IP WAN cho tên miền me.ddns.name, thí dụ bằng cronjob trên RPI (3 phút/lần) bằng đoạn mã sau
#!/bin/bash
usr=user_chageip.com
pwd=mật_khẩu
tmp=/var/tmp/tmpIP

newIP=$(curl -s myip.dnsomatic.com)
if [ -f $tmp ]; then
        oldIP=$(<$tmp)
else
        oldIP=""
fi
if [ "$oldIP" != "$newIP" ]; then
        printf $newIP > $tmp
        curl -s -u "$usr:$pwd" https://nic.changeip.com/nic/update?set=1
fi

Sau đó có thể truy cập motion theo địa chỉ http://me.ddns.name:8081

Chú ý rằng chỉ có thể dùng DDNS bên ngoài mạng WAN của RPI

J. Xếp lịch cho motion làm việc

Trước hết không cho motion tự chạy khi khởi động bằng lệnh

update-rc.d motion remove

Giả sử ta muốn hệ thống camera an ninh làm việc từ 9g đến 21g mỗi ngày. Dùng lệnh crontab -e để đặt cronjob, thêm vào 2 dòng

0  9  *  *  * mkdir /var/log/motion;[ "$(pidof motion)" = "" ] && /usr/bin/motion start 
0  21  *  *  *  killall motion 

K. Trang web xem video stream

Trên FireFox hay Safari, video stream có thể dùng phần tử img để hiển thị

<img class="css_center" src="http://IP_of_RPI:8082" width="640" height="400" />

Với nhiều camera có thể dùng nhiều phần tử img kích thước nhỏ để ghép đầy màn hình.

L. Ghi chú

  • Motion và tài nguyên hệ thống
    Trên RPi 2, motion + hai camera chiếm dụng trung bình <40% CPU, <30% RAM
    Kích thước khuôn hình của camera ảnh hưởng lớn đến sự chiếm dụng CPU
  • Không cần dùng motion với IP camera
    Motion sử dụng khá nhiều tài nguyên hệ thống khi làm việc. RPI 2 chỉ có thể chạy motion quản lý tối đa 2 webcam + 2 IP camera. IP camera lại thường có đủ các tính năng mà motion có thể làm nên có thể không dùng motion với IP camera. Trường hợp muốn ghi chép liên tục hình ảnh từ camera thì có thể dùng ffmpeg để ghi chép, sau đó thì đưa lên ổ đĩa đám mây.
  • Lỗi không chạy được motion
    Motion có thể không chạy nếu không tạo được file pid hay không có thư mục /var/log/motion. Khởi động motion trong crontab bằng

    mkdir /var/log/motion; [ "$(pidof motion)" = "" ] && /usr/bin/motion

    thay vì chỉ gọi motion sẽ sửa được lỗi này.
    Một cách khác là sửa giá trị process_id_file trong /etc/motion/motion.conf trỏ đến một thư mục đã tạo sẵn như /var/run/motion và cho nhóm motion có quyền đọc/ghi trên thư mục này

process_id_file /var/run/motion/motion.pid

Leave a Comment

Filed under Software

Leave a Reply