MQTTnet 入門 Ⅱ:使用 .NET 6 Worker 建立 MQTT Broker

MQTTnet 入門:使用 .NET 6 建立 MQTT Broker

MQTTnet 入門 Ⅱ
使用 .NET 6 建立
MQTT Broker

MQTT(Message Queuing Telemetry Transport)是一種輕量級的通訊協議,廣泛應用於物聯網和即時通訊等領域。建立自己的 MQTT Broker 可以讓我們在應用程式中實現可靠的訊息傳遞和訂閱功能。本文將介紹如何使用 .NET 6 Worker 和 MQTTnet 庫來建立一個簡單而強大的 MQTT Broker。

安裝套件

在開始之前,我們需要安裝 .NET 6 SDK 和 MQTTnet 庫。可以打開終端機或命令提示字元,執行以下命令安裝,或是使用 IDE 進行圖形化安裝:

//創建一個.NET6 Worker 專案
dotnet new worker -n MyMqttBroker
cd MyMqttBroker

//新增 MQTTnet 套件
dotnet add package MQTTnet
使用 Nuget 套件管理員安裝 MQTTnet 套件

設定 MQTT Broker

在 Worker 的主要程式碼文件中,打開 Worker.cs,我們將在 ExecuteAsync 方法中編寫建立 MQTT Broker 的邏輯。

using MQTTnet;
using MQTTnet.Server;

public class Worker : BackgroundService
{
 public static MqttServer _mqttServer { get; set; }
 protected override async Task ExecuteAsync(CancellationToken stoppingToken)
 {
    var optionsBuilder = new MqttServerOptionsBuilder()
        .WithDefaultEndpoint()
        .WithDefaultEndpointPort(10086); //指定 MQTT Broker 使用的 Port
   MqttServerOptions options = optionsBuilder.Build();
   
   //使用設定上述設定建立 MQTT
   _mqttServer = new MqttFactory().CreateMqttServer(options);

   // 註冊 Client 連接事件
   _mqttServer.ClientConnectedAsync += _mqttServer_ClientConnectedAsync;
   // 註冊 Client 斷開連接事件          
   _mqttServer.ClientDisconnectedAsync += _mqttServer_ClientDisconnectedAsync;
   // 註冊  Client 訂閱事件
   _mqttServer.ClientSubscribedTopicAsync += _mqttServer_ClientSubscribedTopicAsync;
   // 註冊  Client 取消訂閱事件
   _mqttServer.ClientUnsubscribedTopicAsync += _mqttServer_ClientUnsubscribedTopicAsync; 
   // 註冊  Broker 接收 Message 事件
   _mqttServer.InterceptingPublishAsync += _mqttServer_InterceptingPublishAsync; 
   // 註冊  Broker 啟動事件
   _mqttServer.StartedAsync += _mqttServer_StartedAsync; 
   // 註冊  Broker 關閉事件
   _mqttServer.StoppedAsync += _mqttServer_StoppedAsync; 

   // 啟動 MQTT Broker
   _mqttServer.StartAsync();
    }
}
  1. 在上面的程式碼中我定義了一個靜態屬性_mqttServer,用於存儲 MQTT 服務器的實例,並在ExecuteAsync方法中,使用MqttServerOptionsBuilder建立 MQTT 服務器的配置選項,包括 Port 設定,以及連線驗證的處理邏輯。
  2. 然後使用MqttFactory創建了一個 MQTT 服務器的實例 _mqttServer ,並傳入配置選項。並註冊了一些 MQTT 服務器的事件處理方法,包括客戶端訂閱主題、取消訂閱主題以及消息發布等事件。
  3. 最後,調用StartAsync方法啟動 MQTT 服務器。
  4. 下面是 MQTT 事件的處理函式,可以把相關邏輯寫在相對應的函式之中。

事件處理邏輯

//  Client 連接事件
private Task _mqttServer_ClientConnectedAsync(ClientConnectedEventArgs arg)
{
   //印出相關資訊
   Console.WriteLine($"ClientID ={arg.ClientId} connected.(EndPoint = {arg.Endpoint})");
   return Task.CompletedTask;
}

// Client 斷開連接事件
private Task _mqttServer_ClientDisconnectedAsync(ClientDisconnectedEventArgs arg)
{
   Console.WriteLine($"ClientID ={arg.ClientId} Disconnected.(EndPoint = {arg.Endpoint})");
   return Task.CompletedTask;
}

// Client 訂閱事件
private Task _mqttServer_ClientSubscribedTopicAsync(ClientSubscribedTopicEventArgs arg)
{
   Console.WriteLine($"ClientID = {arg.ClientId} subscribed Topic = {arg.TopicFilter.Topic}");
   return Task.CompletedTask;
}

// Client 取消訂閱事件
private Task _mqttServer_ClientUnsubscribedTopicAsync(ClientUnsubscribedTopicEventArgs arg)
{
   Console.WriteLine($"ClientID = {arg.ClientId} unsubscribed Topic = {arg.TopicFilter}");
   return Task.CompletedTask;
}

// Broker 接收 Message 事件
private Task _mqttServer_InterceptingPublishAsync(InterceptingPublishEventArgs arg)
{
   Console.WriteLine($"InterceptingPublishAsync:");
   Console.WriteLine($"ClientID = {arg.ClientId} Topic={arg.ApplicationMessage.Topic} ");
   Console.WriteLine($"Msg = {Encoding.UTF8.GetString(arg.ApplicationMessage.Payload)}");
   return Task.CompletedTask;
}

// Broker 關閉事件
private Task _mqttServer_StoppedAsync(EventArgs arg)
{
   Console.WriteLine($"MQTT Broker Stopped!");
   return Task.CompletedTask;
}

// Broker 啟動事件        
private Task _mqttServer_StartedAsync(EventArgs arg)
{
   Console.WriteLine($"MQTT Broker Started!");
   return Task.CompletedTask;
}

這樣我們就使用 .NET 6 Worker 和 MQTTnet 庫,建立了一個自己的 MQTT Broker,只需要按下執行 (F10 ) ,會跳出一個執行視窗,顯示 MQTT Broker Started!,代表 MQTT Broker 建立成功!

MQTT Broker 建立成功畫面

下一篇文章我們會建立一個 MQTT Client 來連接 Broker 並發布訊息,請參考系列文章。

MQTTnet 入門 Ⅰ:淺談 MQTT概念、架構、特色、QoS設定
MQTTnet 入門 Ⅲ:使用 .NET 6 Worker 建立 MQTT Client

希望這篇文章對你有所幫助,並激發你在 MQTT 領域的創造力和應用潛力。祝你順利建立屬於自己的 MQTT Broker!

參考資料

MQTT
MQTTnet Github

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *