umqtt – a simple MQTT client
umqtt 是 MicroPython 的简单 MQTT 客户端。(请注意,它使用了一些 MicroPython 快捷方式,不适用于 CPython )。
支持的 MQTT 功能
发布和订阅均支持 QoS 0 和 1。 不支持 QoS2 以保持较小的代码大小。 除了 ClientID 之外, 目前仅支持“clean session”参数进行连接。
设计要求
内存效率。
避免臭名昭著的设计反模式,例如“回调地狱”。
通过单个客户端对象支持发布和订阅(另一种选择是使用单独的客户端类来进行发布和订阅)。
具有自动重新连接功能的 MQTT 客户端
有一个单独的 umqtt.robust 模块,它构建在 umqtt.simple 之上,并在出现网络错误 时添加自动重新连接支持。 请参阅其 documentation 了解更多详细信息。
带有 SSL 文件的 MQTT 客户端
有一个单独的 umqtt.default 模块,它构建在 umqtt.robust 之上,并且支持 SSL 证 书以文件方式传入并为每一个订阅主题设置回调传递。 请参阅其 documentation 了解更多详细信息。
API设计
基于上述需求, API 具有以下特征:
所有与 MQTT 消息相关的数据都编码为字节。这包括消息内容和主题名称(即使 MQTT 规范声 明主题名称是 UTF-8 编码的)。原因很简单:通过网络套接字接收到的是二进制数据(字节), 需要额外的步骤将其转换为字符串,从而消耗内存。请注意,这仅适用于主题名称(因为它们 既可以发送也可以接收)。 MQTT 指定为 UTF-8 编码的其他参数(例如 ClientID )被接受为 字符串。
订阅的消息通过回调传递。这是为了避免对订阅的消息使用队列,否则它们可能会随时收到(包 括当客户端期望其他类型的服务器响应时),因此有两种选择:要么通过回调立即传递它们,要 么排队直到“预期”响应到达)。请注意,不需要队列是错误的:在这种情况下,运行时调用堆栈 形成隐式队列。 与显式队列不同,它更难控制。选择这种设计是因为在处理订阅消息的常见情 况下,它是最有效的。然而,如果在订阅回调中,发布了 QoS > 0 的新消息,这可能会导致 深度或无限递归(后者意味着应用程序将因 “RuntimeException” 而终止)。
Usage Model:
# uiflow2默认使用这个类
from umqtt import MQTTClient
# 如果想要使用 `umqtt.default` module ,请通过这种方式。
from umqtt.simple import MQTTClient
# 如果想要使用 `umqtt.robust` module ,请通过这种方式。
from umqtt.robust import MQTTClient