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个示例,分别是:
- 使用SSL/TLS连接MQTT服务器
- 使用认证机制连接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服务器连接。
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!