C# MQTT mqtt客戶端,發布訂閱消息


如果想用C#來和mqtt的服務器進行數據交互的話,有一個常見的選擇,那就是 MQTTNET

地址如下:https://github.com/chkr1011/MQTTnet

那個庫在最近幾個版本升級的過程中,更改了一些api接口,造成了大家的困惑,所以我在hsl中也提供了mqtt的實現類,用法很簡單。現在來介紹一下

 

本庫的demo源代碼地址:https://github.com/dathlin/HslCommunication

如果想要聯系作者,請訪問官網:  http://www.hslcommunication.cn/

 

測試的MQTT界面如下:

 

 

然后需要准備mqtt的服務器了,當然了,你可以安裝EMQtt的服務器,也可以安裝mqttnet的服務器,當然為了盡快的測試,可以使用hsl支持的服務器,雖然目前的支持的功能比較簡陋,但是基本的功能都有的。

好了,我們先運行demo,打開服務器

點擊start即可。

然后我們新建一個winform項目,然后nuget安裝hslcommunication

 

 

安裝完成后,我們就要在主界面添加一個按鈕了。

先定義對象,然后在構造方法里初始化。

        public Form1( )
        {
            InitializeComponent( );

            // 實例化
            mqttClient = new MqttClient( new MqttConnectionOptions( )
            {
                ClientId = "ABC",
                IpAddress = "127.0.0.1"
            } );
        }


        private MqttClient mqttClient = null;
        private void button1_Click( object sender, EventArgs e )
        {
            // 連接
            OperateResult connect = mqttClient.ConnectServer( );
            if (connect.IsSuccess)
            {
                MessageBox.Show( "Success" );
            }
            else
            {
                MessageBox.Show( "Failed" );
            }
        }

  實例化的時候支持設置客戶端的ID信息,服務器的地址,端口,超時時間,如果服務器設置了用戶名和密碼。那么實例化的時候修改成下面的信息

            // 實例化
            mqttClient = new MqttClient( new MqttConnectionOptions( )
            {
                ClientId = "ABC",
                IpAddress = "127.0.0.1",
                Credentials = new MqttCredential( "admin", "123456" ),   // 設置了用戶名和密碼
            } );

  

如何發布消息呢?我們再增加一個按鈕。

        private void button2_Click( object sender, EventArgs e )
        {
            // 測試發布
            mqttClient.PublishMessage( new MqttApplicationMessage( )
            {
                Topic = "A",                                                      // 主題
                QualityOfServiceLevel = MqttQualityOfServiceLevel.AtMostOnce,     // 消息等級
                Payload = Encoding.UTF8.GetBytes( "This is test message!" ),        // 數據
                Retain = false,                                                   // 是否保留
            } );
        }

  我們來看看測試效果。

 

我們看到服務器上接收到客戶端的信息,可以方便的知道哪個客戶端,發的什么主題,內容是什么。

 

我們再來看看訂閱操作。我們再增加一個按鈕,用來訂閱操作

        private void button3_Click( object sender, EventArgs e )
        {
            // 訂閱測試,在label1上顯示結果
            mqttClient.OnMqttMessageReceived += MqttClient_OnMqttMessageReceived; // 調用一次即可
            mqttClient.SubscribeMessage( "A" );     // 訂閱A的主題
        }

        private void MqttClient_OnMqttMessageReceived( string topic, byte[] payload )
        {
            // 跨線程更新了UI界面的內容
            Invoke( new Action( ( ) =>
             {
                 label1.Text = $"Topic[{topic}] {Encoding.UTF8.GetString( payload )}";
             } ) );
        }

  

 

好了我們再來操作以下

 

我們可以看到我們訂閱的A,然后發布的A確實是收到消息了。

實際上MQTT協議的操作就只有這么點,基本就差不多了,但是在發布消息的時候有個屬性,

QualityOfServiceLevel

這個需要額外注意一下。有三個選項,最多一次,最少一次,剛好一次,從性能上來說,最多一次最高性能,剛好一次最損耗性能。

所以一般工業現場的實時數據的推送都是最多一次即可。

 

還有 Retain 屬性,含義是,你推上去的消息是否要在服務器本地緩存,緩存之后有什么好處呢?新的客戶端訂閱消息的時候,會立即推送一次舊數據。這樣,你就可以及時的在界面上顯示出來。

 

更多的操作,可以參照demo的源代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM