news 2026/4/15 14:34:40

使用 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/4/15 1:32:53

为什么建议程序员尽早拥抱 Markdown?

作为开发者&#xff0c;我们每天都在和代码、文档打交道。你是否经历过以下场景&#xff1a; 在 Word 里调整代码高亮&#xff0c;调了半天格式还是乱的&#xff1b;在不同的博客平台发布文章&#xff0c;每次都要重新排版&#xff1b;写接口文档时&#xff0c;为了一个标题的…

作者头像 李华
网站建设 2026/4/15 11:12:05

【音视频】HLS 协议详细解析

文章目录一、核心设计理念二、核心文件组成1. M3U8 文件结构2. TS 媒体片段三、工作流程四、关键特性与扩展1. 直播 vs 点播2. 加密与 DRM3. 音频/字幕/多语言4. 兼容性五、优缺点六、实用工具与命令HLS&#xff08;HTTP Live Streaming&#xff09;是苹果公司提出的基于 HTTP …

作者头像 李华
网站建设 2026/4/15 1:47:20

亲测好用10个AI论文平台,继续教育学生轻松搞定论文写作!

亲测好用10个AI论文平台&#xff0c;继续教育学生轻松搞定论文写作&#xff01; AI 工具如何助力论文写作&#xff0c;让学术之路更轻松 在当今信息化时代&#xff0c;AI 工具已经成为许多学生和科研人员不可或缺的助手。尤其是在论文写作过程中&#xff0c;AI 工具能够有效降低…

作者头像 李华
网站建设 2026/4/15 2:54:12

JSON格式混乱怎么办,一文解决Python中所有美化难题

第一章&#xff1a;JSON格式混乱怎么办&#xff0c;一文解决Python中所有美化难题在开发过程中&#xff0c;经常需要处理来自API、配置文件或日志中的JSON数据。原始JSON往往紧凑无格式&#xff0c;难以阅读和调试。Python内置的json模块提供了强大的工具来美化和格式化JSON数据…

作者头像 李华