rumqttc 是用 Rust 开发的开源rumqtt库集合的一部分,是一个用户友好的高级MQTT客户端期待什么:在这篇文章中,我们将仔细研究 rumqttc 的内部工作原理,揭示其核心机制,以了解它如何有效地管理 MQTT 通信。

开源rumqtt库集合:

https://github.com/bytebeamio/rumqtt

了解 rumqttc 中的事件

在 rumqttc 的核心,每项活动都由 表示Event这些事件分为Event::Incoming  和Event::Outgoing,分别表示传入和传出数据包。

这与我们轮询事件循环时返回的结果相同吗?Event

是的,当我们轮询事件循环时,Event会返回一个。让我们看看事件何时创建以及 Eventloop 是如何工作的。解压 rumqttc:其内部工作原理的简单指南

当我们深入研究事件循环(驱动 rumqttc 的引擎)时,它会同时处理多个任务。它从网络读取数据包,发送定期 ping 以保持会话活动,并处理客户端生成的发送数据包的请求。这个多任务处理引擎可确保 rumqttc 中的每项操作响应迅速且高效。

这就是为什么您必须轮询事件循环才能取得进展吗?

正确的。事件循环是客户端的核心,就像rumqttc的心脏一样。

首先,我们将探讨如何处理传入数据包。当事件循环从网络(代理)接收数据包时,它最初会根据 MQTT 标准对它们进行管理,例如为已发布的数据包调度确认。随后,Event::Incoming(Packet) 被添加到每个数据包的事件循环状态中。

由于数据包是分组处理的,因此多个数据包会导致为每个数据包创建一个单独的事件。在事件循环轮询期间,在循环尝试从网络检索新数据包之前,会立即优先处理状态中现有的待处理事件。

那么如何向代理发送数据包呢?

这就是Request出现的地方。Request基本上是发送数据包的请求。

当需要将数据包分派到网络时,需要向事件循环发出请求该请求封装在RequestRequest可以体现客户端可能根据 MQTT 标准发送到代理的任何形式的数据包,例如发布、puback、订阅、ping、断开连接等。

但我该如何创建这些请求呢?

为了生成请求并将请求分派到事件循环,Client在 rumqttc 中使用了 。在 rumqttc 中构建客户端的过程如下:

let (client, eventloop) = AsyncClient::new(..);

这里,该new(..)方法产生一个包含 的元组(AsyncClient, Eventloop)我们已经介绍了Eventloop,并且本质上充当了指向事件循环的AsyncClient管道。Request例如,client. publish(..)在内部调用制定 aRequest::Publish(..)并将其转发到事件循环。此过程与客户端上可用的其他方法类似,例如.subscribe(..).ack(..).disconnect(..)等。

AsyncClientClient::new(..)returnsConnection而不是 不同Eventloop,同步客户端有什么不同吗?

不,不是真的!Connection只需封装Eventloop,允许在您的代码中使用它,而不需要异步操作。.poll()您可以使用connection.recv()或来进行操作,而不是使用connection.iter()

这本质上就是它的归结!

那么我们来总结一下吧!

Eventloop 致力于从网络读取数据包、传输 ping 或处理客户端生成的发送数据包的请求。在整个这些过程中,它使用事件来让我们了解正在发生的特定活动。

加入 rumqttc 社区

rumqttc 不仅仅是一个图书馆;这是社区的努力。请随意深入研究 rumqttc 文档、探索示例并为其开发做出贡献。无论您是打开问题、提交 PR,还是只是为存储库加注星标,您的参与都有助于构建快速、强大且一流的 MQTT 客户端。

rumqttc 的设计巧妙地抽象了 MQTT 通信的复杂性,提供了强大且灵活的用户友好界面。通过了解其核心机制,您可以在物联网项目中充分发挥其潜力。快乐编码!