.NET 開源高性能 MQTT 類庫

来源:https://www.cnblogs.com/1312mn/p/18412658
-Advertisement-
Play Games

前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...


前言

隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。

MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。

本文將全面介紹 MQTTnet 的核心功能、顯著優勢及其廣泛的應用場景,幫助我們更好地利用工具提升物聯網項目的效率與可靠性。

項目介紹

MQTTnet 是一個跨平臺、高性能和開源的 MQTT 客戶端庫和服務端實現,是 .NET 平臺上主流的 MQTT 實現之一。

基於 MQTTnet,用戶可以方便地在 .NET 平臺上集成 MQTT 功能,實現 MQTT 協議的消息傳輸等功能。

它支持 .NET Standard 2.0 及以上版本,可在多版本 .NET 平臺上運行,包括 .NET Framework、.NET Core 和 Xamarin。

MQTTnet 提供同步和非同步操作、內置日誌記錄、QoS 支持等功能,並包含客戶端和伺服器組件,支持 MQTT 協議從 3.1.1 到 5.0 的版本。

功能說明

客戶端功能

MQTTnet 提供了強大的客戶端功能,能夠輕鬆連接到 MQTT 伺服器併進行通信。

其主要特性包括:

  • 連接管理: 支持與單個或多個伺服器建立和管理連接。

  • 消息發佈與訂閱: 支持不同 QoS 級別的消息發佈和訂閱,確保可靠傳輸。

  • 保持活動: 自動管理心跳,保持連接活躍。

  • 重連機制: 自動重連,確保通信穩定。

伺服器功能

MQTTnet 同時支持構建 MQTT 伺服器,可以創建自定義的 MQTT 服務。

其主要特性包括:

  • 連接管理: 支持大量併發連接。

  • 消息路由: 根據訂閱規則將消息路由到相應客戶端。

  • 安全機制: 支持多種身份驗證和授權機制。

  • 日誌與監控: 提供日誌記錄和監控功能,便於問題排查。

功能特點

1、客戶端和伺服器支持: MQTTnet 同時提供了客戶端和伺服器實現,便於構建完整的 MQTT 通信系統。

2、高性能: 採用非同步編程模型,確保高效的消息處理和傳輸。

3、跨平臺相容性: 相容多種 .NET Framework 版本,包括 .NET Core 及 .NET 5/6/7,支持不同操作系統和 CPU 架構。 易於使用: 提供簡潔的 API,方便開發者集成 MQTT 功能。

4、支持 MQTT v5: 支持 MQTT 最新版本 5 及其所有特性。

5、可擴展性: 設計靈活,允許自定義和擴展功能。

6、安全性: 支持 SSL/TLS 加密,保障通信安全。

7、輕量級: 體積小巧,適用於資源受限的 IoT 設備。

應用場景

MQTTnet 可用於構建多種基於 MQTT 協議的應用程式,包括:

  • 物聯網 (IoT): 適用於連接資源受限的設備,如感測器和執行器。
  • 車聯網: 用於連接車載設備並收集實時數據。
  • 工業自動化: 用於連接工業控制系統和設備。

使用方法

1、安裝 MQTTnet

需要將 MQTTnet 庫添加到項目中,使用 NuGet 包管理器進行安裝:

Install-Package MQTTnet

或者使用.NET CLI

dotnet add package MQTTnet

2、服務端代碼

服務端代碼編寫,具體步驟可以參考以下步驟。

1、初始化 MQTT 伺服器

創建一個 MQTT 伺服器工廠實例,並使用它創建一個伺服器。

using MQTTnet.Server;
var factory = new MqttFactory();
var mqttServer = factory.CreateMqttServer();

2、配置 MQTT 伺服器選項

配置伺服器選項,例如預設埠等。

var options = new MqttServerOptionsBuilder()
    .WithDefaultEndpointPort(1883)
    .Build();

3、啟動 MQTT 伺服器

await mqttServer.StartAsync(options

4、處理客戶端連接

為伺服器的 ClientConnectedHandler 和 ClientDisconnectedHandler 事件添加處理程式,以處理客戶端連接和斷開。

mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(e =>
{
    Console.WriteLine($"客戶端已連接: {e.ClientId}");
});

mqttServer.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(e =>
{
    Console.WriteLine($"客戶端已斷開連接: {e.ClientId}");
});

5、處理消息

為伺服器的 ApplicationMessageReceivedHandler 事件添加處理程式,以處理接收到的消息。

mqttServer.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>
{
    Console.WriteLine($"接收消息: {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)} from client: {e.ClientId}");
});

6、停止 MQTT 伺服器

完成通信消息後,需要停止伺服器。

await mqttServer.StopAsync();

3、客戶端代碼

使用 MQTTnet創建 MQTT 客戶端,具體步驟可以參下麵代碼。

1、初始化 MQTT 客戶端

創建一個 MQTT 客戶端工廠實例,並使用它創建一個客戶端。

using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;

var factory = new MqttFactory();
var mqttClient = factory.CreateMqttClient();

2、配置 MQTT 客戶端選項

配置客戶端連接選項,例如伺服器地址和埠。

var options = new MqttClientOptionsBuilder()
    .WithClientId("客戶端ID")
    .WithTcpServer("mqtt伺服器地址", 1883)
    .WithCleanSession()
    .Build();

3、連接到 MQTT 伺服器

使用配置的選項連接到 MQTT 伺服器。

await mqttClient.ConnectAsync(options, CancellationToken.None);

4、訂閱主題

連接成功後,可以訂閱一個或多個主題。

await mqttClient.SubscribeAsync(new MqttTopicFilterBuilder()
    .WithTopic("test/topic")
    .Build());

5、接收消息

為客戶端的 ApplicationMessageReceivedHandler 事件添加處理程式,以接收消息:

mqttClient.UseApplicationMessageReceivedHandler(e =>
{
    Console.WriteLine($"接收消息: {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
});

6、發佈消息

可以發佈消息到指定的主題。

var message = new MqttApplicationMessageBuilder()
    .WithTopic("test/topic")
    .WithPayload("您好 MQTT")
    .WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce)
    .Build();

await mqttClient.PublishAsync(message, CancellationToken.None);

7、斷開連接

完成消息發送後,斷開與伺服器的連接。

await mqttClient.DisconnectAsync();

通過上述步驟,我們實現了基本的發佈與訂閱功能:發佈者將消息發佈到 "test/Topic" 主題,訂閱者訂閱了同一主題,併在收到新消息時將其列印出來。

雖然是一個簡單示例,但在實際項目中,可以根據具體需求進一步擴展功能,例如添加異常處理等。

項目地址

Github: https://github.com/dotnet/MQTTnet

官網:https://mqtt.org/

總結

本文介紹了 MQTT 的相關信息,並展示瞭如何在.NET 中進行基本的使用。

MQTT 還有許多高級功能,大家可以通過查閱 MQTTnet 的官方 API 文檔進一步學習和使用其它功能。

最後

如果你覺得這篇文章對你有幫助,不妨點個贊支持一下!你的支持是我繼續分享知識的動力。如果有任何疑問或需要進一步的幫助,歡迎隨時留言。

也可以加入微信公眾號[DotNet技術匠] 社區,與其他熱愛技術的同行一起交流心得,共同成長!優秀是一種習慣,歡迎大家留言學習!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在Linux centos環境下安裝部署sql server資料庫,並結合cpolar內網穿透工具,創建安全隧道將其映射到公網上,獲取公網地址,實現在外異地遠程連接家裡/公司的sqlserver資料庫,而無需公網IP,無需設置路由器,亦無需雲伺服器。 1.安裝sql server 下載 SQL Se ...
  • Redis Stream簡介 Redis Stream是隨著5.0版本發佈的一種新的Redis數據類型: 高效消費者組:允許多個消費者組從同一數據流的不同部分消費數據,每個消費者組都能獨立地處理消息,這樣可以並行處理和提高效率。 阻塞操作:消費者可以設置阻塞操作,這樣它們會在流中有新數據添加時被喚醒 ...
  • 前言 隨著工業4.0時代的到來,物聯網技術正在以前所未有的速度改變著我們的生產和生活方式。本文給大家介紹一個基於 .NET 6 開發的跨平臺工業物聯網網關解決方案。 工業物聯網(IIoT)成為了連接物理世界與數字世界的紐帶。而在這個網路中,工業物聯網網關就像是一個智能的交通警察,負責指揮著設備與雲端 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...