Rust语言从入门到精通系列 - paho-mqtt模块实战(入门)

1669 字
8 分钟
Rust语言从入门到精通系列 - paho-mqtt模块实战(入门)

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,它被设计用于低带宽和不稳定网络环境下的物联网设备通信。Rust是一种安全、并发和高效的编程语言,它在系统编程和网络编程方面有着很好的表现。在本教程中,我们将介绍如何使用Rust语言和paho-mqtt模块实现MQTT协议的应用。

前面写过3篇介绍 rumqttc 的教程,本篇开始使用 paho-mqtt 模块是c库的封装, 支持v5协议,qos 2等更复杂的特性。

环境准备#

我们需要先安装好相关的开发环境。在Cargo.toml中添加依赖:

paho-mqtt = "0.12.1"

连接MQTT服务器#

在使用MQTT协议之前,我们需要先连接到MQTT服务器。以下是连接MQTT服务器的示例代码:

extern crate paho_mqtt as mqtt;
fn main() {
let host = "tcp://localhost:1883";
let cli = mqtt::Client::new(host).unwrap();
let conn_opts = mqtt::ConnectOptionsBuilder::new()
.keep_alive_interval(std::time::Duration::from_secs(20))
.clean_session(false)
.finalize();
let response = cli.connect(conn_opts).unwrap();
println!("Connected to MQTT server: {:?}", response);
}

在上面的示例代码中,我们首先创建了一个MQTT客户端对象,并指定了MQTT服务器的地址。然后,我们创建了一个连接选项对象,并设置了心跳间隔和会话清除标志。最后,我们使用连接选项对象连接到MQTT服务器,并打印连接响应信息。

发布MQTT消息#

在连接到MQTT服务器之后,我们可以使用MQTT客户端对象来发布消息。以下是发布MQTT消息的示例代码:

extern crate paho_mqtt as mqtt;
fn main() {
let host = "tcp://localhost:1883";
let cli = mqtt::Client::new(host).unwrap();
let conn_opts = mqtt::ConnectOptionsBuilder::new()
.keep_alive_interval(std::time::Duration::from_secs(20))
.clean_session(false)
.finalize();
let response = cli.connect(conn_opts).unwrap();
println!("Connected to MQTT server: {:?}", response);
let topic = "test/topic";
let payload = "Hello, MQTT!";
let message = mqtt::MessageBuilder::new()
.topic(topic)
.payload(payload)
.qos(mqtt::QOS_1)
.finalize();
let response = cli.publish(message).unwrap();
println!("Published MQTT message: {:?}", response);
}

在上面的示例代码中,我们首先连接到MQTT服务器,然后创建了一个MQTT消息对象,并设置了消息主题、消息负载和消息服务质量等级。最后,我们使用MQTT客户端对象来发布消息,并打印发布响应信息。

订阅MQTT主题#

在使用MQTT协议之前,我们需要先订阅MQTT主题。以下是订阅MQTT主题的示例代码:

extern crate paho_mqtt as mqtt;
fn main() {
let host = "tcp://localhost:1883";
let cli = mqtt::Client::new(host).unwrap();
let conn_opts = mqtt::ConnectOptionsBuilder::new()
.keep_alive_interval(std::time::Duration::from_secs(20))
.clean_session(false)
.finalize();
let response = cli.connect(conn_opts).unwrap();
println!("Connected to MQTT server: {:?}", response);
let topic = "test/topic";
let qos = mqtt::QOS_1;
let response = cli.subscribe(topic, qos).unwrap();
println!("Subscribed to MQTT topic: {:?}", response);
}

在上面的示例代码中,我们首先连接到MQTT服务器,然后创建了一个MQTT订阅对象,并设置了订阅主题和服务质量等级。最后,我们使用MQTT客户端对象来订阅主题,并打印订阅响应信息。

同时发布和订阅MQTT消息#

在使用MQTT协议时,我们通常需要同时发布和订阅MQTT消息。以下是同时发布和订阅MQTT消息的示例代码:

extern crate paho_mqtt as mqtt;
fn main() {
let host = "tcp://localhost:1883";
let cli = mqtt::Client::new(host).unwrap();
let conn_opts = mqtt::ConnectOptionsBuilder::new()
.keep_alive_interval(std::time::Duration::from_secs(20))
.clean_session(false)
.finalize();
let response = cli.connect(conn_opts).unwrap();
println!("Connected to MQTT server: {:?}", response);
let topic = "test/topic";
let qos = mqtt::QOS_1;
let response = cli.subscribe(topic, qos).unwrap();
println!("Subscribed to MQTT topic: {:?}", response);
let payload = "Hello, MQTT!";
let message = mqtt::MessageBuilder::new()
.topic(topic)
.payload(payload)
.qos(mqtt::QOS_1)
.finalize();
let response = cli.publish(message).unwrap();
println!("Published MQTT message: {:?}", response);
for message in cli.start_consuming() {
println!("Received MQTT message: {:?}", message);
}
}

在上面的示例代码中,我们首先连接到MQTT服务器,然后创建了一个MQTT订阅对象,并设置了订阅主题和服务质量等级。接着,我们创建了一个MQTT消息对象,并使用MQTT客户端对象来发布消息。最后,我们使用MQTT客户端对象来接收消息,并打印接收到的消息。

断开MQTT服务器连接#

在使用MQTT协议之后,我们需要断开与MQTT服务器的连接。以下是断开MQTT服务器连接的示例代码:

extern crate paho_mqtt as mqtt;
fn main() {
let host = "tcp://localhost:1883";
let cli = mqtt::Client::new(host).unwrap();
let conn_opts = mqtt::ConnectOptionsBuilder::new()
.keep_alive_interval(std::time::Duration::from_secs(20))
.clean_session(false)
.finalize();
let response = cli.connect(conn_opts).unwrap();
println!("Connected to MQTT server: {:?}", response);
cli.disconnect(None).unwrap();
println!("Disconnected from MQTT server.");
}

在上面的示例代码中,我们首先连接到MQTT服务器,然后使用MQTT客户端对象来断开与MQTT服务器的连接,并打印断开连接信息。

进阶使用#

在本节中,我们将介绍如何使用Rust语言和paho-mqtt模块实现MQTT协议的进阶应用。我们将提供2个示例,分别是:

  1. 使用SSL/TLS连接MQTT服务器
  2. 使用认证机制连接MQTT服务器

使用SSL/TLS连接MQTT服务器#

在使用MQTT协议时,我们通常需要使用SSL/TLS协议来保证通信安全。以下是使用SSL/TLS连接MQTT服务器的示例代码:

extern crate paho_mqtt as mqtt;
use std::fs::File;
use std::io::BufReader;
use std::sync::Arc;
use rustls::ClientConfig;
fn main() {
let host = "ssl://localhost:8883";
let cli = mqtt::Client::new(host).unwrap();
let mut root_store = rustls::RootCertStore::empty();
let cert_file = &mut BufReader::new(File::open("cert.pem").unwrap());
root_store.add_pem_file(cert_file).unwrap();
let config = ClientConfig::builder()
.with_root_certificates(root_store)
.with_no_client_auth();
let tls = Arc::new(config);
let conn_opts = mqtt::ConnectOptionsBuilder::new()
.keep_alive_interval(std::time::Duration::from_secs(20))
.ssl_options(mqtt::SslOptionsBuilder::new()
.ssl_version(mqtt::SslVersion::TlsV1_2)
.server_name_indication(host)
.build(tls))
.clean_session(false)
.finalize();
let response = cli.connect(conn_opts).unwrap();
println!("Connected to MQTT server: {:?}", response);
}

在上面的示例代码中,我们首先创建了一个MQTT客户端对象,并指定了使用SSL/TLS协议连接MQTT服务器的地址。然后,我们使用rustls 0.20+的ClientConfig::builder()模式构建TLS配置,通过with_root_certificates()加载CA证书,通过with_no_client_auth()设置无需客户端认证。最后,我们创建了一个连接选项对象,并设置了心跳间隔、SSL/TLS选项和会话清除标志。我们使用连接选项对象连接到MQTT服务器,并打印连接响应信息。

使用认证机制连接MQTT服务器#

在使用MQTT协议时,我们通常需要使用认证机制来保证通信安全。以下是使用认证机制连接MQTT服务器的示例代码:

extern crate paho_mqtt as mqtt;
fn main() {
let host = "tcp://localhost:1883";
let cli = mqtt::Client::new(host).unwrap();
let username = "user";
let password = "password";
let conn_opts = mqtt::ConnectOptionsBuilder::new()
.keep_alive_interval(std::time::Duration::from_secs(20))
.user_name(username)
.password(password)
.clean_session(false)
.finalize();
let response = cli.connect(conn_opts).unwrap();
println!("Connected to MQTT server: {:?}", response);
}

在上面的示例代码中,我们首先创建了一个MQTT客户端对象,并指定了MQTT服务器的地址。然后,我们创建了一个连接选项对象,并设置了心跳间隔、用户名、密码和会话清除标志。我们使用连接选项对象连接到MQTT服务器,并打印连接响应信息。

总结#

在本教程中,我们介绍了如何使用Rust语言和paho-mqtt模块实现MQTT协议的应用。我们提供了几个基础应用的示例代码,包括连接MQTT服务器、发布MQTT消息、订阅MQTT主题、同时发布和订阅MQTT消息和断开MQTT服务器连接。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!

赞助
Rust语言从入门到精通系列 - paho-mqtt模块实战(入门)
https://tinyzzh.github.io/posts/2023-05-29-rust_mqtt_001_basic_overview/
作者
TinyZ Zzh
发布于
2023-05-29
许可协议
CC BY-NC-SA 4.0

评论区

Profile Image of the Author
TinyZ Zzh
专注于高并发服务器、网络游戏相关(Java、PHP、Unity3D、Unreal Engine等)技术,热爱游戏事业, 正在努力实现自我价值当中。
公告
欢迎来到我的博客!这是一则示例公告。
音乐
封面

音乐

暂未播放

0:00 0:00
暂无歌词
分类
标签
站点统计
文章
211
分类
38
标签
200
总字数
337,853
运行时长
0
最后活动
0 天前

文章目录