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 能收发消息

全部通过?好,咱们进入下一章。