实战:从后端 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. 心跳要能真正落库并被前端读取
相关推荐
EMQX8 天前
跨越 OT 与 IT 的鸿沟:15 分钟实现 NeuronEX 与 Azure Fabric 联动
mqtt·fabric·neuronex
北极熊~~8 天前
win上编译带ssl的paho-cpp库
mqtt·ssl·源码编译mqtt库
欢乐熊嵌入式编程9 天前
嵌入式 + MQTT:数据上传到阿里云实战(从0到1完整教程)
stm32·单片机·mqtt·freertos·嵌入式架构·efr32
芳草萋萋鹦鹉洲哦9 天前
【mqtt】emqx broker安装测试详细教程(附windows版本emqx broker下载地址)
windows·mqtt·broker·emqx
七夜zippoe13 天前
DolphinDB MQTT协议接入:工业设备数据采集
运维·mqtt·dolphindb·工业设备·协议接入
特立独行的猫a16 天前
MQTT Client的Tauri应用移植到 OpenHarmony 鸿蒙 PC/ARM64 实践记录
mqtt·华为·rust·harmonyos·tauri·移植·鸿蒙pc
ControlRookie19 天前
加更2_这套PLC侧MQTTBroker_我是怎么从连不上掉线延迟一路修到稳定的
mqtt·开源·通信协议·codesys
Cry丶22 天前
NB-IoT 表计协议开发复盘:如何建立从 HEX 报文到业务闭环的验证链路
物联网·mqtt·协议解析·nb-iot·hex报文·嵌入式联调·工程复盘
007张三丰24 天前
AIoT与嵌入式系统深度解析:2026软考案例核心考点全攻略
物联网·mqtt·kafka·freertos·时序数据库·tdengine·aiot
特立独行的猫a1 个月前
Rust+ Tauri实现漂亮小巧的Mqtt客户端工具--AtomMQTT Client 实现详解
开发语言·后端·mqtt·rust