当前位置: 首页 > 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.jsqmd.com/news/921836/

相关文章:

  • 保姆级教程:在VMware上给Ubuntu 22.04虚拟机配置国内镜像源(附最佳服务器选择)
  • AI读懂企业:企业要成为豆包愿意推荐的答案,先要让它读懂你 - 招财兔数字员工
  • GPT驱动SaaS产品交互革命:从JSON到提示词驱动UX的工程实践
  • 从‘图书馆出版物’到你的项目:手把手教你用类图、状态图和DFD完成一次完整的OOA
  • 超越TextMeshPro?手把手教你为Unity旧版Text组件实现智能标点避头尾
  • 从马克·吐温的讽刺实验到现代AI伦理:用Python和GPT-4重演《可恶的人类》动物对比
  • 移动端项目实战:手把手教你用Vue3+Vant封装一个树状多选组件(附完整代码)
  • 5分钟搞定B站视频下载:免费保存大会员4K超清内容终极指南
  • 告别随机采样!用Python手把手实现强化学习中的优先经验回放(附SumTree代码详解)
  • Qt5.15项目里QWebEngine加载网页卡死?别急着改代理,先看看Windows这个隐藏设置
  • 有效内容覆盖,豆包GEO的核心不是刷屏,而是让内容有意义地覆盖 - 招财兔数字员工
  • UE4材质进阶:别再直接调UV了,手把手教你精准控制法线贴图强度(附完整蓝图)
  • 基于Wav2Vec 2.0构建端到端语音识别系统:从原理到实践
  • 别再乱用-duty_cycle了!用create_generated_clock搞定复杂时钟占空比的3个实战技巧
  • 别再只会用默认缓动了!Unity DOTween 20+种Ease曲线实战速查手册(附场景应用建议)
  • 保姆级教程:在Ubuntu 14.04上为ARM平台交叉编译支持WebRTC的ZLMediaKit
  • 3步智能激活:Windows与Office永久授权的完整解决方案
  • 从灵感到产品:系统化评估与实现App创意的完整指南
  • 加密数据湖架构:安全查询与密钥管理解析
  • 别再重启服务器了!手把手教你用Livepatch给Linux内核打热补丁(附实战避坑)
  • Intel核显驱动背锅?手把手教你定位并修复DWM.exe内存占用飙升的疑难杂症
  • 最新周口市贵金属全品类黄金回收白银回收铂金回收 黄金变现避坑,专业回收全程透明:实力口碑排行榜门店及联系方式推荐 - 前途无量YY
  • 别让DRC检查形同虚设!深度解析Altium Designer规则设置中的5个高频‘无效配置’陷阱
  • 深入H3芯片手册:从内存映射图到uboot入口地址0x4a000000的来龙去脉
  • AI与IoT如何重塑智能汽车:从技术原理到场景应用
  • 表情符号数据分析:从情感信号到商业洞察的技术实现与应用
  • Shantell Sans:融合多语言支持与可变轴创新的艺术家手写灵感字体!
  • 告别手动翻找!用Windows批处理5分钟搞定照片/文档的批量提取(附.bat文件模板)
  • 手把手调优寒武纪MLU推理性能:从Cluster级并行到Core级流水线的完整实战
  • 【信息科学与工程学】【物理/化学科学和工程技术】知识体系53 结构学知识01——钢结构/玻璃结构/土木结构/芯片结构