基于C#的MQTT通信實戰:從EMQX搭建到發布訂閱全解析

MQTT(Message Queueing Telemetry Transport) 消息隊列遙測傳輸,在物聯網領域應用的很廣泛,它是基于Publish/Subscribe模式,具有簡單易用,支持QoS,傳輸效率高的特點。

它被設計用于低帶寬,不穩定或高延遲的網絡環境,因此非常適合于設備之間的數據通信。

EMQX提供了MQTT的服務器,并且可以在后臺網頁查看面板,還支持中文顯示。

下載鏈接:Directory listing for EMQX: / | EMQ

由于5.0之后的版本不再支持Windows所以使用的是4.0版本的包,在下載完壓縮包后,不用安裝,進入cmd導航到安裝的bin目錄下(注意:路徑中不能包含中文),執行命令:emqx start,看見沒有報錯就說明啟動成功了。

之后在瀏覽器里輸入:http://127.0.0.1:18083 進入面板。

在WebSocket菜單里可以模擬發布/訂閱的操作,接下來我們將使用C#完成這一系列的操作。

1、連接主機

首先新建一個WPF項目,然后在Nuget中下載MQTTnet。

    // 連接主機MqttFactory factory = new MqttFactory();_client = factory.CreateMqttClient();var options = new MqttClientOptionsBuilder().WithTcpServer(this.ipAddress.Text, Convert.ToInt32(this.port.Text)).WithClientId(this.clientId.Text).Build();var result = await _client.ConnectAsync(options, CancellationToken.None);if (result.ResultCode == MqttClientConnectResultCode.Success){this.log.Text = DateTime.Now.ToString() + "    連接成功" + Environment.NewLine + this.log.Text;}else{this.log.Text = DateTime.Now.ToString() + $"    連接失敗,{result.ReasonString}" + Environment.NewLine + this.log.Text;return;}

上述使用的是TCP的方式進行連接,需要主機地址,端口號,客戶編號(一個用于區分用戶的字符串)。

2、訂閱消息

訂閱消息分為兩塊,一個是消息的回顯,一個是訂閱消息。

    // 訂閱消息var option = new MqttClientSubscribeOptions();MqttQualityOfServiceLevel level;switch (this.subscribeQos.SelectedIndex){case 0:level = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce;break;case 1:level = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce;break;case 2:level = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce;break;default:throw new Exception("請選擇服務質量");}option.TopicFilters = new List<MqttTopicFilter>(){new MqttTopicFilter(){Topic = this.subscribeTopic.Text,QualityOfServiceLevel = level}};this._client.SubscribeAsync(option, CancellationToken.None);// 將訂閱的消息回顯到日志區this._client.ApplicationMessageReceivedAsync += e =>{var task = Task.Factory.StartNew(() => {try{var array = e.ApplicationMessage.PayloadSegment.Array;if (array == null){return;}var str = Encoding.UTF8.GetString(array);// 跨線程更新UIApplication.Current.Dispatcher.Invoke(() => {this.log.Text = DateTime.Now.ToString() + "    收到消息:" + str + Environment.NewLine + this.log.Text;});}catch (Exception ex){this.log.Text = DateTime.Now.ToString() + $"    {ex.Message}" + Environment.NewLine + this.log.Text;}});return task;};this.log.Text = DateTime.Now.ToString() + "    訂閱成功" + Environment.NewLine + this.log.Text;

訂閱消息只需要兩個參數:主題Topic和服務質量QoC,主題是用來區分不同頻段的消息,避免出現沖突,如果想接收到所有的消息可以這么寫:topicXXX/#,#就代表不限制范圍,如果打算只接受固定區域的消息,則需要將#改成某個字符串。

服務質量QoC是用來控制可用性的,0是最低等級,最多只發送一次,1是中級,至少發一次,但有可能出現重復接收的情況,2是最高級,只發一次,不會多也不會少。

將消息回顯需要注冊ApplicationMessageReceivedAsync事件,傳入的參數是回顯對象,返回值是一個Task類型,是在Task中獲取回顯的值并完成控件的更新操作。

3、發布消息

發布消息的參數比訂閱多兩個:消息內容Payload,持久會話(在恢復連接后保留之前的訂閱和消息傳遞狀態)

    var msg = new MqttApplicationMessage();msg.Topic = this.topic.Text;msg.PayloadSegment = Encoding.UTF8.GetBytes(this.msg.Text);msg.Retain = isSave.IsChecked??false;MqttQualityOfServiceLevel level;switch (this.publishQos.SelectedIndex){case 0:level = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtMostOnce;break;case 1:level = MQTTnet.Protocol.MqttQualityOfServiceLevel.AtLeastOnce;break;case 2:level = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce;break;default:throw new Exception("請選擇服務質量");}msg.QualityOfServiceLevel = level;var resultPublish = await _client.PublishAsync(msg, CancellationToken.None);if (resultPublish.IsSuccess == true){this.log.Text = DateTime.Now.ToString() + "    發送成功" + Environment.NewLine + this.log.Text;}else{this.log.Text = DateTime.Now.ToString() + "    發送失敗" + Environment.NewLine + this.log.Text;}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/81324.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81324.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/81324.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Mysql數據庫之集群進階

一、日志管理 5.7版本自定義路徑時的文件需要自己提前創建好文件&#xff0c;不會自動創建&#xff0c;否則啟動mysql會報錯 錯誤日志 rpm包(yum) /var/log/mysql.log 默認錯誤日志 ###查詢日志路徑 [rootdb01 ~]# mysqladmin -uroot -pEgon123 variables | grep -w log_e…

當硅基存在成為人性延伸的注腳:論情感科技重構社會聯結的可能性

在東京大學機器人實驗室的檔案室里&#xff0c;保存著一份泛黃的二戰時期設計圖——1943年日本陸軍省秘密研發的“慰安婦替代品”草圖。這個誕生于戰爭陰霾的金屬軀體&#xff0c;與2025年上海進博會上展出的MetaBox AI伴侶形成時空對話&#xff1a;當人類將情感需求投射于硅基…

5月17日

這幾天不知道為啥沒更新。可能是玩得太瘋了。或者是考試有點集中&#xff1f;&#xff1f; 線性代數開課了&#xff0c;英語昨天完成了debate 昨天中午debate結束我們就出去玩了&#xff0c;去的那里時光民俗&#xff0c;別墅很好&#xff0c;770平米&#xff0c;但是缺點是可…

FIFO的應用案例(基于Zephyr OS )

目錄 概述 1. 軟硬件環境 1.1 軟件開發環境 1.2 硬件環境 2 FIFO的函數接口 3 FIFO的應用函數實現 3.1 實現步驟 3.2 代碼設計 3.3 測試代碼實現 3.4 源代碼文件 4 編譯和測試 4.1 編譯代碼 4.2 測試 概述 本文介紹了在nRF52832開發板上使用Zephyr操作系統進行…

AWS Elastic Beanstalk部署極簡Spring工程(EB CLI失敗版)

棄用 這里我沒有走通EB CLI方式部署。 問題 最近又加入了AWS項目組&#xff0c;又要再次在AWS云上面部署Spring服務&#xff0c;我這里使用的使用AWS中國云。需要使用AWS Elastic Beanstalk部署一個極簡Spring工程。 EB CLI安裝 安裝EB CLI之前需要先在本地安裝好Git&…

粒子群算法(PSO算法)

粒子群算法概述 1.粒子群優化算法&#xff08;Particle Swarm Optimization&#xff0c;簡稱PSO&#xff09;。粒子群優化算法是在1995年由Kennedy博士和Eberhart博士一起提出的&#xff0c;它源于對鳥群捕食行為的研究。 2.基本核心是利用群體中的個體對信息的共享從而使得整…

leetcode2934. 最大化數組末位元素的最少操作次數-medium

1 題目&#xff1a;最大化數組末位元素的最少操作次數 官方標定難度&#xff1a;中 給你兩個下標從 0 開始的整數數組 nums1 和 nums2 &#xff0c;這兩個數組的長度都是 n 。 你可以執行一系列 操作&#xff08;可能不執行&#xff09;。 在每次操作中&#xff0c;你可以選…

Elasticsearch 官網閱讀之 Term-level Queries

Term-level Queries 參考&#xff1a;https://www.elastic.co/docs/reference/query-languages/query-dsl/query-dsl-exists-query 一、Term Query Term Query 是 term 精準查詢。需要注意的是&#xff0c;在進行 Term Query 的時候&#xff0c;要避免 text 類型的字段&#x…

信貸域——互聯網金融業務

摘要 本文深入探討了信貸域全托與半托業務的定義、特點、適用場景及注意事項&#xff0c;并分析了互聯網金融核心信息流的多個方面&#xff0c;包括資金流、信息流、風險流、合規流、物流、技術流和商流&#xff0c;還闡述了金融系統“斷直連”業務的相關內容&#xff0c;以及…

科技晚報 AI 速遞:今日科技熱點一覽 丨 2025 年 5 月 17 日

科技晚報AI速遞:今日科技熱點一覽 丨2025年5月17日 我們為您匯總今日的科技領域最新動向&#xff0c;帶您快速了解前沿技術、突破性研究及行業趨勢。 黃仁勛勸特朗普&#xff1a;AI 芯片出口規則得改&#xff0c;中國緊追其后&#xff1a;英偉達 CEO 黃仁勛在華盛頓 “山與谷論…

使用streamlit實現vLLM多實例信息統一監控

本文代碼和配置文件實現了一個基于 Streamlit 和 FastAPI 的前后端分離的應用程序&#xff0c;用于管理和展示 VLLM&#xff08;Very Large Language Model&#xff09;實例的信息。以下是代碼和配置文件的總結摘要&#xff1a; 概要 功能概述 前后端啟動方式&#xff1a; 使用…

搭建一個WordPress網站需要多少成本

WordPress 最初可能只是一個簡單的博客平臺。但近年來&#xff0c;它不僅成為了最好的博客平臺&#xff0c;還成為了一個全面的內容管理系統。白宮、jQuery、NGINX、《紐約時報》等企業都把 WordPress 作為自己的網上家園。 不過&#xff0c;它們只是其中的佼佼者。根據 Built…

飛帆控件 post or get it when it has get

我在這里分享兩個鏈接&#xff1a; post_get_it 設計 - 飛帆 有人看出來這個控件是干什么用嗎&#xff1f; 控件的配置&#xff1a;

AI智能體 | 使用Coze一鍵制作“假如書籍會說話”視頻,18個作品狂吸17.6萬粉,讀書博主新標桿!(附保姆級教程)

目錄 一、整體工作流設計 二、制作工作流 2.1 開始節點 2.2 大模型_生成對話文案 2.3 代碼_字幕切割 2.4 畫板_對話背景 2.5 循環_對話語音01 2.5.1 選擇器_2 2.5.2 語音合成02 2.5.3 語音合成03 2.5.4 變量聚合_1 2.5.5 視頻合成01 2.6 循環_3 2.6.1 選擇器_3 …

mysql中4種掃描方式和聚簇索引非聚簇索引【爽文一篇】

目錄 一 mysql的聚簇索引&非聚簇索引 1.1 數據表 1.2 聚簇索引 1.3 非聚簇索引 1.4 覆蓋索引 二 mysql的4種掃描查詢 2.1 全表掃描 2.2 索引掃描 2.3 覆蓋索引掃描 2.4 回表掃描 2.5 總結 三 mysql的回表查詢詳解 3.1 回表查詢 一 mysql的聚簇索引&非聚簇…

泛微對接金蝶云星空實戰案例技術分享

前言 在企業信息化建設中&#xff0c;OA系統與ERP系統對接往往是一個復雜而關鍵的環節。OA系統通常具有高度的自定義性&#xff0c;其基礎資料和單據可能與ERP系統存在字段不一致等問題。同時&#xff0c;OA系統涉及審批流程及流程發起方定義&#xff0c;增加了對接的復雜性。…

一種資源有限單片機處理cJSON數據的方法

一般單片機處理cJSON格式的數據都直接使用cJSON庫&#xff0c;但對于Ram較小的單片機&#xff0c;由于資源有限&#xff0c;這并不合適&#xff0c;但我們可以根據cJSON數據的特定格式&#xff0c;使用土方法&#xff0c;直接對字符進行查找裁剪即可 //截取字符串str中字符a與…

關于軟件測試開發的一些有趣的知識

文章目錄 一、什么是測試&#xff1f;二、為什么要軟件測試軟件測試三、測試的崗位有哪些四 、軟件測試和開發的區別五、走測試崗位為什么還要學開發。4、優秀的測試人員具備的素質我為什么走測試崗位 一、什么是測試&#xff1f; 其實這個問題說簡單也不簡單&#xff0c;說難…

【C++ 基礎數論】質數判斷

質數判斷 質數&#xff1a;對于所有大于 1 的自然數而言&#xff0c;如果該數除 1 和自身以外沒有其它因數 / 約數&#xff0c;則該數被稱為為質數&#xff0c;質數也叫素數。 如何判定一個數是否為質數呢&#xff1f; 一個簡單的方法是 試除法 &#xff1a; 對于一個數 n&…

6to4、6over4的類比解釋

本文由deepseek生成&#xff0c;特此聲明 1. 6to4&#xff1a;自動的“快遞中轉站” 類比場景&#xff1a; 假設你住在一個偏遠的小鎮&#xff08;IPv6網絡&#xff09;&#xff0c;周圍被大海&#xff08;IPv4互聯網&#xff09;包圍&#xff0c;你想給另一個偏遠小鎮&#…