MQTTnet 入門 Ⅲ:使用 .NET 6 Worker 建立 MQTT Client

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

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);
}
  1. 在上面的程式碼中我定義了一個靜態屬性_mqttClient,用於存儲 MQTT Client 的實例,並在ExecuteAsync方法中,使用 MqttClientOptionsBuilder 建立 MQTT Client 的配置選項,包括 Port 設定,以及ClientID 等。
  2. 然後使用MqttFactory創建了一個 MQTT Client的實例 _mqttClient ,並傳入配置選項。並註冊了一些 MQTT Client的事件處理方法,包括連接 Broker 、接收訊息等事件。
  3. 最後,調用 ConnectAsync 方法連接 MQTT Broker。

接者按下執行 ( F10 ) ,應該可以成功看到 Client 端及 Broker 端視窗都有跳出連接訊息就代表建立成功。

MQTT 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 端視窗都有印出發布訊息的內容就代表發布成功。

MQTT Broker 成功收到 Client 發布 (publish) 的訊息

訂閱 ( 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 Publisher、Broker、Subscriber交互溝通架構演示

這樣,我們已經成功建立了一個 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

參考資料

MQTT
MQTTnet Github

發佈留言

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