news 2026/6/10 1:07:32

使用 Docker 搭建 EMQX,并通过 MicroPython 实现 MQTT 控制 ESP32 LED

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
使用 Docker 搭建 EMQX,并通过 MicroPython 实现 MQTT 控制 ESP32 LED

使用 Docker 搭建 EMQX,并通过 MicroPython 实现 MQTT 控制 ESP32 LED

在物联网项目中,MQTT是最常用的消息通信协议之一。本文将通过一个完整示例,演示如何:

  1. 使用Docker 快速部署 EMQX
  2. 解决端口冲突问题
  3. 使用MicroPython作为 MQTT 客户端
  4. 通过 MQTT 消息远程控制 ESP32 LED

一、使用 Docker 快速启动 EMQX

1. 基础启动命令

最基础的 EMQX 容器启动方式如下:

dockerrun-itd\--nameemqx\-p1883:1883\-p8083:8083\-p8084:8084\-p8883:8883\-p18083:18083\emqx/emqx

容器启动成功后会返回类似 ID:

185326ea778710a12c77ad3b3e24800ce7591c30f4feb0196742bfd70f655d14

这样:

  • 宿主机:1884
  • 容器内部:1883(MQTT 默认端口)

二、访问 EMQX 控制台

浏览器访问(HTTPS):

https://服务器IP:18083

默认账号密码:

用户名:admin 密码:public

控制台界面如下:


三、MicroPython MQTT 客户端实现

ESP32 使用MicroPython,MQTT 客户端代码基于simple.py实现。


1. MQTT 客户端库(simple.py)

文件名:simple.py

importusocketassocketimportustructasstructfromubinasciiimporthexlifyclassMQTTException(Exception):passclassMQTTClient:def__init__(self,client_id,server,port=0,user=None,password=None,keepalive=0,ssl=None,):ifport==0:port=8883ifsslelse1883self.client_id=client_id self.sock=Noneself.server=server self.port=port self.ssl=ssl self.pid=0self.cb=Noneself.user=user self.pswd=password self.keepalive=keepalive self.lw_topic=Noneself.lw_msg=Noneself.lw_qos=0self.lw_retain=Falsedef_send_str(self,s):self.sock.write(struct.pack("!H",len(s)))self.sock.write(s)def_recv_len(self):n=0sh=0while1:b=self.sock.read(1)[0]n|=(b&0x7F)<<shifnotb&0x80:returnn sh+=7defset_callback(self,f):self.cb=fdefset_last_will(self,topic,msg,retain=False,qos=0):self.lw_topic=topic self.lw_msg=msg self.lw_qos=qos self.lw_retain=retaindefconnect(self,clean_session=True):self.sock=socket.socket()addr=socket.getaddrinfo(self.server,self.port)[0][-1]self.sock.connect(addr)premsg=bytearray(b"\x10\0\0\0\0\0")msg=bytearray(b"\x04MQTT\x04\x02\0\0")sz=10+2+len(self.client_id)msg[6]=clean_session<<1ifself.user:sz+=2+len(self.user)+2+len(self.pswd)msg[6]|=0xC0i=1whilesz>0x7F:premsg[i]=(sz&0x7F)|0x80sz>>=7i+=1premsg[i]=sz self.sock.write(premsg,i+2)self.sock.write(msg)self._send_str(self.client_id)ifself.user:self._send_str(self.user)self._send_str(self.pswd)resp=self.sock.read(4)ifresp[3]!=0:raiseMQTTException(resp[3])defsubscribe(self,topic,qos=0):self.cbisnotNonepkt=bytearray(b"\x82\0\0\0")self.pid+=1struct.pack_into("!BH",pkt,1,2+2+len(topic)+1,self.pid)self.sock.write(pkt)self._send_str(topic)self.sock.write(qos.to_bytes(1,"little"))defcheck_msg(self):self.sock.setblocking(False)try:res=self.sock.read(1)except:returnifres==b"\x30":self.sock.read(1)tlen=self.sock.read(2)tlen=(tlen[0]<<8)|tlen[1]topic=self.sock.read(tlen)msg=self.sock.read()self.cb(topic,msg)

四、ESP32 主程序(控制 LED)

文件名:main.py

fromsimpleimportMQTTClientfrommachineimportPinimportnetwork led=Pin(2,Pin.OUT)SSID="wifi名称"PASSWORD="wifi密码"wlan=network.WLAN(network.STA_IF)wlan.active(True)ifnotwlan.isconnected():wlan.connect(SSID,PASSWORD)whilenotwlan.isconnected():passprint("Network config:",wlan.ifconfig())SERVER="192.168.31.219"PORT=1884CLIENT_ID="my_micropython_client"defsub(topic,msg):print(topic,msg)iftopic==b"led002":ifmsg==b"on":led.value(0)elifmsg==b"off":led.value(1)client=MQTTClient(CLIENT_ID,SERVER,PORT,"test","123456")client.set_callback(sub)client.connect()client.subscribe(b"led002")whileTrue:client.check_msg()

五、测试效果

通过 EMQX 控制台或其他 MQTT 客户端:

  • Topic:led002

  • Payload:

    • on→ LED 亮
    • off→ LED 灭

设备成功订阅并响应:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 22:30:26

Compose 封装 - 点击防抖

一、概念简单场景&#xff08;如登录按钮&#xff09;使用标记&#xff0c;实现成本低。定义一个布尔状态 isLoading&#xff0c;业务代码开始时若为 true 则直接return&#xff0c;在成功后或finally中设为 false。搜索框延迟执行。需立即反馈一段时间内只执行一次。二、基于时…

作者头像 李华
网站建设 2026/6/9 22:33:58

很多人不会论文降AI率,这篇把论文降AI率讲清楚了

论文AI 率到底该怎么降&#xff1f;了解这些原理后&#xff0c;降ai 率真的超简单&#xff0c;本人亲测&#xff0c;三分钟就可以降到个位数&#xff0c;知网秒过&#xff01;一、为什么手动降重总翻车&#xff1f;学术党必知的3大痛点“明明查重率达标了&#xff0c;导师却说论…

作者头像 李华
网站建设 2026/6/9 21:27:50

基于YOLOv5/8/10的火车检测与计数系统

文章目录 毕设帮扶:从0到1搭建基于YOLOv5/8/10的火车检测与计数系统——助你搞定深度学习毕设 一、课题价值:火车检测与计数毕设为啥值得做? 二、核心技术:YOLOv5/8/10在火车检测中的“硬实力” (一)YOLOv5:高效实用的“检测先锋” (二)YOLOv8:复杂场景的“检测能手”…

作者头像 李华
网站建设 2026/6/9 21:25:43

毕设助力!从0到1构建基于YOLOv11的病人跌倒检测系统

文章目录 毕设助力!从0到1构建基于YOLOv11的病人跌倒检测系统,让你的毕设守护医疗安全 一、项目背景:病人跌倒检测为啥非做不可? 二、核心技术:YOLOv11为啥适合跌倒检测? 三、项目目标:我们要做啥? 四、数据准备:让模型“看懂”跌倒动作 1. 数据集来源 2. 数据标注 3.…

作者头像 李华