MQTT(Message Queuing Telemetry Transport)是一種輕量級的消息傳輸協(xié)議,它被設計用于低帶寬和不穩(wěn)定網(wǎng)絡環(huán)境下的物聯(lián)網(wǎng)設備通信。Rust是一種安全、并發(fā)和高效的編程語言,它在系統(tǒng)編程和網(wǎng)絡編程方面有著很好的表現(xiàn)。在本教程中,我們將介紹如何使用Rust語言和paho-mqtt模塊實現(xiàn)MQTT協(xié)議的應用。
前面寫過3篇介紹
rumqttc的教程,本篇開始使用paho-mqtt模塊是c庫的封裝, 支持v5協(xié)議,qos 2等更復雜的特性。
環(huán)境準備
我們需要先安裝好相關的開發(fā)環(huán)境。在Cargo.toml中添加依賴:
paho-mqtt = "0.12.1"
連接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);
}
在上面的示例代碼中,我們首先創(chuàng)建了一個MQTT客戶端對象,并指定了MQTT服務器的地址。然后,我們創(chuàng)建了一個連接選項對象,并設置了心跳間隔和會話清除標志。最后,我們使用連接選項對象連接到MQTT服務器,并打印連接響應信息。
發(fā)布MQTT消息
在連接到MQTT服務器之后,我們可以使用MQTT客戶端對象來發(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服務器,然后創(chuàng)建了一個MQTT消息對象,并設置了消息主題、消息負載和消息服務質(zhì)量等級。最后,我們使用MQTT客戶端對象來發(fā)布消息,并打印發(fā)布響應信息。
訂閱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服務器,然后創(chuàng)建了一個MQTT訂閱對象,并設置了訂閱主題和服務質(zhì)量等級。最后,我們使用MQTT客戶端對象來訂閱主題,并打印訂閱響應信息。
同時發(fā)布和訂閱MQTT消息
在使用MQTT協(xié)議時,我們通常需要同時發(fā)布和訂閱MQTT消息。以下是同時發(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服務器,然后創(chuàng)建了一個MQTT訂閱對象,并設置了訂閱主題和服務質(zhì)量等級。接著,我們創(chuàng)建了一個MQTT消息對象,并使用MQTT客戶端對象來發(fā)布消息。最后,我們使用MQTT客戶端對象來接收消息,并打印接收到的消息。
斷開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);
    cli.disconnect(None).unwrap();
    println!("Disconnected from MQTT server.");
}
在上面的示例代碼中,我們首先連接到MQTT服務器,然后使用MQTT客戶端對象來斷開與MQTT服務器的連接,并打印斷開連接信息。
進階使用
在本節(jié)中,我們將介紹如何使用Rust語言和paho-mqtt模塊實現(xiàn)MQTT協(xié)議的進階應用。我們將提供2個示例,分別是:
- 使用SSL/TLS連接MQTT服務器
 
- 使用認證機制連接MQTT服務器
 
使用SSL/TLS連接MQTT服務器
在使用MQTT協(xié)議時,我們通常需要使用SSL/TLS協(xié)議來保證通信安全。以下是使用SSL/TLS連接MQTT服務器的示例代碼:
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)建了一個MQTT客戶端對象,并指定了使用SSL/TLS協(xié)議連接MQTT服務器的地址。然后,我們創(chuàng)建了一個SSL/TLS配置對象,并從PEM文件中加載證書。接著,我們創(chuàng)建了一個SSL/TLS會話對象,并使用SSL/TLS配置對象和MQTT服務器地址來初始化會話對象。最后,我們創(chuàng)建了一個連接選項對象,并設置了心跳間隔、SSL/TLS選項和會話清除標志。我們使用連接選項對象連接到MQTT服務器,并打印連接響應信息。
使用認證機制連接MQTT服務器
在使用MQTT協(xié)議時,我們通常需要使用認證機制來保證通信安全。以下是使用認證機制連接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);
}
在上面的示例代碼中,我們首先創(chuàng)建了一個MQTT客戶端對象,并指定了MQTT服務器的地址。然后,我們創(chuàng)建了一個連接選項對象,并設置了心跳間隔、用戶名、密碼和會話清除標志。我們使用連接選項對象連接到MQTT服務器,并打印連接響應信息。
總結(jié)
在本教程中,我們介紹了如何使用Rust語言和paho-mqtt模塊實現(xiàn)MQTT協(xié)議的應用。我們提供了幾個基礎應用的示例代碼,包括連接MQTT服務器、發(fā)布MQTT消息、訂閱MQTT主題、同時發(fā)布和訂閱MQTT消息和斷開MQTT服務器連接。
- 
                                模塊
                                +關注
關注
7文章
2818瀏覽量
52589 - 
                                網(wǎng)絡
                                +關注
關注
14文章
8065瀏覽量
92606 - 
                                傳輸協(xié)議
                                +關注
關注
0文章
80瀏覽量
11896 - 
                                MQTT
                                +關注
關注
5文章
711瀏覽量
24640 - 
                                rust語言
                                +關注
關注
0文章
57瀏覽量
3233 
發(fā)布評論請先 登錄
如何使用Rust語言和paho-mqtt模塊實現(xiàn)MQTT協(xié)議
使用paho-mqtt里例程連接服務器失敗怎么解決?
paho-mqtt pipe和socket同時發(fā)送會導致pipe數(shù)據(jù)丟失怎么解決?
如何在鴻蒙系統(tǒng)中移植 Paho-MQTT 實現(xiàn)MQTT協(xié)議
【直播預熱】Harmony MQTT/CoAP應用指南——火熱報名中
如何使用paho-mqtt框架實現(xiàn)溫濕度數(shù)據(jù)的實時顯示?
基于Eclipse paho-mqtt源碼包的MQTT客戶端設計(上)
基于Eclipse paho-mqtt源碼包的MQTT客戶端設計(下)
新手求助MQTT選擇哪個軟件包比較合適呢?
paho-mqtt重連后AT發(fā)送會報錯是什么原因?
paho在OneNET平臺的應用
在鴻蒙系統(tǒng)中移植Paho-MQTT實現(xiàn)MQTT協(xié)議的詳細教程
    
如何在Python中使用MQTT
    
          
        
        
paho-mqtt模塊實戰(zhàn)
                
 
           
            
            
                
            
評論