
MQTTnet 入門 Ⅲ
使用 .NET 6 建立
MQTT Client
在前一篇文章中,我們成功地使用 .NET 6 Worker 和 MQTTnet 建立了自己的 MQTT Broker,使我們能夠在應用程式中實現可靠的訊息傳遞和訂閱功能。接下來,本文將介紹如何使用 .NET 6 Worker 和 MQTTnet 庫建立一個 MQTT Client,並連接到先前建立的Broker,以實現訊息的發布、訂閱和接收功能。
首先,我們需要確保已經完成了 .NET Worker 和 MQTTnet 的基礎安裝。如果你還沒有進行這些操作,可以參考之前的文章進行相應的安裝和設置:
MQTTnet 入門 Ⅱ:使用 .NET 6 Worker 建立 MQTT Broker
建立 MQTT Client
在 Worker 的主要程式碼文件中,打開 Worker.cs
,我們將在 ExecuteAsync
方法中編寫建立 MQTT Client 的邏輯。
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Protocol;
public static IMqttClient _mqttClient;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
var clientoptions = new MqttClientOptionsBuilder()
// 設定 MQTT Broker Port (這裡可以連接上篇文章我們創建的MQTT Broker)
.WithTcpServer("localhost", 10086)
// 設定 MQTT Client ID (此ID不可重覆)
.WithClientId("MQTTClientfortest")
.Build();
_mqttClient = new MqttFactory().CreateMqttClient();
// 註冊 連接 MQTT Broker 事件
_mqttClient.ConnectedAsync += _mqttClient_ConnectedAsync;
// 註冊 斷開連接 MQTT Broker 事件
_mqttClient.DisconnectedAsync += _mqttClient_DisconnectAsync;
// 註冊 接收訊息 事件
_mqttClient.ApplicationMessageReceivedAsync += _mqttClient_ApplicationMessageRecievedAsync;
// 連接 MQTT Broker
await _mqttClient.ConnectAsync(options, stoppingToken);
}
- 在上面的程式碼中我定義了一個靜態屬性
_mqttClient
,用於存儲 MQTT Client 的實例,並在ExecuteAsync
方法中,使用MqttClientOptionsBuilder
建立 MQTT Client 的配置選項,包括 Port 設定,以及ClientID 等。 - 然後使用
MqttFactory
創建了一個 MQTT Client的實例
,並傳入配置選項。並註冊了一些 MQTT Client的事件處理方法,包括連接 Broker 、接收訊息等事件。_mqttClient
- 最後,調用
ConnectAsync
方法連接 MQTT Broker。
接者按下執行 ( F10 ) ,應該可以成功看到 Client 端及 Broker 端視窗都有跳出連接訊息就代表建立成功。

發布 ( Publish ) 訊息
接著,我們建立一個用來負責發布的 Function ,接受兩個參數溫度資訊及感測器 ID 用來組成等一下要發布的訊息:
using Newtonsoft.Json;
public void Publish(string temperatureinfo,string sensorid)
{
var obj = new {
Temerature = temperatureinfo,
SensorID = sensorid,
};
// 建立 MQTT 格式訊息
var msg = new MqttApplicationMessage
{
// 指定發布的主題 ( Topic )
Topic = "TemperatureData",
// 指定發布的訊息內容( 以 json 格式發布)
Payload = Encoding.Default.GetBytes(JsonConvert.SerializeObject(obj)),
// 指定訊息的Qos (這裡是使用AtLeastOnce)
QualityOfServiceLevel = MqttQualityOfServiceLevel.AtLeastOnce,
// 指定訊息 Retained Policy
Retain = false
};
// 發布訊息
_ = _mqttClient.PublishAsync(msg).Result
}
我們在 ExecuteAsync
方法中新增呼叫 Publish () 的邏輯來發布訊息。
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
...
await _mqttClient.ConnectAsync(options, stoppingToken);
Publish("32.3", "TS088");
}
按下執行 ( F10 ) ,可以看到 Broker 端視窗都有印出發布訊息的內容就代表發布成功。

訂閱 ( Subscribe ) 主題並接收訊息
可以發布訊息後,我們讓Client同時能夠接收到發布的訊息(通常發布者和訂閱者是不同的程式,但為了方便演示,我們將它們放在一起)。在 ExecuteAsync
方法中,我們新增了一個調用 SubscribeAsync()
方法的步驟,用於訂閱特定主題的訊息:
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
...
await _mqttClient.ConnectAsync(options, stoppingToken);
// 訂閱 temperaturedata 主題
await _mqttClient.SubscribeAsync("temperaturedata", MqttQualityOfServiceLevel.AtLeastOnce);
Publish("32.3", "HAB088");
}
並在 _mqttClient_ApplicationMessageRecievedAsync()
中撰寫接收到訊息時的處理邏輯,我們這邊簡單的印出所接收到的訊息內容。
private Task _mqttClient_ApplicationMessageRecievedAsync(MqttApplicationMessageReceivedEventArgs arg)
{
// 接收到訊息時的處理邏輯寫在這裡
Console.WriteLine($"MessageReceived:Topic = {arg.ApplicationMessage.Topic}");
Console.WriteLine($"Message = {Encoding.UTF8.GetString(arg.ApplicationMessage.Payload)}");
return Task.CompletedTask;
}
按下執行(F10)後,你會注意到在 Broker 端的視窗上會顯示成功訂閱的訊息,接著Client 端會接收到來自 Broker 發布的訊息,並在Client端的視窗中印出該訂閱主題的訊息。

這樣,我們已經成功建立了一個 MQTT Client,並且實現了發布和訂閱的功能。當我們在Client端發布一條訊息時,Broker 會將該訊息發送到所有訂閱了相應主題的客戶端。一個很基本的 MQTT Publisher(發布者)、Broker(代理伺服器)、Subscriber(訂閱者),三者交互溝通的基本架構,你可以根據自己的需求和情境進一步擴展和運用MQTT功能。你可以訂閱不同的主題,發布不同的訊息,並在應用程式中處理這些訊息以達到你想要的效果,下一篇文章將會著墨在雙方安全連線的設置,詳細請參考MQTT系列文章:
MQTTnet 入門 Ⅰ:淺談 MQTT 概念、架構、特色、QoS設定
MQTTnet 入門 Ⅱ:使用 .NET 6 Worker 建立 MQTT Broker
MQTTnet 入門 Ⅲ:使用 .NET 6 Worker 建立 MQTT Client