news 2026/6/17 22:19:05

使用 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/15 19:40:58

2025年度总结之-如何构建 2025 专属的 GitHub AI 项目情报库

背景 为什么做 为了更好地追踪 2025 年涌现的 AI 开源项目&#xff0c;我经常浏览 Github 热榜 并整理分享。但手动查阅难免会有遗漏&#xff0c;为此&#xff0c;我计划开发一套自动化工具来采集 Github 热榜数据&#xff0c;旨在辅助个人技术积累的同时&#xff0c;也为博客…

作者头像 李华
网站建设 2026/6/10 11:52:57

GitHub 热榜项目 - 日榜(2026-1-2)

GitHub 热榜项目 - 日榜(2026-1-2) 生成于&#xff1a;2026-1-2 统计摘要 共发现热门项目&#xff1a; 12 个 榜单类型&#xff1a;日榜 本期热点趋势总结 本期GitHub热榜显示AI智能体与实用工具成为核心驱动力&#xff0c;亚马逊和多家初创公司推出的Agent项目聚焦生产环…

作者头像 李华
网站建设 2026/6/10 11:59:13

学长亲荐!10个AI论文网站测评,本科生毕业论文必备

学长亲荐&#xff01;10个AI论文网站测评&#xff0c;本科生毕业论文必备 2025年AI论文工具测评&#xff1a;为何值得一看&#xff1f; 随着人工智能技术的不断进步&#xff0c;越来越多的本科生开始借助AI工具提升论文写作效率。然而&#xff0c;面对市场上琳琅满目的平台&…

作者头像 李华
网站建设 2026/6/16 10:19:24

PHP HTTP 指南

PHP HTTP 指南 引言 PHP 是一种广泛使用的开源服务器端脚本语言,常用于开发动态网站和应用程序。HTTP(超文本传输协议)是互联网上应用最为广泛的网络协议之一,它定义了客户端与服务器之间交换数据的格式。本文将深入探讨 PHP 在处理 HTTP 请求和响应方面的应用,包括请求…

作者头像 李华