.NET 開源高效能 MQTT 類庫

小码编匠發表於2024-09-27

前言

隨著物聯網(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技術匠] 社群,與其他熱愛技術的同行一起交流心得,共同成長!優秀是一種習慣,歡迎大家留言學習!

相關文章