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