基於.net C# Socket WinForm MQTT 客戶端開發

来源:https://www.cnblogs.com/henxiao25/archive/2022/11/27/16930708.html
-Advertisement-
Play Games

1、什麼是MQTT? MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發佈/訂閱(publish/subscribe)模式的"輕量級"通訊協議,該協議構建於TCP/IP協議上,由IBM在1999年發佈。MQTT最大優點在於,可以以極 ...


 

1、什麼是MQTT?
  MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸協議),是一種基於發佈/訂閱(publish/subscribe)模式的"輕量級"通訊協議,該協議構建於TCP/IP協議上,由IBM在1999年發佈。MQTT最大優點在於,可以以極少的代碼和有限的帶寬,為連接遠程設備提供實時可靠的消息服務。作為一種低開銷、低帶寬占用的即時通訊協議,使其在物聯網、小型設備、移動應用等方面有較廣泛的應用。

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

 

  本文將基於.Net C# Socket WinForm MQTT 客戶端開發,實現服務端連接,消息發佈,消息訂閱,取消訂閱及接收服務端返回消息功能。

 

 

2、連接服務端

  客戶端連接服務端,啟動非同步接收服務端消息。

 1                     //連接選項
 2                     var option = new MQTT.MQTTClientOption()
 3                     {
 4                         ClientId = this.txtClientId.Text,
 5                         IpString = this.txtServer.Text,
 6                         Port = Convert.ToInt32(this.txtPort.Text),
 7                         UserName = this.txtUserName.Text,
 8                         Password = this.txtPassword.Text
 9                     };
10                     //實例客戶端
11                     this.mqttClient = new MQTT.MQTTClient();
12                     this.mqttClient.ClientReceived += MqttClient_ClientReceived;
13                     var result = await this.mqttClient.ConnectAsync(option);
14                     if(result.State == false)
15                     {
16                         MessageBox.Show(result.Fail, "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
17                         return;
18                     }
19                     //開始接收
20                     this.mqttClient.BeginReceive();

3、發佈消息

  客戶端向服務端發送消息,主要包括主題,內容及消息質量。

  發送消息程式

 1         private short _PacketId = 1;
 2         private async void BtnPublish_Click(object sender, EventArgs e)
 3         {
 4             this.btnPublish.Enabled = false;
 5             this.Cursor = Cursors.WaitCursor;
 6             try
 7             {
 8                 short qos = 0;
 9                 if (rdbLevel1.Checked)
10                     qos = 1;
11                 if (rdbLevel2.Checked)
12                     qos = 2;
13                 
14                 var data = new MQTT.PublishEntity()
15                 {
16                     Topic = this.txtTopic.Text,
17                     Reload = System.Text.Encoding.UTF8.GetBytes(this.txtContent.Text),
18                     Qos = qos,
19                     PacketId=_PacketId
20                 };
21                 var result = await this.mqttClient.PublishAsync(data,false);
22                 if(result.State == false)
23                 {
24                     this.AppendText("發送失敗:" + result.Fail);
25                     return;
26                 }
27                 this._PacketId++;
28                 this.AppendText("發送成功,返回結果:" + result.Result);
29             }
30             finally
31             {
32                 this.btnPublish.Enabled = true;
33                 this.Cursor = Cursors.Default;
34             }
35         }

 

4、訂閱消息

  客戶端訂閱消息,主要包括過濾主題及消息質量。

  訂閱消息方法:

 1 private async void BtnSubscribe_Click(object sender, EventArgs e)
 2         {
 3             this.btnSubscribe.Enabled = false;
 4             this.Cursor = Cursors.WaitCursor;
 5            
 6             try
 7             {
 8                 string fail = string.Empty;
 9 
10                 short qos = 0;
11                 if (rdbQos1.Checked)
12                     qos = 1;
13                 if (rdbQos2.Checked)
14                     qos = 2;
15 
16                 MQTT.SubscribeEntity entity = new MQTT.SubscribeEntity();
17                 entity.Filter = this.txtFilter.Text;
18                 entity.Qos = qos;
19 
20                 this.AppendText("開始訂閱...");
21                 //if (mqttClient.Subscribe(this.txtFilter.Text, qos, out result, out fail) == false)
22                 //{
23                 //    this.AppendText(fail);
24                 //    return;
25                 //}
26                 var result = await mqttClient.SubscribeAsync(entity.Filter,entity.Qos);
27                 if (result.State == false)
28                 {
29                     this.AppendText(result.Fail);
30                     return;
31                 }
32                
33                 this.AppendText("訂閱成功!返回結果:" + result.Result);
34                 MQTT.SubscribeHelper.Save(entity);
35 
36                 DataRow drData = this.dtSubscribes.NewRow();
37                 drData["Id"] = entity.Id;
38                 drData["Filter"] = entity.Filter;
39                 drData["Qos"] = entity.Qos;
40                 drData["Count"] = 0;
41                 dtSubscribes.Rows.Add(drData);
42             }
43             finally
44             {
45                 this.btnSubscribe.Enabled = true;
46                 this.Cursor = Cursors.Default;
47             }
48         }

 

5、取消訂閱

  客戶端取消某一訂閱消息。雙擊訂閱消息行,取消訂閱消息。

 

  取消訂閱方法:

 1         private async void DataGridView1_CellDoubleClick(object sender, DataGridViewCellEventArgs e)
 2         {
 3             if (this.dataGridView1.CurrentCell == null)
 4                 return;
 5 
 6             DataRowView drv = this.dataGridView1.CurrentRow.DataBoundItem as DataRowView;
 7             if (drv == null)
 8                 return;
 9 
10             if (MessageBox.Show("確認取消當前選擇:" + drv["Filter"].ToString() + " 訂閱?", "確認", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) != DialogResult.OK)
11                 return;
12             try
13             {
14                 this.AppendText("開始取消訂閱...");
15                 var result = await mqttClient.UnSubscribeAsync(drv["Filter"].ToString());
16                 if (result.State == false)
17                 {
18                     this.AppendText(result.Fail);
19                     return;
20                 }
21                 this.AppendText("取消訂閱成功!返回結果:" + result.Result);
22                 MQTT.SubscribeHelper.Delete(drv["Id"].ToString());
23                 this.dataGridView1.Rows.RemoveAt(this.dataGridView1.CurrentCell.RowIndex);
24             }
25             catch (Exception ex)
26             {
27                 this.AppendText("取消訂閱異常:" + ex.ToString());
28             }
29 
30         }

 

6、接收服務端消息

  客戶端接收服務端轉發過來的消息。

 

1         private void MqttClient_ClientReceived(MQTT.MQTTClient client, MQTT.ReceiveResult receive)
2         {
3             if(receive.Data != null)
4                 this.AppendText("DataReceived state="+receive.State+" topic="+ receive.Data.Topic + " content=" + System.Text.Encoding.UTF8.GetString(receive.Data.Reload));
5             else if(receive.State)
6                 this.AppendText("DataReceived state=" + receive.State + " result=" + receive.Result);
7             else
8                 this.AppendText("DataReceived state=" + receive.State + " fail=" + receive.Fail);
9         }

 

至此,客戶端工具主要功能簡介完畢,不當之處,歡迎指正!

客戶端下載地址(碼雲伺服器):https://gitee.com/ShiQuan25/full-product-management/raw/master/WinMQTTClient/WinMQTTClient.zip


作者:HengXiao

本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接。如有問題,可以郵件:[email protected] QQ:896374871 聯繫我,非常感謝。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、概念辨析:網路延遲與網路波動 (1) 網路延遲 網路延遲是指各式各樣的數據在網路介質中通過網路協議(如TCP/IP)進行傳輸,如果信息量過大不加以限制,超額的網路流量就會導致設備反應緩慢,造成網路延遲。受限於光速,網路延遲總是有一個下限,是無法超越物理極限的。 (2) 網路波動(丟包率) 網路波 ...
  • MyBatis簡單介紹 【1】MyBatis是一個持久層的ORM框架【Object Relational Mapping,對象關係映射】,使用簡單,學習成本較低。可以執行自己手寫的SQL語句,比較靈活。但是MyBatis的自動化程度不高,移植性也不高,有時從一個資料庫遷移到另外一個資料庫的時候需要自 ...
  • VH6501硬體結構 1.式樣 1.正向有5個燈,用來指示干擾的觸髮狀態,干擾類型(數字或模擬),通道通信以及設備狀態。 2.兩個DB9介面(公頭male和母頭female),這是CAN或CANFD通道,單節點干擾,或多節點干擾, ,以及一個Extend觸發介面。 3.兩個DB9介面內部互聯,且PI ...
  • Spring 的核心功能就是提供一個 IoC 容器,用於管理應用程式中的 bean,在容器中配置元數據來管理 Bean 之間的依賴關係,Java 程式中的類都可以交由 Spring 容器管理。 ...
  • 以下為本人的學習筆記 第1章:JDBC概述 1.1 數據的持久化 持久化(persistence):把數據保存到可掉電式存儲設備中以供之後使用。大多數情況下,特別是企業級應用,數據持久化意味著將記憶體中的數據保存到硬碟上加以”固化”,而持久化的實現過程大多通過各種關係資料庫來完成。 持久化的主要應用是 ...
  • springboot繼承efk實現日誌收集 1.安裝es和kibana 我使用的雲伺服器centos7,2核+4G記憶體,跑起來記憶體使用率50%左右 建議使用最低配置和我一樣,1+2的配置kibana應該跑不起來,安裝過程使用了尚矽谷的springcloud的課程資料,也**!!!!!!!!可以不用, ...
  • 一、SpringBoot配置文件 1.什麼是SpringBoot配置文件 在SpringBoot項目中,資源文件夾下會有一個叫做application.properties的文件,這就是SpringBoot的配置文件。 2.SpringBoot配置文件的作用 因為SpringBoot的配置都經過自動 ...
  • 重載關係 一組函數要重載,必須處在同一個作用域中 ,而且函數名字相同,參數列表不同 代碼1中的Base中的 show() 和show(int) 屬於重載 代碼2中的Base中的 show() 和Derive中的show()不屬於重載不在同一個作用域下麵 隱藏的關係(主要是指作用域隱藏) 在繼承結構當 ...
一周排行
    -Advertisement-
    Play Games
  • 在C#中使用SQL Server實現事務的ACID(原子性、一致性、隔離性、持久性)屬性和使用資料庫鎖(悲觀鎖和樂觀鎖)時,你可以通過ADO.NET的SqlConnection和SqlTransaction類來實現。下麵是一些示例和概念說明。 實現ACID事務 ACID屬性是事務處理的四個基本特征, ...
  • 我們在《SqlSugar開發框架》中,Winform界面開發部分往往也用到了自定義的用戶控制項,對應一些特殊的界面或者常用到的一些局部界面內容,我們可以使用自定義的用戶控制項來提高界面的統一性,同時也增強了使用的便利性。如我們Winform界面中用到的分頁控制項、附件顯示內容、以及一些公司、部門、菜單的下... ...
  • 在本篇教程中,我們學習瞭如何在 Taurus.MVC WebMVC 中進行數據綁定操作。我們還學習瞭如何使用 ${屬性名稱} CMS 語法來綁定頁面上的元素與 Model 中的屬性。通過這些步驟,我們成功實現了一個簡單的數據綁定示例。 ...
  • 是在MVVM中用來傳遞消息的一種方式。它是在MVVMLight框架中提供的一個實現了IMessenger介面的類,可以用來在ViewModel之間、ViewModel和View之間傳遞消息。 Send 接受一個泛型參數,表示要發送的消息內容。 Register 方法用於註冊某個對象接收消息。 pub ...
  • 概述:在WPF中,通過EventHandler可實現基礎和高級的UI更新方式。基礎用法涉及在類中定義事件,併在UI中訂閱以執行更新操作。高級用法藉助Dispatcher類,確保在非UI線程上執行操作後,通過UI線程更新界面。這兩種方法提供了靈活而可靠的UI更新機制。 在WPF(Windows Pre ...
  • 概述:本文介紹了在C#程式開發中如何利用自定義擴展方法測量代碼執行時間。通過使用簡單的Action委托,開發者可以輕鬆獲取代碼塊的執行時間,幫助優化性能、驗證演算法效率以及監控系統性能。這種通用方法提供了一種便捷而有效的方式,有助於提高開發效率和代碼質量。 在軟體開發中,瞭解代碼執行時間是優化程式性能 ...
  • 概述:Cron表達式是一種強大的定時任務調度工具,通過配置不同欄位實現靈活的時間規定。在.NET中,Quartz庫提供了簡便的方式配置Cron表達式,實現精準的定時任務調度。這種靈活性和可擴展性使得開發者能夠根據需求輕鬆地制定和管理定時任務,例如每天備份系統日誌或其他重要操作。 Cron表達式詳解 ...
  • 概述:.NET提供多種定時器,如System.Windows.Forms.Timer適用於UI,System.Web.UI.Timer用於Web,System.Diagnostics.Timer用於性能監控,System.Threading.Timer和System.Timers.Timer用於一般 ...
  • 問題背景 有同事聯繫我說,在生產環境上,訪問不了我負責的common服務,然後我去檢查common服務的health endpoint, 沒問題,然後我問了下異常,timeout導致的System.OperationCanceledException。那大概率是客戶端的問題,會不會是埠耗盡,用ne ...
  • 前言: 在本篇 Taurus.MVC WebMVC 入門開發教程的第四篇文章中, 我們將學習如何實現數據列表的綁定,通過使用 List<Model> 來展示多個數據項。 我們將繼續使用 Taurus.Mvc 命名空間,同時探討如何在視圖中綁定並顯示一個 Model 列表。 步驟1:創建 Model ...