MQTT(Message Queuing Telemetry Transport)是一種輕量級(jí)的消息傳輸協(xié)議,它被設(shè)計(jì)用于低帶寬和不穩(wěn)定網(wǎng)絡(luò)環(huán)境下的物聯(lián)網(wǎng)設(shè)備通信。Rust是一種安全、并發(fā)和高效的編程語(yǔ)言,它在系統(tǒng)編程和網(wǎng)絡(luò)編程方面有著很好的表現(xiàn)。在本教程中,我們將介紹如何使用Rust語(yǔ)言和paho-mqtt模塊實(shí)現(xiàn)MQTT協(xié)議的應(yīng)用。
前面寫(xiě)過(guò)3篇介紹
rumqttc
的教程,本篇開(kāi)始使用paho-mqtt
模塊是c庫(kù)的封裝, 支持v5協(xié)議,qos 2等更復(fù)雜的特性。
環(huán)境準(zhǔn)備
我們需要先安裝好相關(guān)的開(kāi)發(fā)環(huán)境。在Cargo.toml中添加依賴:
paho-mqtt = "0.12.1"
連接MQTT服務(wù)器
在使用MQTT協(xié)議之前,我們需要先連接到MQTT服務(wù)器。以下是連接MQTT服務(wù)器的示例代碼:
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);
}
在上面的示例代碼中,我們首先創(chuàng)建了一個(gè)MQTT客戶端對(duì)象,并指定了MQTT服務(wù)器的地址。然后,我們創(chuàng)建了一個(gè)連接選項(xiàng)對(duì)象,并設(shè)置了心跳間隔和會(huì)話清除標(biāo)志。最后,我們使用連接選項(xiàng)對(duì)象連接到MQTT服務(wù)器,并打印連接響應(yīng)信息。
發(fā)布MQTT消息
在連接到MQTT服務(wù)器之后,我們可以使用MQTT客戶端對(duì)象來(lái)發(fā)布消息。以下是發(fā)布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服務(wù)器,然后創(chuàng)建了一個(gè)MQTT消息對(duì)象,并設(shè)置了消息主題、消息負(fù)載和消息服務(wù)質(zhì)量等級(jí)。最后,我們使用MQTT客戶端對(duì)象來(lái)發(fā)布消息,并打印發(fā)布響應(yīng)信息。
訂閱MQTT主題
在使用MQTT協(xié)議之前,我們需要先訂閱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服務(wù)器,然后創(chuàng)建了一個(gè)MQTT訂閱對(duì)象,并設(shè)置了訂閱主題和服務(wù)質(zhì)量等級(jí)。最后,我們使用MQTT客戶端對(duì)象來(lái)訂閱主題,并打印訂閱響應(yīng)信息。
同時(shí)發(fā)布和訂閱MQTT消息
在使用MQTT協(xié)議時(shí),我們通常需要同時(shí)發(fā)布和訂閱MQTT消息。以下是同時(shí)發(fā)布和訂閱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服務(wù)器,然后創(chuàng)建了一個(gè)MQTT訂閱對(duì)象,并設(shè)置了訂閱主題和服務(wù)質(zhì)量等級(jí)。接著,我們創(chuàng)建了一個(gè)MQTT消息對(duì)象,并使用MQTT客戶端對(duì)象來(lái)發(fā)布消息。最后,我們使用MQTT客戶端對(duì)象來(lái)接收消息,并打印接收到的消息。
斷開(kāi)MQTT服務(wù)器連接
在使用MQTT協(xié)議之后,我們需要斷開(kāi)與MQTT服務(wù)器的連接。以下是斷開(kāi)MQTT服務(wù)器連接的示例代碼:
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服務(wù)器,然后使用MQTT客戶端對(duì)象來(lái)斷開(kāi)與MQTT服務(wù)器的連接,并打印斷開(kāi)連接信息。
進(jìn)階使用
在本節(jié)中,我們將介紹如何使用Rust語(yǔ)言和paho-mqtt模塊實(shí)現(xiàn)MQTT協(xié)議的進(jìn)階應(yīng)用。我們將提供2個(gè)示例,分別是:
- 使用SSL/TLS連接MQTT服務(wù)器
- 使用認(rèn)證機(jī)制連接MQTT服務(wù)器
使用SSL/TLS連接MQTT服務(wù)器
在使用MQTT協(xié)議時(shí),我們通常需要使用SSL/TLS協(xié)議來(lái)保證通信安全。以下是使用SSL/TLS連接MQTT服務(wù)器的示例代碼:
extern crate paho_mqtt as mqtt;
extern crate rustls;
use std::fs::File;
use std::io::BufReader;
use std::sync::Arc;
fn main() {
let host = "ssl://localhost:8883";
let cli = mqtt::Client::new(host).unwrap();
let mut config = rustls::ClientConfig::new();
let cert_file = &mut BufReader::new(File::open("cert.pem").unwrap());
config.root_store.add_pem_file(cert_file).unwrap();
let tls = Arc::new(rustls::ClientSession::new(&Arc::new(config), host));
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);
}
在上面的示例代碼中,我們首先創(chuàng)建了一個(gè)MQTT客戶端對(duì)象,并指定了使用SSL/TLS協(xié)議連接MQTT服務(wù)器的地址。然后,我們創(chuàng)建了一個(gè)SSL/TLS配置對(duì)象,并從PEM文件中加載證書(shū)。接著,我們創(chuàng)建了一個(gè)SSL/TLS會(huì)話對(duì)象,并使用SSL/TLS配置對(duì)象和MQTT服務(wù)器地址來(lái)初始化會(huì)話對(duì)象。最后,我們創(chuàng)建了一個(gè)連接選項(xiàng)對(duì)象,并設(shè)置了心跳間隔、SSL/TLS選項(xiàng)和會(huì)話清除標(biāo)志。我們使用連接選項(xiàng)對(duì)象連接到MQTT服務(wù)器,并打印連接響應(yīng)信息。
使用認(rèn)證機(jī)制連接MQTT服務(wù)器
在使用MQTT協(xié)議時(shí),我們通常需要使用認(rèn)證機(jī)制來(lái)保證通信安全。以下是使用認(rèn)證機(jī)制連接MQTT服務(wù)器的示例代碼:
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);
}
在上面的示例代碼中,我們首先創(chuàng)建了一個(gè)MQTT客戶端對(duì)象,并指定了MQTT服務(wù)器的地址。然后,我們創(chuàng)建了一個(gè)連接選項(xiàng)對(duì)象,并設(shè)置了心跳間隔、用戶名、密碼和會(huì)話清除標(biāo)志。我們使用連接選項(xiàng)對(duì)象連接到MQTT服務(wù)器,并打印連接響應(yīng)信息。
總結(jié)
在本教程中,我們介紹了如何使用Rust語(yǔ)言和paho-mqtt模塊實(shí)現(xiàn)MQTT協(xié)議的應(yīng)用。我們提供了幾個(gè)基礎(chǔ)應(yīng)用的示例代碼,包括連接MQTT服務(wù)器、發(fā)布MQTT消息、訂閱MQTT主題、同時(shí)發(fā)布和訂閱MQTT消息和斷開(kāi)MQTT服務(wù)器連接。
-
模塊
+關(guān)注
關(guān)注
7文章
2736瀏覽量
47767 -
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
7600瀏覽量
89280 -
傳輸協(xié)議
+關(guān)注
關(guān)注
0文章
79瀏覽量
11496 -
MQTT
+關(guān)注
關(guān)注
5文章
654瀏覽量
22709 -
rust語(yǔ)言
+關(guān)注
關(guān)注
0文章
57瀏覽量
3029
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
如何使用Rust語(yǔ)言和paho-mqtt模塊實(shí)現(xiàn)MQTT協(xié)議
如何在鴻蒙系統(tǒng)中移植 Paho-MQTT 實(shí)現(xiàn)MQTT協(xié)議
【HarmonyOS HiSpark Wi-Fi IoT套件】如何在鴻蒙系統(tǒng)中移植 Paho-MQTT 實(shí)現(xiàn)MQTT協(xié)議
【直播預(yù)熱】Harmony MQTT/CoAP應(yīng)用指南——火熱報(bào)名中
Harmony MQTT/CoAP應(yīng)用指南 【直播答疑】:參與直播的小伙伴們,如果您有任何疑問(wèn),可在我們電子發(fā)燒友論壇發(fā)帖提問(wèn)
如何使用paho-mqtt框架實(shí)現(xiàn)溫濕度數(shù)據(jù)的實(shí)時(shí)顯示?
基于Eclipse paho-mqtt源碼包的MQTT客戶端設(shè)計(jì)(上)
基于Eclipse paho-mqtt源碼包的MQTT客戶端設(shè)計(jì)(下)
新手求助MQTT選擇哪個(gè)軟件包比較合適呢?
paho-mqtt重連后AT發(fā)送會(huì)報(bào)錯(cuò)是什么原因?
paho在OneNET平臺(tái)的應(yīng)用
在鴻蒙系統(tǒng)中移植Paho-MQTT實(shí)現(xiàn)MQTT協(xié)議的詳細(xì)教程
![在鴻蒙系統(tǒng)中移植<b class='flag-5'>Paho-MQTT</b>實(shí)現(xiàn)<b class='flag-5'>MQTT</b>協(xié)議的詳細(xì)教程](https://file.elecfans.com/web1/M00/CB/A1/o4YBAF-TmTqARVlOAAA2PX5dbsg289.png)
如何在Python中使用MQTT
![如何在Python中使用<b class='flag-5'>MQTT</b>](https://file.elecfans.com/web2/M00/86/02/pYYBAGOjw72AYw0nAABWos5afvk869.png)
評(píng)論