941浏览
查看: 941|回复: 0

[ESP8266/ESP32] FireBeetle 2 ESP32 C6开发板 Micropython连接MQTT服务

[复制链接]
本帖最后由 米菲爸爸 于 2024-4-12 19:08 编辑

当使用ESP32-C6与MicroPython连接MQTT服务时,可以创建一个轻量级的物联网应用程序。
ESP32-C6是一款低功耗、高性能和高度集成的Wi-Fi和蓝牙解决方案,而MicroPython是一种方便的Python语言子集,适用于嵌入式开发。
在本文中,我们将使用MicroPython和ESP32-C6来连接并发布/订阅MQTT消息。

当然由于Micropython开发Esp32系列开发板目前还都不是主流,所以难免经常踩坑。
步骤1:准备工作
在开始之前,请确保你已经具备以下几点:
1.一台安装了MicroPython固件的ESP32-C6设备。(刷固件可以参考文末视频)
2.一个MQTT代理(例如EMQX)的服务器地址、端口号以及连接凭据(用户名和密码)。
步骤2:连接Wi-Fi
首先,我们把所有的参数都放到一个json格式的配置文件里以便之后快速切换不同的MQTT服务

  1. # 读取JSON配置文件
  2. def read_config_file(filename):
  3.     try:
  4.         with open(filename, 'r') as file:
  5.             config = json.load(file)
  6.             return config
  7.     except OSError:
  8.         print("无法读取配置文件:", filename)
  9.         return None
  10. # 读取配置文件
  11. config = read_config_file("configEMQX.json")
  12. # 检查是否成功读取配置文件
  13. if config is not None:
  14.     # 获取配置项
  15.     ssid, pwd = config.get("ssid"), config.get("pwd")
复制代码

我们需要将ESP32-C6连接到Wi-Fi网络,以便能够与MQTT代理进行通信。
在MicroPython中,我们可以使用`network`模块来进行Wi-Fi连接。以下是一个示例代码:

  1. wlan = network.WLAN(network.STA_IF)
  2.     wlan.active(True)
  3.     if not wlan.isconnected() :
  4.         #wlan.disconnect()
  5.         #wlan.config(dhcp_hostname="")
  6.         wlan.connect(ssid, pwd)
  7.         retry_limit = 10  # 设置重试次数上限为10
  8.         retry_count = 0  # 初始化重试计数器
  9.         while not wlan.isconnected() and retry_count < retry_limit:
  10.             retry_count += 1
  11.             time.sleep_ms(1000)
  12.             print("try to connecting", retry_count)
  13.       
  14.     if not wlan.isconnected():
  15.         print("连接尝试次数已达上限,连接失败")
  16.     else:
  17.         print("成功连接到网络")
  18.         print(wlan.ifconfig())
复制代码


在配置文件里将"yourSSID"和"yourPWD"替换为你的Wi-Fi网络的凭据。代码将连接到指定的Wi-Fi网络,然后等待直到连接成功。
步骤3:安装和导入MQTT库
在ESP32-C6上使用MicroPython连接uMQTT服务需要使用到uMQTT库,该库提供了uMQTT客户端的功能。
首先,需要安装mip,在Thonny的Tools-> Manage Packages 下搜索安装mip组件


在代码中添加
  1. import mip
  2. mip.install("umqtt.simple")
复制代码

代码将使用mip模块来安装MQTT库。安装完成后,我们可以在代码中导入MQTT库:
  1. from umqtt.simple import MQTTClient
复制代码

步骤4:连接MQTT代理
现在,我们可以连接到MQTT代理并发布/订阅消息。请将以下代码替换为你的MQTT服务器地址、端口号以及连接凭据:
  1. mqtt_server = "你的MQTT服务器地址"
  2. mqtt_port = 1883
  3. mqtt_username = "你的MQTT用户名"
  4. mqtt_password = "你的MQTT密码"
  5. client = MQTTClient("esp32-c6-client", mqtt_server, port=mqtt_port, user=mqtt_username, password=mqtt_password)
  6. client.connect()
  7. print("已成功连接到MQTT代理")
复制代码

在代码中,我们首先创建了一个名为`esp32-c6-client`的MQTT客户端实例。然后,使用`client.connect()`方法连接到MQTT代理。
步骤5:发布MQTT消息
要发布MQTT消息,可以使用`client.publish()`方法。以下是一个示例,将"Hello,MQTT!"作为消息发布到名为`topic/test`的主题下:
  1. message = "Hello, MQTT!"
  2. topic = "topic/test"
  3. client.publish(topic, message)
  4. print("已发布消息:", message)
复制代码

在代码中,我们使用`client.publish()`方法,传递了主题和消息作为参数。
步骤6:订阅MQTT消息
要订阅MQTT消息,可以使用`client.subscribe()`方法。以下是一个示例,订阅名为`topic/test`的主题:
  1. topic = "topic/test"
  2. def on_message(topic, message):
  3.     print("收到消息,主题:", topic.decode())
  4.     print("消息内容:", message.decode())
  5. client.set_callback(on_message)
  6. client.subscribe(topic)
  7. print("已订阅主题:", topic)
复制代码

在代码中,我们使用了`client.subscribe()`方法来订阅指定的主题,并在`on_message`函数中定义了接收到消息时的处理逻辑。
步骤7:保持连接与断开连接
为了保持与MQTT代理的持续连接,可以使用`client.check_msg()`方法定期检查新的消息或心跳包,并引导客户端保持连接。以下是一个示例代码,在循环中每隔1秒调用一次`client.check_msg()`方法:
  1. while True:
  2.     client.check_msg()
  3.     time.sleep(1)
复制代码

为了断开与MQTT代理的连接,可以使用`client.disconnect()`方法:
  1. client.disconnect()
  2. print("已断开与MQTT代理的连接")
复制代码

步骤8:整合所有代码
完成以上步骤后,你可以将所有的代码整合到一起,并进行部署和运行。下面是一个完整的示例代码:
  1. import network
  2. from umqtt.simple import MQTTClient
  3. import ujson as json
  4. import time
  5. # 读取JSON配置文件
  6. def read_config_file(filename):
  7.     try:
  8.         with open(filename, 'r') as file:
  9.             config = json.load(file)
  10.             return config
  11.     except OSError:
  12.         print("无法读取配置文件:", filename)
  13.         return None
  14. # 读取配置文件
  15. config = read_config_file("configEMQX.json")
  16. def connectMQTT():
  17.     client = MQTTClient(
  18.         client_id=config.get("client_id").encode(),
  19.         server=config.get("server").encode(),
  20.         port=config.get("port"),
  21.         user=config.get("user").encode(),
  22.         password=config.get("password").encode(),
  23.         keepalive=7200,
  24.         ssl=False
  25.     )
  26.     client.connect()
  27.     return client
  28. # 检查是否成功读取配置文件
  29. if config is not None:
  30.     # 获取配置项
  31.     ssid, pwd = config.get("ssid"), config.get("pwd")
  32.    
  33.     wlan = network.WLAN(network.STA_IF)
  34.     wlan.active(True)
  35.     if not wlan.isconnected() :
  36.         #wlan.disconnect()
  37.         #wlan.config(dhcp_hostname="")
  38.         wlan.connect(ssid, pwd)
  39.         retry_limit = 10  # 设置重试次数上限为10
  40.         retry_count = 0  # 初始化重试计数器
  41.         while not wlan.isconnected() and retry_count < retry_limit:
  42.             retry_count += 1
  43.             time.sleep_ms(1000)
  44.             print("try to connecting", retry_count)
  45.       
  46.     if not wlan.isconnected():
  47.         print("连接尝试次数已达上限,连接失败")
  48.     else:
  49.         print("成功连接到网络")
  50.         print(wlan.ifconfig())
  51.       
  52.         #import mip
  53.         #mip.install("umqtt.simple")
  54.            
  55.         mqttClient = connectMQTT()
  56.         mqttClient.publish("topic", "value123")
  57.         print("publish Done")
  58. else :
  59.     print("Config not exist")
复制代码
下面是关于Esp32C6 开箱 刷固件 点灯 点屏幕 连接MQTT服务 的视频

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail