Skip to content

MQTT

MicroPython 的 umqtt 是一个用于 MicroPython 的简单 MQTT 客户端,它实现了 CPython 模块 paho-mqtt 的一个子集,但也有一些特殊的特点和限制。

umqtt 模块的主要特点是:

它支持 MQTT v3.1.1协议,但不支持 QoS 。 它支持消息回调,并且为接收消息提供了阻塞和非阻塞的两种实现。 它支持 SSL/TLS 加密连接,但需要额外的 ssl 模块。 它分为 simple 和 robust 两个子模块,robust 模块提供了自动重连和延时发送等功能,但也有一些缺陷。

umqtt 模块的应用场景是:

在 MicroPython 中实现与互联网或局域网中的其他设备或服务的通信,如获取天气信息、控制智能家居设备、上传传感器数据等。 在 MicroPython 中实现基于 MQTT 协议的客户端或服务器端的应用,如物联网设备、远程控制、消息推送等。

umqtt 模块需注意事项是:

由于 MicroPython 的内存限制,umqtt 模块不能处理过大的消息内容,否则可能导致内存不足或异常。 由于 MicroPython 的网络支持不完善,umqtt 模块可能在不同的硬件平台或 MicroPython 版本上有不同的表现或错误。 由于 umqtt.robust 模块在弱网或断网后可能出现死锁或无限递归等问题,建议使用 micropython-mqtt 库来替代它,该库提供了更稳定和灵活的 MQTT 客户端实现。

以下是 MicroPython 的 umqtt 几个实际运用程序案例:

python
import network
import time
from umqtt.simple import MQTTClient

# 连接 WiFi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('CCMC_jzwy', '285251897_jzwy')
while not wlan.isconnected():
    time.sleep(1)

# 定义MQTT参数
SERVER = 'broker.emqx.io'  # EMQX Cloud服务器地址
PORT = 1883  # 端口号
USER = 'emqx'  # 用户名
PASSWORD = 'public'  # 密码
CLIENT_ID = 'client_id'  # 客户端ID
TOPIC = b'zhengxin_test'  # 主题


# 定义消息回调函数
def message_callback(topic, msg):
    print((topic, msg))


# 创建 MQTT 客户端对象
client = MQTTClient(CLIENT_ID, SERVER, PORT, USER, PASSWORD)
# 设置消息回调函数
client.set_callback(message_callback)
# 连接MQTT服务器
client.connect()
# 订阅主题
client.subscribe(TOPIC)
# 发布消息
client.publish(TOPIC, b'Hello World!')
# 接收消息(阻塞方式)
client.wait_msg()
# 断开连接
client.disconnect()

循环发送数据

python
import network
import time
from umqtt.simple import MQTTClient

print('准备连接 wifi')
# 连接 WiFi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('CCMC_jzwy', '285251897_jzwy')
while not wlan.isconnected():
    print('正在连接 wifi')
    time.sleep(1)
print('wifi 连接成功')

# 定义MQTT参数
SERVER = 'broker.emqx.io'  # EMQX Cloud服务器地址
PORT = 1883  # 端口号
USER = 'emqx'  # 用户名
PASSWORD = 'public'  # 密码
CLIENT_ID = 'client_id'  # 客户端ID
TOPIC = b'zhengxin_test'  # 主题


# 定义消息回调函数
def message_callback(topic, msg):
    print((topic, msg))


# 创建 MQTT 客户端对象
client = MQTTClient(CLIENT_ID, SERVER, PORT, USER, PASSWORD)
# 设置消息回调函数
client.set_callback(message_callback)
# 连接MQTT服务器
client.connect()
# 订阅主题
client.subscribe(TOPIC)

# 循环发布和接收消息(非阻塞方式)
n = 0
while True:
    # 发布消息
    client.publish(TOPIC, b'Hello World! {}'.format(n))
    n += 1
    # 接收消息
    client.check_msg()
    # 延时1秒
    time.sleep(1)

# 断开连接
client.disconnect()

订阅多个主题

python
import network
import time
from umqtt.simple import MQTTClient

print('准备连接 wifi')
# 连接 WiFi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect('CCMC_jzwy', '285251897_jzwy')
while not wlan.isconnected():
    print('正在连接 wifi')
    time.sleep(1)
print('wifi 连接成功')

# 定义MQTT参数
SERVER = 'broker.emqx.io'  # EMQX Cloud服务器地址
PORT = 1883  # 端口号
USER = 'emqx'  # 用户名
PASSWORD = 'public'  # 密码
CLIENT_ID = 'client_id'  # 客户端ID
TOPIC = b'zhengxin_test'  # 主题

recv_topic1 = b'recv1'
recv_topic2 = b'recv2'


# 定义消息回调函数
def message_callback(topic, msg):
    print((topic, msg))


# 创建 MQTT 客户端对象
client = MQTTClient(CLIENT_ID, SERVER, PORT, USER, PASSWORD)
# 设置消息回调函数
client.set_callback(message_callback)
# 连接MQTT服务器
client.connect()
# 订阅主题
client.subscribe(recv_topic1)  
client.subscribe(recv_topic2)  

n = 0
while True:
    # 发布消息
    client.publish(TOPIC, b'Hello World! {}'.format(n))
    n += 1
    client.check_msg()
    time.sleep(1)

client.disconnect()

附录

https://blog.csdn.net/weixin_41659040/article/details/132822335