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

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

地址以下:https://github.com/chkr1011/MQTTnetgithub

那個庫在最近幾個版本升級的過程當中,更改了一些api接口,形成了你們的困惑,因此我在hsl中也提供了mqtt的實現類,用法很簡單。如今來介紹一下api

 

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

若是想要聯繫做者,請訪問官網:  http://www.hslcommunication.cn/服務器

 

測試的MQTT界面以下:性能

 

 

而後須要準備mqtt的服務器了,固然了,你能夠安裝EMQtt的服務器,也能夠安裝mqttnet的服務器,固然爲了儘快的測試,可使用hsl支持的服務器,雖然目前的支持的功能比較簡陋,可是基本的功能都有的。測試

好了,咱們先運行demo,打開服務器線程

點擊start便可。orm

而後咱們新建一個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的源代碼。

相關文章
相關標籤/搜索