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
- Phát hiện chuyển động
- Phát hiện đối tượng bảo vệ bị mất
- Chụp hình tại thời điểm phát sinh sự kiện
- Quay video liên tục hay gián đoạn
- Gởi cảnh báo bằng SMS hay email
- 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
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ằngmkdir /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