
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

設定 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();
}
}
- 在上面的程式碼中我定義了一個靜態屬性
_mqttServer
,用於存儲 MQTT 服務器的實例,並在ExecuteAsync
方法中,使用MqttServerOptionsBuilder
建立 MQTT 服務器的配置選項,包括 Port 設定,以及連線驗證的處理邏輯。 - 然後使用
MqttFactory
創建了一個 MQTT 服務器的實例_mqttServer
,並傳入配置選項。並註冊了一些 MQTT 服務器的事件處理方法,包括客戶端訂閱主題、取消訂閱主題以及消息發布等事件。 - 最後,調用
StartAsync
方法啟動 MQTT 服務器。 - 下面是 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 Client 來連接 Broker 並發布訊息,請參考系列文章。
MQTTnet 入門 Ⅰ:淺談 MQTT概念、架構、特色、QoS設定
MQTTnet 入門 Ⅲ:使用 .NET 6 Worker 建立 MQTT Client
希望這篇文章對你有所幫助,並激發你在 MQTT 領域的創造力和應用潛力。祝你順利建立屬於自己的 MQTT Broker!