实战:从后端 MQTT(1883) 配置到三端联调全流程

关键词:MosquittoFastAPIPuppyPiVueMQTT 1883设备在线状态

场景:云服务器 122.51.12.83,后端 puppyfit,终端 puppyfit-terminal,前端 puppyfit-frontend


一、目标

本文从 后端 MQTT 配置到 1883 端口 开始,完成以下最小闭环:

  1. PuppyPi 能连上云端 MQTT
  2. FastAPI 能收到 PuppyPi 消息
  3. Vue 能调用 FastAPI
  4. 设备在线状态可见(online_status

二、环境说明

  • MQTT Broker:Mosquitto(云端)
  • MQTT 端口:1883
  • 后端:FastAPI
  • 终端:ROS2 工作空间
  • 前端:Vue3

三、配置 Mosquitto(1883 + 账号密码)

1)确认主配置

/etc/mosquitto/mosquitto.conf 示例(核心项):

conf 复制代码
listener 1883 0.0.0.0
protocol mqtt
allow_anonymous false
password_file /etc/mosquitto/passwd

说明:

  • allow_anonymous false:必须用户名密码登录
  • password_file:账号来源文件

2)创建/重置 MQTT 用户密码

bash 复制代码
sudo mosquitto_passwd /etc/mosquitto/passwd puppy_server

会交互输入两次密码(输入不回显)。


3)修复密码文件权限(关键)

如果这里不对,systemctl restart mosquitto 很容易失败。

bash 复制代码
sudo chown root:mosquitto /etc/mosquitto/passwd
sudo chmod 640 /etc/mosquitto/passwd
sudo systemctl restart mosquitto
sudo systemctl status mosquitto --no-pager -l

成功标志:

  • Active: active (running)

4)确认当前用户列表

bash 复制代码
sudo awk -F: '{print $1}' /etc/mosquitto/passwd

示例输出:

text 复制代码
puppy_server

四、后端接入 MQTT(puppyfit)

在后端配置中,确保 MQTT 指向云端 1883,并与 Broker 账号一致。

puppyfit/config.py 关键项(示意):

python 复制代码
MQTT_BROKER = "122.51.*.*"
MQTT_PORT = 1883
MQTT_USERNAME = "puppy_server"
MQTT_PASSWORD = "你设置的密码"
MQTT_USE_TLS = False

建议把账号密码写入 .env,避免明文硬编码到仓库。


启动后端

bash 复制代码
cd /home/ubuntu/puppyfit
python main.py
# 或
uvicorn main:app --host 0.0.0.0 --port 8000

检查健康状态:

bash 复制代码
curl http://127.0.0.1:8000/health

关注字段:

  • services.mqtt 应为 connected

五、终端(PuppyPi)配置 MQTT 环境变量

终端代码读取的是环境变量:

  • PUPPY_MQTT_USER
  • PUPPY_MQTT_PASS

建议先临时导出:

bash 复制代码
export PUPPY_MQTT_USER=puppy_server
export PUPPY_MQTT_PASS='你设置的密码'

如需持久化,写入 ~/.bashrc

bash 复制代码
cat >> ~/.bashrc <<'EOF'
export PUPPY_MQTT_USER=puppy_server
export PUPPY_MQTT_PASS='你设置的密码'
EOF
source ~/.bashrc

启动终端遥测节点

bash 复制代码
cd /home/ubuntu/puppyfit-terminal/puppyfit_v2_ws
# source ROS2 环境后启动
ros2 launch bridge_pkg mqtt_telemetry.launch.py

六、连通性验证(强烈建议)

1)用 mosquitto_sub 验证账号是否可用

bash 复制代码
mosquitto_sub -h 122.51.*.* -p 1883 \
  -u "puppy_server" -P "你设置的密码" \
  -t "puppy/event/+" -C 1 -v
  • 能收到消息:认证与链路 OK
  • not authorised:用户名或密码错误

2)后端日志验证是否收到终端消息

关注主题:

  • puppy/data/{device_id}
  • puppy/event/{device_id}

七、前端对接 FastAPI(Vue)

puppyfit-frontend 使用 Vite 代理,开发时设置:

bash 复制代码
export VITE_API_TARGET=http://122.51.*.*:8800
npm run dev -- --host

前端接口通过 /api/... 访问后端。


八、设备在线状态判断逻辑

当前项目中,设备在线常见依赖:

  • devices.last_heartbeat 最近更新时间
  • online_status 字段

实践建议:

  1. 终端持续上报心跳/状态
  2. 后端把心跳落库到设备表
  3. 前端读取 /api/device/my-devices 展示在线状态

九、常见坑位总结

坑 1:Mosquitto 重启失败

  • 常见原因:/etc/mosquitto/passwd 权限错误
  • 正确权限:root:mosquitto + 640

坑 2:1883 通但认证失败

  • 原因:账号密码不匹配
  • 处理:mosquitto_passwd 重置并统一后端/终端配置

坑 3:只改了后端没改终端

  • 终端仍用旧密码会持续 not authorised

坑 4:前端显示离线

  • 并不一定是前端问题,通常是后端未刷新 last_heartbeat

十、结语

这套链路的核心就三件事:

  1. Broker 认证配置正确且服务可用
  2. 后端与终端使用同一套 MQTT 凭证
  3. 心跳要能真正落库并被前端读取
相关推荐
程序员正茂21 小时前
在Unity3d2021.3.35中实现MQTT异步客户端
mqtt·unity·异步
墨染倾城殇1 天前
Realtek RTL8720DN Wi-Fi4 MQTT 智能硬件通信方案实现
mqtt·智能家居·工业物联·智能硬件通信·realtek
Zevalin爱灰灰2 天前
零基础入门学用物联网(ESP8266) 第二部分 MQTT基础篇(五)
单片机·物联网·mqtt·嵌入式·esp8266
Zevalin爱灰灰3 天前
零基础入门学用物联网(ESP8266) 第二部分 MQTT基础篇(三)
单片机·物联网·mqtt·嵌入式·esp8266
Zevalin爱灰灰3 天前
零基础入门学用物联网(ESP8266) 第二部分 MQTT基础篇(四)
单片机·物联网·mqtt·嵌入式·esp8266
@haihi4 天前
ESP32 MQTT示例解析
开发语言·网络·mqtt·github·esp32
peixiuhui7 天前
赋能智慧能源,连接储能未来:G8501网关,您储能系统的“智慧大脑”与“神经中枢”
人工智能·mqtt·能源·边缘计算·iot·储能·iotgateway
薛定谔的悦13 天前
MQTT通信协议业务层实现的完整开发流程
java·后端·mqtt·struts
bkspiderx16 天前
MQTT 开源库:Eclipse Paho C 详解,特性、交叉编译与实战示例
c语言·mqtt·开源·eclipse paho c