Rust是一种多范式编程语言,旨在提供性能和安全性,尤其擅长处理安全的并发编程。Rust在语法上类似于C++,但通过使用借用检查器来验证引用,可以保证内存安全。Rust可以在不使用垃圾回收的情况下实现内存安全,而引用计数是可选的。
MQTT是一种基于发布/订阅模型的轻量级物联网(IoT)消息传递协议。它可以使用很少的代码和带宽,为网络设备提供实时可靠的消息服务。此外,它广泛应用于物联网、移动互联网、智能硬件、智能汽车、电力和能源等行业。
本文主要介绍了如何在Rust项目中使用paho-mqtt客户端库,以及如何在客户端和MQTT代理之间实现连接、订阅、消息传递和取消订阅等功能。
目录
1.项目初始化
本项目使用Rust 1.75.0-nightly进行开发和测试,并使用Cargo 1.75.0-nightly包管理工具进行管理,读者可以使用以下命令检查当前的Rust版本。
(base) MacBook-Pro:hello-rust apple$ rustc --version
rustc 1.75.0-nightly (cae0791da 2023-10-05)
2.选择MQTT客户端库
paho-mqtt是当前Rust中最灵活和广泛使用的MQTT客户端库。最新版本0.7.1支持MQTT v5、3.1.1、3.1,还支持通过标准TCP、SSL / TLS、WebSockets进行数据传输,并提供了对QoS 0、1、2等的支持。
3.初始化项目
执行以下命令以创建一个名为mqtt-example的新Rust项目。
~ cargo new mqtt-example
Created binary (application) `mqtt-example` package
编辑项目中的Cargo.toml文件,并将paho-mqtt库的地址添加到依赖项中,并指定与订阅和发布代码文件对应的二进制文件。
[dependencies]
paho-mqtt = { git = "https://github.com/eclipse/paho.mqtt.rust.git", branch = "master" }
[[bin]]
name = "sub"
path = "src/sub/main.rs"
[[bin]]
name = "pub"
path = "src/pub/main.rs"
4.Rust中使用MQTT
创建客户端连接
本文将使用由EMQX提供的免费公共MQTT代理作为测试连接的MQTT代理。此服务基于EMQX的MQTT云服务创建。服务器访问信息如下:
- 代理服务器:broker.emqx.io
- TCP端口:1883
- Websocket端口:8083
配置MQTT代理连接参数
配置MQTT代理连接地址(包括端口)、主题(这里我们配置了两个主题)以及客户端ID。
const DFLT_BROKER:&str = "tcp://broker.emqx.io:1883";
const DFLT_CLIENT:&str = "rust_publish";
const DFLT_TOPICS:&[&str] = &["rust/mqtt", "rust/test"];
编写MQTT连接代码
编写MQTT连接代码,连接地址可以在执行二进制文件时作为命令行参数传递,以提高用户体验。通常,我们需要创建一个客户端,然后将其连接到broker.emqx.io。
let host = env::args().nth(1).unwrap_or_else(||
DFLT_BROKER.to_string()
);
// Define the set of opti