#mqtt-client #mqtt #iot #async #client

nightly lmc

一个异步的,100% Rust 实现的 MQTTv3 客户端

3 个不稳定版本

0.2.0 2023年3月19日
0.1.1 2023年1月2日
0.1.0 2023年1月2日

#25 in #mqtt-client

每月 29 下载

MIT/Apache

330KB
4.5K SLoC

LMC - Rust 轻量级 MQTT 客户端

LMC 是一个 MQTT 客户端实现,旨在小巧(包括文档的“活动”代码少于 1k 行),最小化内存分配,尽可能少地使用 crates,并且是异步的(通过 tokio)。该项目采用 MIT 许可证或 Apache 许可证,您可以选择您更喜欢的。

目前市面上有一些现成的 MQTT 客户端 crates,但其中大多数都是 C/C++ 库的包装器,而纯 Rust 的那些则提供了基本的 API,不允许您在订阅主题时等待服务器的响应。这个 crates 让您能够对其所有方面进行精细控制,同时也提供了 无需烦恼易于使用 的函数,如果您只需要一个不关心性能的 MQTT 客户端。

使用示例

首先,将这个 crate 添加到您的 Cargo.toml 依赖中

[dependencies.lmc]
version = "^0.2"
features = ["tls"] # See below for available features

然后,您可以使用以下代码开始。请注意,此示例假设以下条件

  • 您的代理托管在本地机器上
  • 您的代理在 8883 端口使用 TLS
  • 您的代理证书由系统 CA 存储库中的证书颁发机构签名
  • 您可以使用用户名 username 和密码 password 登录
  • 您可以在 my_topic 主题上订阅和发布
use lmc::{Options, Client, QoS};

#[tokio::main]
async fn main()
{
    //You can disable TLS by skipping `.enable_tls().unwrap()`
    let mut opts = Options::new("client_id").enable_tls().unwrap();
    opts.set_username("username").set_password(b"password");

    //Connect to localhost using the default TLS port (8883)
    let (client, shutdown_handle) = Client::connect("localhost", opts).await.unwrap();

    //Subscribe to 'my_topic' using an unbounded Tokio MPSC channel
    let (subscription, sub_qos) = client.subscribe_unbounded("my_topic", QoS::AtLeastOnce).await.unwrap();
    println!("Subscribed to topic with QoS {:?}", sub_qos);
    client.publish_qos_1("my_topic", b"it works!", false, true).await.unwrap();

    let msg = subscription.recv().await.expect("Failed to await message");
    println!("Received {}", msg.payload_as_utf8().unwrap());

    shutdown_handle.disconnect().await.expect("Could not disconnect gracefully");
}

功能列表

以下功能可以启用/禁用

  • fxhash(默认)使用更快的哈希表,归功于 fxhash crate
  • parking_lot(默认)使用更快的、不会失败的互斥锁,归功于 parking_lot crate
  • tls (非默认) 用于 TLS 支持
  • dangerous_tls (非默认) 允许危险 TLS 函数,例如,允许您绕过服务器证书验证

理念

  • 依赖项较少:除非能提高性能,否则避免使用crate。尽可能通过特性使依赖项可选。
  • 不安全代码:在不安全代码可以轻易证明为安全的前提下,使用不安全代码来提高性能。

缺少的特性

目前,以下特性在LMC中不可用。根据需要,它们可能稍后实现。

  • WebSocket传输
  • 单个调用/数据包进行多次订阅

依赖项

~3–15MB
~190K SLoC