3、开发环境搭建:树莓派系统烧录、Python环境配置、OpenCV与GPIO库安装、MQTT Broker(Mosquitto)部署
好,咱们正式开始动手了。这一章我带你把整个开发环境搭起来。别小看这一步,我见过太多人后面代码写好了,结果发现摄像头驱动不对、GPIO没权限、MQTT连不上——全是环境问题。咱们一次搞定,后面就只管写代码。
3.1 树莓派系统烧录:选对版本,少走弯路
树莓派型号很多,我个人习惯用树莓派4B(4GB版本),跑报警系统加摄像头推流完全够用。如果你用的是树莓派5,注意系统要选对应的新版。
第一步:下载系统镜像
去树莓派官网下载 Raspberry Pi OS Lite(不带桌面),或者用 Raspberry Pi Imager 工具直接烧录。为什么选 Lite?报警系统不需要桌面,省资源、更稳定。我早期项目里用桌面版,结果内存被窗口管理器吃掉一半,摄像头采集一卡一卡的。
第二步:烧录到SD卡
用 balenaEtcher 或者 Raspberry Pi Imager 都行。我个人推荐 Imager,因为它可以在烧录时直接配置 SSH、WiFi、用户名密码。省得你后面插键盘显示器。
烧录时记得做三件事:
- 开启 SSH(选“允许 SSH 用密码登录”)
- 配置 WiFi(选你家2.4G频段,5G频段树莓派4B有时连不上)
- 设置用户名密码(别用默认的 pi/raspberry,安全第一)
我的小技巧:烧录完成后,在 boot 分区里新建一个名为 ssh 的空文件(无后缀),这样第一次启动 SSH 就自动开了。这是老派做法,但依然管用。
第三步:首次启动与基础配置
插电开机,用 SSH 连上去。默认 IP 可以在路由器后台看,或者用 arp -a 扫描。连上后第一件事:
sudo apt update && sudo apt upgrade -y
sudo raspi-config
在 raspi-config 里,打开 Camera Interface、I2C、SPI。这三个后面都会用到。嗯,这里要注意:摄像头接口要选“Enable”,不然 OpenCV 读不到设备。
3.2 Python 环境配置:别用系统自带的
树莓派系统自带的 Python 3.9 其实够用,但我建议你装一个独立的虚拟环境。为什么?因为 OpenCV 和 GPIO 库的依赖容易打架,虚拟环境能隔离干净。
安装 Python 3.11(可选但推荐)
sudo apt install python3.11 python3.11-venv python3.11-dev -y
创建虚拟环境
python3.11 -m venv ~/smart_home_env
source ~/smart_home_env/bin/activate
每次 SSH 登录后,记得先 source 一下。我习惯在 .bashrc 里加一行别名:
alias smarthome='source ~/smart_home_env/bin/activate'
这样下次输入 smarthome 就直接进环境了。
3.3 OpenCV 与 GPIO 库安装:两个坑,我替你踩过了
OpenCV 安装
别从源码编译!别从源码编译!别从源码编译!重要的事说三遍。我在第一个项目里傻乎乎编译了四个小时,最后还报错。直接用 pip 装预编译包:
pip install opencv-python opencv-contrib-python
如果你需要摄像头硬件加速,可以装 picamera2 库(树莓派官方出的):
sudo apt install python3-picamera2 -y
我曾经踩过的坑:直接 pip install opencv-python 后,运行 cv2.VideoCapture(0) 返回 False。查了半天,发现是用户没有 video 组权限。解决方法:
sudo usermod -a -G video $USER
然后重启。嗯,就这么简单,但能卡你一下午。
GPIO 库安装
树莓派 GPIO 控制,我推荐用 RPi.GPIO 或者 gpiozero。前者更底层,后者更友好。报警系统里我两个都用:
pip install RPi.GPIO gpiozero
测试代码(接一个LED到GPIO 17):
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(17, GPIO.OUT)
while True:
GPIO.output(17, GPIO.HIGH)
time.sleep(1)
GPIO.output(17, GPIO.LOW)
time.sleep(1)
灯闪了,说明 GPIO 工作正常。如果不闪,检查接线和权限。
3.4 MQTT Broker(Mosquitto)部署:消息中枢
报警系统里,摄像头检测到异常后,通过 MQTT 发消息给报警模块。Mosquitto 是轻量级 Broker,树莓派上跑毫无压力。
安装 Mosquitto
sudo apt install mosquitto mosquitto-clients -y
安装完自动启动。检查状态:
sudo systemctl status mosquitto
配置安全访问
默认配置允许匿名连接,这在局域网里问题不大。但如果你要外网访问(我不建议),一定要配用户名密码:
sudo mosquitto_passwd -c /etc/mosquitto/passwd alarm_user
# 输入密码,比如 SmartHome2024
然后编辑配置文件:
sudo nano /etc/mosquitto/mosquitto.conf
添加:
allow_anonymous false
password_file /etc/mosquitto/passwd
listener 1883
重启 Mosquitto:
sudo systemctl restart mosquitto
测试 MQTT 通信
开两个 SSH 窗口。一个订阅:
mosquitto_sub -h localhost -t "home/alarm" -u alarm_user -P SmartHome2024
另一个发布:
mosquitto_pub -h localhost -t "home/alarm" -m "Motion detected!" -u alarm_user -P SmartHome2024
订阅窗口收到消息,说明 Broker 跑通了。
我的经验:生产环境里,我会把 Mosquitto 的日志级别调低,不然 /var/log 会被刷爆。在配置文件里加一行:
log_dest file /var/log/mosquitto/mosquitto.log
log_type error
只记录错误,不记录每条消息。
3.5 验证环境:跑一个完整的小循环
环境搭完,咱们跑一个简单的端到端测试:Python 脚本读取摄像头画面,检测到运动后通过 MQTT 发报警。
import cv2
import paho.mqtt.client as mqtt
import RPi.GPIO as GPIO
# MQTT 配置
client = mqtt.Client()
client.username_pw_set("alarm_user", "SmartHome2024")
client.connect("localhost", 1883, 60)
# 摄像头
cap = cv2.VideoCapture(0)
ret, frame1 = cap.read()
ret, frame2 = cap.read()
while True:
diff = cv2.absdiff(frame1, frame2)
gray = cv2.cvtColor(diff, cv2.COLOR_BGR2GRAY)
blur = cv2.GaussianBlur(gray, (5,5), 0)
_, thresh = cv2.threshold(blur, 20, 255, cv2.THRESH_BINARY)
contours, _ = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
for contour in contours:
if cv2.contourArea(contour) > 5000:
client.publish("home/alarm", "Motion detected!")
break
frame1 = frame2
ret, frame2 = cap.read()
这个脚本虽然简陋,但验证了三个核心组件:摄像头采集、OpenCV 图像处理、MQTT 消息推送。后面咱们会一步步把它变成完整的报警系统。
环境搭建检查清单:
- 树莓派系统烧录完成,SSH 可连
- Python 虚拟环境创建并激活
- OpenCV 能打开摄像头
- GPIO 能控制引脚
- Mosquitto 能收发消息
全部通过?好,咱们进入下一章。