一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀(guān)看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何使用Rust語(yǔ)言和rumqttc模塊實(shí)現(xiàn)MQTT協(xié)議的異步API

科技綠洲 ? 來(lái)源:TinyZ ? 作者:TinyZ ? 2023-09-19 14:45 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

MQTT(Message Queuing Telemetry Transport)是一種輕量級(jí)的消息傳輸協(xié)議,適用于物聯(lián)網(wǎng)設(shè)備和低帶寬、不穩(wěn)定網(wǎng)絡(luò)環(huán)境下的數(shù)據(jù)傳輸。Rust語(yǔ)言是一種安全、高效、并發(fā)的系統(tǒng)編程語(yǔ)言,非常適合開(kāi)發(fā)物聯(lián)網(wǎng)設(shè)備和后端服務(wù)。本教程將介紹如何使用Rust語(yǔ)言和rumqttc模塊實(shí)現(xiàn)MQTT協(xié)議的異步API,并提供幾個(gè)相關(guān)的代碼示例,最佳實(shí)踐和教程總結(jié)。

本篇內(nèi)容主要圍繞 rumqttc模塊的 AsyncClient 進(jìn)行,講解異步API相關(guān)的內(nèi)容.
在Cargo.toml文件中添加依賴(lài):

[dependencies]
rumqttc = "0.21.0"

然后我們就可以開(kāi)始編寫(xiě)代碼了。

連接和訂閱

首先需要連接到MQTT服務(wù)器,并訂閱一個(gè)主題??梢允褂胷umqttc模塊提供的異步API實(shí)現(xiàn)。以下是示例代碼:

use rumqttc::{AsyncClient, Event, Incoming, MqttOptions, QoS};

#[tokio::main]
async fn main() {
    let mqtt_options = MqttOptions::new("test-async", "mqtt.eclipseprojects.io", 1883);
    let (mut client, mut event_loop) = AsyncClient::new(mqtt_options, 10);

    // Connect to the broker
    client.connect().await.unwrap();

    // Subscribe to a topic
    client.subscribe("test/topic", QoS::AtMostOnce).await.unwrap();

    // Handle incoming events
    while let Some(event) = event_loop.poll().await.unwrap() {
        match event {
            Event::Incoming(Incoming::Publish(p)) = > {
                println!("Received message: {:?}", p.payload);
            }
            _ = > {}
        }
    }
}

該代碼創(chuàng)建了一個(gè)異步客戶(hù)端,連接到了MQTT服務(wù)器,并訂閱了一個(gè)主題。在事件循環(huán)中處理接收到的消息,如果是Publish事件,則打印出消息內(nèi)容。

發(fā)布消息

可以使用異步客戶(hù)端的publish方法發(fā)布消息。以下是示例代碼:

use rumqttc::{AsyncClient, MqttOptions, QoS};

#[tokio::main]
async fn main() {
    let mqtt_options = MqttOptions::new("test-async", "mqtt.eclipseprojects.io", 1883);
    let (mut client, _) = AsyncClient::new(mqtt_options, 10);

    // Connect to the broker
    client.connect().await.unwrap();

    // Publish a message
    client.publish("test/topic", QoS::AtMostOnce, false, b"Hello, MQTT!").await.unwrap();
}

該代碼創(chuàng)建了一個(gè)異步客戶(hù)端,連接到了MQTT服務(wù)器,并發(fā)布了一條消息到指定主題。

斷開(kāi)連接

可以使用異步客戶(hù)端的disconnect方法斷開(kāi)連接。以下是示例代碼:

use rumqttc::{AsyncClient, MqttOptions};

#[tokio::main]
async fn main() {
    let mqtt_options = MqttOptions::new("test-async", "mqtt.eclipseprojects.io", 1883);
    let (mut client, _) = AsyncClient::new(mqtt_options, 10);

    // Connect to the broker
    client.connect().await.unwrap();

    // Disconnect from the broker
    client.disconnect().await.unwrap();
}

該代碼創(chuàng)建了一個(gè)異步客戶(hù)端,連接到了MQTT服務(wù)器,并斷開(kāi)了連接。

處理連接錯(cuò)誤

在連接或訂閱過(guò)程中可能會(huì)出現(xiàn)錯(cuò)誤,需要進(jìn)行錯(cuò)誤處理??梢允褂肦ust語(yǔ)言提供的Result類(lèi)型和match語(yǔ)句處理錯(cuò)誤。以下是示例代碼:

use rumqttc::{AsyncClient, MqttOptions, QoS};

#[tokio::main]
async fn main() {
    let mqtt_options = MqttOptions::new("test-async", "mqtt.eclipseprojects.io", 1883);
    let (mut client, mut event_loop) = AsyncClient::new(mqtt_options, 10);

    // Connect to the broker
    if let Err(e) = client.connect().await {
        eprintln!("Failed to connect: {}", e);
        return;
    }

    // Subscribe to a topic
    if let Err(e) = client.subscribe("test/topic", QoS::AtMostOnce).await {
        eprintln!("Failed to subscribe: {}", e);
        return;
    }

    // Handle incoming events
    while let Some(event) = event_loop.poll().await {
        match event {
            Ok(Event::Incoming(Incoming::Publish(p))) = > {
                println!("Received message: {:?}", p.payload);
            }
            Err(e) = > {
                eprintln!("Error: {}", e);
                break;
            }
            _ = > {}
        }
    }

    // Disconnect from the broker
    if let Err(e) = client.disconnect().await {
        eprintln!("Failed to disconnect: {}", e);
    }
}

該代碼在連接或訂閱失敗時(shí)打印錯(cuò)誤信息,并退出程序。

使用TLS加密連接

可以使用TLS加密連接來(lái)保護(hù)數(shù)據(jù)傳輸?shù)陌踩???梢允褂肕qttOptions的tls選項(xiàng)指定TLS配置。以下是示例代碼:

use rumqttc::{AsyncClient, MqttOptions, QoS};

#[tokio::main]
async fn main() {
    let mqtt_options = MqttOptions::new("test-async", "mqtt.eclipseprojects.io", 8883)
        .set_tls(rumqttc::TlsOptions::default());
    let (mut client, mut event_loop) = AsyncClient::new(mqtt_options, 10);

    // Connect to the broker
    client.connect().await.unwrap();

    // Subscribe to a topic
    client.subscribe("test/topic", QoS::AtMostOnce).await.unwrap();

    // Handle incoming events
    while let Some(event) = event_loop.poll().await.unwrap() {
        match event {
            Event::Incoming(Incoming::Publish(p)) = > {
                println!("Received message: {:?}", p.payload);
            }
            _ = > {}
        }
    }

    // Disconnect from the broker
    client.disconnect().await.unwrap();
}

該代碼使用TLS加密連接到了MQTT服務(wù)器。

總結(jié)

本教程介紹了如何使用Rust語(yǔ)言和rumqttc模塊實(shí)現(xiàn)MQTT協(xié)議的異步API,并提供了代碼示例,最佳實(shí)踐和教程總結(jié)。使用異步API可以提高性能和并發(fā)處理能力,使用Result類(lèi)型和match語(yǔ)句處理錯(cuò)誤可以避免程序崩潰,使用TLS加密連接保護(hù)數(shù)據(jù)傳輸?shù)陌踩?,使用QoS選項(xiàng)控制消息傳輸?shù)目煽啃院托剩褂胹ubscribe方法訂閱主題,使用publish方法發(fā)布消息,使用disconnect方法斷開(kāi)連接。Rust語(yǔ)言和rumqttc模塊是開(kāi)發(fā)物聯(lián)網(wǎng)設(shè)備和后端服務(wù)的有力工具。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀(guān)點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2788

    瀏覽量

    50360
  • API
    API
    +關(guān)注

    關(guān)注

    2

    文章

    1613

    瀏覽量

    64015
  • 傳輸協(xié)議
    +關(guān)注

    關(guān)注

    0

    文章

    79

    瀏覽量

    11734
  • MQTT
    +關(guān)注

    關(guān)注

    5

    文章

    682

    瀏覽量

    23710
  • MQTT協(xié)議
    +關(guān)注

    關(guān)注

    0

    文章

    99

    瀏覽量

    5940
  • rust語(yǔ)言
    +關(guān)注

    關(guān)注

    0

    文章

    57

    瀏覽量

    3145
  • Rust
    +關(guān)注

    關(guān)注

    1

    文章

    234

    瀏覽量

    7094
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    如何使用Rust語(yǔ)言和paho-mqtt模塊實(shí)現(xiàn)MQTT協(xié)議

    模塊實(shí)現(xiàn)MQTT協(xié)議,并重點(diǎn)介紹LWT特征。 Rust是一種系統(tǒng)級(jí)編程語(yǔ)言,它的主要特點(diǎn)是安全、
    的頭像 發(fā)表于 09-19 14:41 ?2316次閱讀

    什么是Tokio模塊 Channel?

    Rust 語(yǔ)言是一種系統(tǒng)級(jí)編程語(yǔ)言,它具有強(qiáng)類(lèi)型和內(nèi)存安全性。Rust 語(yǔ)言中的 Tokio 模塊
    的頭像 發(fā)表于 09-19 15:57 ?1343次閱讀

    Rust語(yǔ)言如何與 InfluxDB 集成

    Rust 是一種系統(tǒng)級(jí)編程語(yǔ)言,具有高性能和內(nèi)存安全性。InfluxDB 是一個(gè)開(kāi)源的時(shí)間序列數(shù)據(jù)庫(kù),用于存儲(chǔ)、查詢(xún)和可視化大規(guī)模數(shù)據(jù)集。Rust 語(yǔ)言可以與 InfluxDB 集成,
    的頭像 發(fā)表于 09-30 16:45 ?1478次閱讀

    Rust 語(yǔ)言中的 RwLock內(nèi)部實(shí)現(xiàn)原理

    Rust是一種系統(tǒng)級(jí)編程語(yǔ)言,它帶有嚴(yán)格的內(nèi)存管理、并發(fā)和安全性規(guī)則,因此很受廣大程序員的青睞。RwLock(讀寫(xiě)鎖)是 Rust 中常用的線(xiàn)程同步機(jī)制之一,本文將詳細(xì)介紹 Rust
    的頭像 發(fā)表于 09-20 11:23 ?1195次閱讀

    paho-mqtt模塊實(shí)戰(zhàn)

    的編程語(yǔ)言,它在系統(tǒng)編程和網(wǎng)絡(luò)編程方面有著很好的表現(xiàn)。在本教程中,我們將介紹如何使用Rust語(yǔ)言和paho-mqtt模塊
    的頭像 發(fā)表于 09-20 11:33 ?1776次閱讀

    MQTT協(xié)議介紹之一:發(fā)布/訂閱

    在機(jī)智云的整個(gè)架構(gòu)里面,如上圖,GAgent實(shí)現(xiàn)了從模塊到云端的數(shù)據(jù)交互,其實(shí)GAgent里面就是用MQTT協(xié)議實(shí)現(xiàn)的,可見(jiàn)
    發(fā)表于 08-25 19:58

    【MYD-Y6ULX申請(qǐng)】基于4G技術(shù)和MQTT協(xié)議的物聯(lián)網(wǎng)通信模塊

    資源的應(yīng)用2 MYD-Y6ULX開(kāi)發(fā)板連接EC20模塊,驅(qū)動(dòng)和應(yīng)用3 采用Go或Rust語(yǔ)言做為MYD-Y6ULX開(kāi)發(fā)板的主編程語(yǔ)言,構(gòu)建安全的應(yīng)用程序4 MYD-Y6ULX開(kāi)發(fā)板應(yīng)用
    發(fā)表于 01-02 16:57

    通訊C#編程上位機(jī)語(yǔ)言和PLC是如何實(shí)現(xiàn)通訊的

    ABPLC通訊協(xié)議過(guò)程是怎樣的?通訊C#編程上位機(jī)語(yǔ)言和PLC是如何實(shí)現(xiàn)通訊的?
    發(fā)表于 09-29 06:57

    RyanMqtt實(shí)現(xiàn)MQTT3.1.1協(xié)議的客戶(hù)端

    還沒(méi)有同步到packages庫(kù)列表,暫時(shí)還無(wú)法在軟件包列表搜索到。提pr應(yīng)該3天了…….介紹RyanMqtt 實(shí)現(xiàn)MQTT3.1.1 協(xié)議的客戶(hù)端。此庫(kù)針對(duì)資源受限的嵌入式設(shè)備進(jìn)行了優(yōu)化。初衷:在
    發(fā)表于 12-01 15:19

    MQTT協(xié)議采集網(wǎng)關(guān)可自定義格式

    取出設(shè)備地址、寄存器地址和數(shù)據(jù)等內(nèi)容;最后,將這些內(nèi)容通過(guò)MQTT協(xié)議發(fā)布到指定的主題上,以便遠(yuǎn)程客戶(hù)端可以訂閱并獲取數(shù)據(jù)。 對(duì)于TCP轉(zhuǎn)MQTT網(wǎng)關(guān)的實(shí)現(xiàn),我們需要使用編程
    發(fā)表于 10-09 19:33

    如何采用mqtt協(xié)議實(shí)現(xiàn)物聯(lián)網(wǎng)模塊消息推送?

    如何采用mqtt協(xié)議實(shí)現(xiàn)物聯(lián)網(wǎng)模塊消息推送
    發(fā)表于 11-03 06:55

    支持MQTT協(xié)議的WiFi模塊介紹_ SKYLAB

    MQTT 最初由 IBM 于上世紀(jì) 90 年代晚期發(fā)明和開(kāi)發(fā)。它最初的用途是將石油管道上的傳感器與衛(wèi)星相鏈接。顧名思義,它是一種支持在各方之間異步通信的消息協(xié)議異步消息
    的頭像 發(fā)表于 03-07 15:25 ?8550次閱讀

    如何在同步的Rust方法中調(diào)用異步代碼呢?

    在同步的 Rust 方法中調(diào)用異步代碼經(jīng)常會(huì)導(dǎo)致一些問(wèn)題,特別是對(duì)于不熟悉異步 Rust runtime 底層原理的初學(xué)者。
    的頭像 發(fā)表于 03-17 09:18 ?2558次閱讀

    rumqttc模塊應(yīng)用實(shí)踐

    ,如QoS,保留消息,遺囑消息等,使得它非常適合物聯(lián)網(wǎng)設(shè)備之間的通信。 Rust是一種系統(tǒng)級(jí)編程語(yǔ)言,具有內(nèi)存安全和高性能的特性。Rust語(yǔ)言的主要目標(biāo)是提供一種安全、并發(fā)、實(shí)用的編程
    的頭像 發(fā)表于 09-20 11:36 ?1361次閱讀

    如何實(shí)現(xiàn)MQTT協(xié)議數(shù)據(jù)傳輸?

    如何實(shí)現(xiàn)MQTT協(xié)議數(shù)據(jù)傳輸? 隨著物聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,越來(lái)越多的設(shè)備和應(yīng)用需要實(shí)現(xiàn)互聯(lián)互通。而MQTT作為一種輕量級(jí)的發(fā)布/訂閱消息傳輸
    的頭像 發(fā)表于 11-15 17:23 ?1462次閱讀