当前位置: 首页 > news >正文

【免费开源】STM32 MQTT远程继电器网关4路智能开关物联网控制完整工程项目分享

【免费开源】STM32 MQTT远程继电器网关4路智能开关物联网控制完整工程项目分享

一、项目背景

物联网时代,越来越多的家电、工业设备需要"远程一键开关"功能。本项目"基于 STM32 的 MQTT 远程继电器网关"使用 STM32F103 + W5500(或 ESP8266)+ 4 路继电器,构建一个标准的 MQTT 客户端,可以连接公开 Broker(如 EMQX、阿里云、OneNET、自建 Mosquitto),订阅控制主题、发布状态主题,将物理继电器纳入 MQTT 总线,秒级响应远端指令。

主要特性:

  1. 标准 MQTT 3.1.1 客户端,支持 QoS0/1;
  2. 支持 4 路继电器、4 路输入检测;
  3. 支持遗嘱消息(LWT),离线立即被云端感知;
  4. 通过 Web 端 / 微信小程序 / Home Assistant 都可以控制;
  5. 配置参数(WiFi、Broker、Topic)通过串口动态写入 Flash 保存。

二、系统流程图

STM32 上电

读取 Flash 配置:
WiFi/Broker/ClientID/Topic

ESP8266 启动 + 连接 WiFi

WiFi 已连接?

红灯闪烁 重试

发送 MQTT CONNECT 报文
包含 LWT

CONNACK 成功?

订阅 cmd/relay/+

发布 online 状态

进入主循环

收到 PUBLISH?

解析 Topic 与 Payload

relay 编号有效?

忽略

控制 GPIO 翻转继电器

发布状态到 stat/relay/N

每 30s 发送 PINGREQ

三、硬件方案

设备STM32 引脚
W5500/ESPSPI1 / UART2
RELAY1~4PB0~PB3
INPUT1~4PA4~PA7
状态 LEDPC13
配置按键PA0

四、核心代码

4.1 简化版 MQTT 报文打包

#include"mqtt.h"#include<string.h>staticintencode_remaining(uint8_t*p,intrl){inti=0;do{uint8_tb=rl&0x7F;rl>>=7;if(rl)b|=0x80;p[i++]=b;}while(rl);returni;}intMQTT_BuildConnect(uint8_t*out,constchar*cid,constchar*user,constchar*pwd,uint16_tkeep){uint8_t*p=out;*p++=0x10;uint8_tvar[256];intvi=0;/* protocol name */var[vi++]=0;var[vi++]=4;memcpy(var+vi,"MQTT",4);vi+=4;var[vi++]=4;/* version 3.1.1 */uint8_tflags=0xC2;/* user+pwd+cleanSession */var[vi++]=flags;var[vi++]=keep>>8;var[vi++]=keep&0xFF;/* payload */intcl=strlen(cid),ul=strlen(user),pl=strlen(pwd);var[vi++]=cl>>8;var[vi++]=cl&0xFF;memcpy(var+vi,cid,cl);vi+=cl;var[vi++]=ul>>8;var[vi++]=ul&0xFF;memcpy(var+vi,user,ul);vi+=ul;var[vi++]=pl>>8;var[vi++]=pl&0xFF;memcpy(var+vi,pwd,pl);vi+=pl;p+=encode_remaining(p,vi);memcpy(p,var,vi);p+=vi;returnp-out;}intMQTT_BuildPublish(uint8_t*out,constchar*topic,constchar*payload){uint8_t*p=out;*p++=0x30;inttl=strlen(topic),pl=strlen(payload);intrl=2+tl+pl;p+=encode_remaining(p,rl);*p++=tl>>8;*p++=tl&0xFF;memcpy(p,topic,tl);p+=tl;memcpy(p,payload,pl);p+=pl;returnp-out;}intMQTT_BuildSubscribe(uint8_t*out,uint16_tpid,constchar*topic,uint8_tqos){uint8_t*p=out;*p++=0x82;inttl=strlen(topic);intrl=2+2+tl+1;p+=encode_remaining(p,rl);*p++=pid>>8;*p++=pid&0xFF;*p++=tl>>8;*p++=tl&0xFF;memcpy(p,topic,tl);p+=tl;*p++=qos;returnp-out;}

4.2 主循环(基于 ESP8266 透传)

#include"main.h"#include"mqtt.h"#include<stdio.h>externUART_HandleTypeDef huart2;/* to ESP */staticvoiduart_send(constuint8_t*b,intn){HAL_UART_Transmit(&huart2,(uint8_t*)b,n,200);}staticvoidat_cmd(constchar*c){uart_send((uint8_t*)c,strlen(c));HAL_Delay(800);}voidRelay_Set(inti,inton){GPIO_TypeDef*p=GPIOB;uint16_tpin=GPIO_PIN_0<<i;HAL_GPIO_WritePin(p,pin,on?GPIO_PIN_SET:GPIO_PIN_RESET);}intmain(void){HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();MX_USART2_UART_Init();/* ESP 进入透传 */at_cmd("AT+CWMODE=1\r\n");at_cmd("AT+CWJAP=\"my-wifi\",\"12345678\"\r\n");HAL_Delay(3000);at_cmd("AT+CIPSTART=\"TCP\",\"broker.emqx.io\",1883\r\n");at_cmd("AT+CIPMODE=1\r\n");at_cmd("AT+CIPSEND\r\n");/* 发送 MQTT CONNECT */uint8_tbuf[128];intn=MQTT_BuildConnect(buf,"stm32gw01","user","pwd",60);uart_send(buf,n);HAL_Delay(500);/* SUBSCRIBE */n=MQTT_BuildSubscribe(buf,1,"cmd/relay/+",0);uart_send(buf,n);while(1){/* 在 UART2 接收中断里解析 PUBLISH 包,解析后调用 Relay_Set */HAL_Delay(100);/* 周期心跳 */staticuint32_tping=0;if(HAL_GetTick()-ping>20000){uint8_tpingreq[2]={0xC0,0x00};uart_send(pingreq,2);ping=HAL_GetTick();}}}

五、关键技术解析

5.1 LWT 遗嘱消息

CONNECT 报文 flags 中设置 will flag,可以让 Broker 在客户端异常掉线时主动发布stat/online=offline,从而实现"秒级离线感知",是工业网关必备能力。

5.2 主题设计

  • cmd/relay/{n}:下行控制(payload:ON/OFF/TOGGLE
  • stat/relay/{n}:上行状态
  • stat/online:在线/离线
    这种"命令-状态分离"的主题设计是 Home Assistant 的标准做法,便于自动发现集成。

5.3 配置存储

WiFi、Broker、ClientID 保存在 Flash 最后一页(STM32F103 一页 1KB)。结构体 + CRC16 校验,避免上电读出垃圾数据。

5.4 抖动消抖

物理输入信号要做 30ms 防抖,避免按一次按钮上报多次。

六、应用场景

  • 工厂车间设备远程开关、定时启停;
  • 智能家居灯光、风扇、热水器联动;
  • 自助洗车、共享充电柜的远程控制;
  • 配合 Home Assistant 让家里的"哑设备"接入 HomeKit/小爱同学。

七、调试经验

  1. ESP8266 透传模式之前必须建立 TCP;
  2. MQTT Keepalive 设小一点(30~60s),避免 NAT 超时;
  3. payload 要避免使用换行符,防止 ESP 把它解析成 AT 终止;
  4. 推荐使用 EMQX 公网测试 Brokerbroker.emqx.io:1883,免账号密码。

八、总结

本项目以最小代价构建了一个产品级 MQTT 智能继电器网关,源码简洁、协议规范,是嵌入式工程师入门 IoT 的最佳样板。配套的开源代码、原理图、上位机示例 APK 都打包在项目源码包中,开箱即用。

http://www.zskr.cn/news/1433160.html

相关文章:

  • GPT驱动SaaS产品交互革命:从JSON到提示词驱动UX的工程实践
  • 从马克·吐温的讽刺实验到现代AI伦理:用Python和GPT-4重演《可恶的人类》动物对比
  • 别再乱用-duty_cycle了!用create_generated_clock搞定复杂时钟占空比的3个实战技巧
  • 保姆级教程:在Ubuntu 14.04上为ARM平台交叉编译支持WebRTC的ZLMediaKit
  • 别让DRC检查形同虚设!深度解析Altium Designer规则设置中的5个高频‘无效配置’陷阱
  • 表情符号数据分析:从情感信号到商业洞察的技术实现与应用
  • Shantell Sans:融合多语言支持与可变轴创新的艺术家手写灵感字体!
  • 告别手动翻找!用Windows批处理5分钟搞定照片/文档的批量提取(附.bat文件模板)
  • 【信息科学与工程学】【物理/化学科学和工程技术】知识体系53 结构学知识01——钢结构/玻璃结构/土木结构/芯片结构
  • ZYNQ裸机双网口通信实战:手把手教你用LWIP和SDK搭建TCP服务器(附完整源码)
  • ChatGPT技术原理、能力边界与高效使用指南
  • 最新株洲市贵金属全品类黄金回收白银回收铂金回收 黄金变现避坑,专业回收全程透明:实力口碑排行榜门店及联系方式推荐 - 前途无量YY
  • 从一次证书过期故障说起:深度复盘CentOS 7 chrony服务配置的那些‘坑’
  • 如何用5步实现B站视频转文字:小白也能快速提取视频内容
  • FinalShell安装踩坑实录:从‘软件正在运行’报错到成功连接Ubuntu 22.04的全过程
  • 树莓派外接屏幕驱动安装全攻略:从GitHub下载到命令行配置,一次搞定
  • 别再用Excel硬扛了!手把手教你用SPSS 25.0搞定销售数据预测(附完整数据文件)
  • 手把手教你配置ZYNQ Ultrascale+ MPSoC的DDR4:从MT40A512M16选型到Vivado参数实战
  • 别再只会用手机连蓝牙了!手把手教你用STM32+ECB02模块实现两个设备自动配对通信
  • 鸿蒙数学 108 篇 第三十三篇:四象与四则运算对应法则
  • Visual Studio里那个烦人的error C2143,我总结了新手最常踩的3个坑(附VS2022调试技巧)
  • Windows宝塔面板启动卡死?别急着重装,先试试这个服务管理器修复法
  • 最新邢台市贵金属全品类黄金回收白银回收铂金回收 黄金变现避坑,专业回收全程透明:实力口碑排行榜门店及联系方式推荐 - 前途无量YY
  • 告别PaddlePaddle!在YOLOv8里直接调用RT-DETR-l模型做目标检测(附完整代码)
  • 【企业级AI成本治理白皮书】:基于237家客户真实数据——订阅冗余率高达68%,30天内可压缩至≤12%
  • 大规模LLM训练中的故障恢复技术与FlashRecovery系统解析
  • DiT训练成本太高?试试这个Fast-DiT项目:单卡A100也能玩转Transformer扩散模型
  • 最新徐州市贵金属全品类黄金回收白银回收铂金回收 黄金变现避坑,专业回收全程透明:实力口碑排行榜门店及联系方式推荐 - 前途无量YY
  • AI重塑远程工作价值链:从执行者到AI驾驭者的生存指南
  • Dell R730服务器RAID0改RAID1不掉数据?实测后我选择了重装ESXi 8.0 U2