![解压 rumqttc:其内部工作原理的简单指南](https://iotsensor.cn/wp-content/uploads/2024/03/image-43.png)
解压 rumqttc:其内部工作原理的简单指南
rumqttc 是用 Rust 开发的开源rumqtt库集合的一部分,是一个用户友好的高级MQTT客户端。期待什么:在这篇文章中,我们将仔细研究 rumqttc 的内部工作原理,揭示其核心机制,以了解它如何有效地管理 MQTT 通信。
开源rumqtt库集合:
https://github.com/bytebeamio/rumqtt
了解 rumqttc 中的事件
在 rumqttc 的核心,每项活动都由 表示Event
。这些事件分为Event::Incoming
和Event::Outgoing
,分别表示传入和传出数据包。
这与我们轮询事件循环时返回的结果相同吗?Event
是的,当我们轮询事件循环时,Event
会返回一个。让我们看看事件何时创建以及 Eventloop 是如何工作的。
当我们深入研究事件循环(驱动 rumqttc 的引擎)时,它会同时处理多个任务。它从网络读取数据包,发送定期 ping 以保持会话活动,并处理客户端生成的发送数据包的请求。这个多任务处理引擎可确保 rumqttc 中的每项操作响应迅速且高效。
这就是为什么您必须轮询事件循环才能取得进展吗?
正确的。事件循环是客户端的核心,就像rumqttc的心脏一样。
首先,我们将探讨如何处理传入数据包。当事件循环从网络(代理)接收数据包时,它最初会根据 MQTT 标准对它们进行管理,例如为已发布的数据包调度确认。随后,Event::Incoming(Packet) 被添加到每个数据包的事件循环状态中。
由于数据包是分组处理的,因此多个数据包会导致为每个数据包创建一个单独的事件。在事件循环轮询期间,在循环尝试从网络检索新数据包之前,会立即优先处理状态中现有的待处理事件。
那么如何向代理发送数据包呢?
这就是Request
出现的地方。Request
基本上是发送数据包的请求。
当需要将数据包分派到网络时,需要向事件循环发出请求,该请求封装在Request
. 这Request
可以体现客户端可能根据 MQTT 标准发送到代理的任何形式的数据包,例如发布、puback、订阅、ping、断开连接等。
但我该如何创建这些请求呢?
为了生成请求并将请求分派到事件循环,Client
在 rumqttc 中使用了 。在 rumqttc 中构建客户端的过程如下:
let (client, eventloop) = AsyncClient::new(..);
这里,该new(..)
方法产生一个包含 的元组(AsyncClient, Eventloop)
。我们已经介绍了Eventloop
,并且本质上充当了指向事件循环的AsyncClient
管道。Request
例如,client.
publish(..)
在内部调用制定 aRequest::Publish(..)
并将其转发到事件循环。此过程与客户端上可用的其他方法类似,例如.subscribe(..)
、.ack(..)
、.disconnect(..)
等。
与AsyncClient
, Client::new(..)
returnsConnection
而不是 不同Eventloop
,同步客户端有什么不同吗?
不,不是真的!Connection
只需封装Eventloop
,允许在您的代码中使用它,而不需要异步操作。.poll()
您可以使用connection.recv()
或来进行操作,而不是使用connection.iter()
。
这本质上就是它的归结!
那么我们来总结一下吧!
Eventloop 致力于从网络读取数据包、传输 ping 或处理客户端生成的发送数据包的请求。在整个这些过程中,它使用事件来让我们了解正在发生的特定活动。
加入 rumqttc 社区
rumqttc 不仅仅是一个图书馆;这是社区的努力。请随意深入研究 rumqttc 文档、探索示例并为其开发做出贡献。无论您是打开问题、提交 PR,还是只是为存储库加注星标,您的参与都有助于构建快速、强大且一流的 MQTT 客户端。
rumqttc 的设计巧妙地抽象了 MQTT 通信的复杂性,提供了强大且灵活的用户友好界面。通过了解其核心机制,您可以在物联网项目中充分发挥其潜力。快乐编码!
10万+粉丝交流 了解更多物联网技术知识请
关注微信公众号:计算机程序吧
![物联网技术知识公众号:计算机程序吧 物联网技术知识公众号:计算机程序吧](https://iotsensor.cn/wp-content/uploads/2024/03/OK-min.png)