C#接收/發送MQTT消息,使用C# MqttLib

MQTT簡介

MQTT是一個基於客戶端-服務器的消息發佈/訂閱傳輸協議。MQTT協議是輕量、簡單、開放和易於實現的,這些特點使它適用範圍非常廣泛。在很多情況下,包括受限的環境中,如:機器與機器(M2M)通信和物聯網(IoT)。其在,通過衛星鏈路通信傳感器、偶爾撥號的醫療設備、智能家居、及一些小型化設備中已廣泛使用。

MQTT消息有三種質量等級

  1. “至多一次”(QoS==0),消息發佈完全依賴底層 TCP/IP 網絡。會發生消息丟失或重複。這一級別可用於如下情況,環境傳感器數據,丟失一次讀記錄無所謂,因爲不久後還會有第二次發送。

  2. “至少一次”(QoS==1),確保消息到達,但消息重複可能會發生。

  3. “只有一次”(QoS==2),確保消息到達一次。這一級別可用於如下情況,在計費系統中,消息重複或丟失會導致不正確的結果。小型傳輸,開銷很小(固定長度的頭部是 2 字節),協議交換最小化,以降低網絡流量。

  • 具體使用還要看消息中間件是否支持3種質量等級

使用 MqttLib 訂閱 mqtt消息

  1. 新建C#工程,並引用MqttLib
  2. 實例化 mqtt client
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MqttLib;

using System.Diagnostics;
using System.IO;

namespace mqttlib_mqtt
{
    class Program
    {
        
        IMqtt _client;

        static void Main(string[] args)
        {
            
            string connectionString = "tcp://127.0.0.1:1884";
            string clientId = Guid.NewGuid().ToString();

            Console.WriteLine("正在啓動mqtt示例程序");
            Console.WriteLine("按任意鍵可以退出本程序\n");

            Program prog = new Program(connectionString, clientId);
            prog.Start();

            Console.ReadKey();
            prog.Stop();
        }


        Program(string connectionString, string clientId)
        {
            // 實例化 MqttClientFactor

            _client = MqttClientFactory.CreateClient(connectionString, clientId);

            // 設置客戶端回調
            _client.Connected += new ConnectionDelegate(client_Connected);
            _client.ConnectionLost += new ConnectionDelegate(_client_ConnectionLost);
            _client.PublishArrived += new PublishArrivedDelegate(client_PublishArrived);
        }

        void Start()
        {
            // 使用 'CleanStart' 模式啓動連接
            Console.WriteLine("連接mqtt服務器\n");
            _client.Connect(true);
        }

        void Stop()
        {
            if (_client.IsConnected)
            {
                Console.WriteLine("客戶端斷開\n");
                _client.Disconnect();
                Console.WriteLine("客戶端已經斷開連接\n");
            }
        }

        void client_Connected(object sender, EventArgs e)
        {
            Console.WriteLine("客戶端已經連接\n");
            RegisterOurSubscriptions();
            PublishSomething();
        }

        void _client_ConnectionLost(object sender, EventArgs e)
        {
            Console.WriteLine("連接異常斷開\n");
        }

        // 註冊 Topic
        void RegisterOurSubscriptions()
        {
            Console.WriteLine("訂閱mqtt Topic:mqtt/test/res/#\n");
            _client.Subscribe("mqtt/test/res/#", QoS.AtLeastOnce);
        }

        // 發佈 mqtt 消息
        void PublishSomething()
        {
            Console.WriteLine("發佈mqtt消息到:mqtt/test/res\n");
            // 設置Topic,要發送的消息,消息等級
            _client.Publish("mqtt/test/res", "測試數據", QoS.AtLeastOnce, false);
        }

        // 處理收到的 mqtt 消息
        bool client_PublishArrived(object sender, PublishArrivedArgs e)
        {
            Console.WriteLine("收到的消息:");
            Console.WriteLine("Topic: " + e.Topic);
            Console.WriteLine("Payload: " + e.Payload);
            Console.WriteLine();
            return true;
        }

        
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章