.Net Mqtt協議-MQTTNet(一)簡介

一、MQTTNet 簡介

MQTTnet 是一個高性能的MQTT類庫,支持.NET Core和.NET Framework。

二、MQTTNet 原理

MQTTnet 是一個用于.NET的高性能MQTT類庫,實現了MQTT協議的各個層級,包括連接、會話、發布/訂閱、QoS(服務質量)等。其原理涉及以下關鍵概念

1、MqttClient: MqttClient 是MQTTnet庫中表示客戶端的主要類。它負責與MQTT服務器建立連接,并處理消息的發布和訂閱。

2、MqttServer: MqttServer 則表示MQTT服務器,負責接受客戶端的連接,管理連接狀態,并轉發消息到相應的訂閱

3、消息處理: MQTT消息分為發布消息和訂閱消息。發布消息由客戶端發送到服務器,然后由服務器廣播給所有訂閱者。

4、QoS(服務質量): MQTT支持不同級別的服務質量,包括0、1和2。MQTTnet允許你根據需要選擇適當的QoS級別。

5、異步通信: MQTTnet廣泛使用異步編程模型,允許并發處理多個連接,提高性能。

三、MQTTNet 優點

1、高性能:?MQTTnet被設計為高性能的MQTT庫,適用于處理大量的消息和連接。

2、跨平臺:?支持.NET Core和.NET Framework,使其可以在不同的操作系統上運行。

3、靈活性:?提供了許多配置選項,允許你根據應用程序的需求進行調整。

4、WebSocket支持:?支持通過WebSocket協議進行通信,適用于Web應用程序。

5、活躍社區:?MQTTnet有一個活躍的社區,提供了文檔、示例和支持。

四、MQTTNet? 使用示例

使用方法(服務端、客戶端、WEB端)

下面是一個簡單的示例,演示如何在.NET Core中使用MQTTnet創建一個基本的MQTT服務端和客戶端。請注意,這個示例只是為了演示基本概念,實際應用中可能需要更多的配置和錯誤處理。

服務器端:

using System;
using MQTTnet;
using MQTTnet.Server;class Program
{static async System.Threading.Tasks.Task Main(string[] args){// 創建服務端配置var optionsBuilder = new MqttServerOptionsBuilder().WithDefaultEndpointPort(1883).WithConnectionValidator(c =>{Console.WriteLine($"Client connected: {c.ClientId}");// 可以在這里添加連接驗證邏輯});// 創建MQTT服務器實例var mqttServer = new MqttFactory().CreateMqttServer();// 處理連接成功事件mqttServer.ClientConnectedHandler = new MqttServerClientConnectedHandlerDelegate(e =>{Console.WriteLine($"Client connected: {e.ClientId}");});// 處理連接斷開事件mqttServer.ClientDisconnectedHandler = new MqttServerClientDisconnectedHandlerDelegate(e =>{Console.WriteLine($"Client disconnected: {e.ClientId}");});// 處理接收到消息事件mqttServer.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(e =>{Console.WriteLine($"Received message from client {e.ClientId}: {e.ApplicationMessage.Payload}");});// 啟動MQTT服務器await mqttServer.StartAsync(optionsBuilder.Build());Console.WriteLine("MQTT Server已啟動。按任意鍵退出。");Console.ReadLine();// 停止MQTT服務器await mqttServer.StopAsync();}
}

客戶端鏈接:

using System;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;class Program
{static async Task Main(string[] args){// 創建客戶端配置var options = new MqttClientOptionsBuilder().WithTcpServer("localhost", 1883).WithClientId("Client1") // 客戶端ID.Build();// 創建MQTT客戶端實例var mqttClient = new MqttFactory().CreateMqttClient();// 處理連接成功事件mqttClient.UseConnectedHandler(e =>{Console.WriteLine("Connected to MQTT Broker");});// 處理連接斷開事件mqttClient.UseDisconnectedHandler(e =>{Console.WriteLine("Disconnected from MQTT Broker");});// 處理接收到消息事件mqttClient.UseApplicationMessageReceivedHandler(e =>{Console.WriteLine($"Received message: {e.ApplicationMessage.Payload}");});// 連接到MQTT服務器await mqttClient.ConnectAsync(options, CancellationToken.None);// 發布消息var message = new MqttApplicationMessageBuilder().WithTopic("topic/test").WithPayload("Hello, MQTT!").WithExactlyOnceQoS().WithRetainFlag().Build();await mqttClient.PublishAsync(message, CancellationToken.None);Console.WriteLine("Message published. Press any key to exit.");Console.ReadLine();// 斷開與MQTT服務器的連接await mqttClient.DisconnectAsync();}
}

Web端鏈接:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="https://cdnjs.cloudflare.com/ajax/libs/mqtt/4.0.0/mqtt.min.js"></script><title>MQTT Web Client</title>
</head>
<body><h1>MQTT Web Client</h1><script>// 連接到MQTT服務器const client = mqtt.connect('mqtt://your-mqtt-broker-url');// 當連接成功時的處理邏輯client.on('connect', function () {console.log('Connected to MQTT Broker');// 訂閱主題client.subscribe('topic/test', function (err) {if (!err) {console.log('Subscribed to topic/test');}});// 發布消息client.publish('topic/test', 'Hello, MQTT!');});// 當接收到消息時的處理邏輯client.on('message', function (topic, message) {console.log('Received message:', message.toString());});// 處理連接斷開事件client.on('close', function () {console.log('Connection closed');});// 處理錯誤事件client.on('error', function (err) {console.error('Error:', err);});</script>
</body>
</html>

總結

以上代碼中對連接斷開事件處理(UseDisconnectedHandler、Web端的close事件)和錯誤事件處理(Web端的error事件)。

這些事件處理可以根據實際需求進一步擴展。

文章來源:.NET 中MQTTnet使用方法,物聯網通訊必備 - MQTT中文站

更多:

MQTT協議介紹

微信小程序WebSocket使用案例

Asp.Net Core6 WebSocket 簡單案例

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

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

相關文章

時鐘晶振鎖相環pll方向技術要點和大廠題目解析

本專欄預計更新60期左右。當前第9期。 本專欄不僅適用于硬件的筆試面試,同樣也適用于梳理硬件核心的知識點。 通過本文能得到什么? 首先,根據實戰經驗總結時鐘晶振,鎖相環的主要知識點,技術要點,面試考點; 然后,列出時鐘晶振,鎖相環的筆試面試的主要題型真題和模擬題,…

機器學習 day6 -線性回歸練習

題目?&#xff1a; 從Kaggle的“House Prices - Advanced Regression Techniques”數據集使用Pandas讀取數據&#xff0c;并查看數據的基本信息。選擇一些你認為對房屋價格有重要影響的特征&#xff0c;并進行數據預處理&#xff08;如缺失值處理、異常值處理等&#xff09;。…

緩存(2):數據一致性

概述 一致性就是數據保持一致,在分布式系統中,可以理解為多個節點中數據的值是一致的。 強一致性:這種一致性級別是最符合用戶直覺的,它要求系統寫入什么,讀出來的也會是什么,用戶體驗好,但實現起來往往對系統的性能影響大弱一致性:這種一致性級別約束了系統在寫入成功…

CH579 CH573 CH582 CH592 藍牙主機(Central)實例應用講解

藍牙主機&#xff08;Central&#xff09;&#xff0c;顧名思義&#xff0c;就是一個藍牙主設備&#xff0c;與從機&#xff08;Peripheral&#xff09;建立連接進行通信&#xff0c;可以接收從機通知&#xff0c;也可以給從機發送信息&#xff0c;通常Central和Peripheral結合…

不同類型的 SAP 項目

目錄 1 實施項目 2 SAP S/4 HANA 升級項目 3 數據遷移項目 4 優化項目 5 Rollout 項目 6 運維項目 1 實施項目 企業第一次用 SAP 系統&#xff0c;從硬件搭建到安裝 SAP、根據業務流程做配置、開發、培訓業務、測試系統直到系統上線。 SAP S/4 HANA ACTIVATE 實施方法論…

【uniapp】errMsg: “navigateTo:fail timeout“

項目場景&#xff1a; 在點擊編輯的時候不能跳轉的編輯的頁面&#xff0c;然后直接報錯errMsg: "navigateTo:fail timeout" 解決方案&#xff1a; 看看是否是出現了盒子的冒泡事件導致了兩次調用跳轉路徑 tap.stop

記錄學習的第三十五天

今天主攻單源最短路Dijkstra算法。不過&#xff0c;還是沒有完全掌握。 首先是書本的例題我理解了一遍。 然后其實在力扣上做了三道題的&#xff0c;但是我看題解的情況就不太會。然后試著用上面的方法敲了一下↓的題&#xff0c;但是不對啊&#xff0c;我也不知道為什么呀。

Spring-博客系統項目

一,實現效果 登錄: 注冊: 博客列表 個人博客中心 博客詳情: 更新博客 編寫博客 二,數據庫的建立和連接 首先,需要建庫,需要兩個實體,一個是用戶,一個是博客,需要如下屬性,需要注意的是需要將密碼的變長字符創設置的長一些,因為之后會對用戶的密碼進行加密,該博客中密碼…

依賴注入詳解與案例(前端篇)

依賴注入詳解與案例&#xff08;前端篇&#xff09; 一、依賴注入核心概念與前端價值 依賴注入&#xff08;Dependency Injection, DI&#xff09; 是一種通過外部容器管理組件/類間依賴關系的設計模式&#xff0c;其核心是控制反轉&#xff08;Inversion of Control, IoC&…

diy裝機成功錄

三天前&#xff0c;我正式開啟了這次裝機之旅&#xff0c;購入了一顆性能強勁的 i5-12400 CPU&#xff0c;一塊繪圖能力出色的 3060ti 顯卡&#xff0c;還有技嘉主板、高效散熱器、16G 內存條、2T 固態硬盤&#xff0c;以及氣派的機箱和風扇&#xff0c;滿心期待能親手打造一臺…

計算機三大主流操作系統的前世今生 - Linux|macOS|Windows

全文目錄 1 引言2 起源之路2.1 Linux 起源2.2 macOS 起源2.3 Windows 起源 3 綜合解析3.1 Linux系統綜合解析3.1.1 系統定義與核心架構3.1.2 發展歷程3.1.3 核心特點3.1.4 主流發行版3.1.5 應用場景 3.2 macOS系統綜合解析3.2.1 系統定義與核心架構3.2.2 發展歷程3.2.3 核心特點…

【AI智能推薦系統】第七篇:跨領域推薦系統的技術突破與應用場景

第七篇:跨領域推薦系統的技術突破與應用場景 提示語:?? “打破數據孤島,實現1+1>2的推薦效果!深度解析美團、亞馬遜如何用跨領域推薦技術實現業務協同,知識遷移核心技術全公開!” 目錄 跨領域推薦的商業價值跨領域推薦技術體系 2.1 基于共享表征的學習2.2 遷移學習…

R 語言科研繪圖 --- 桑基圖-匯總

在發表科研論文的過程中&#xff0c;科研繪圖是必不可少的&#xff0c;一張好看的圖形會是文章很大的加分項。 為了便于使用&#xff0c;本系列文章介紹的所有繪圖都已收錄到了 sciRplot 項目中&#xff0c;獲取方式&#xff1a; R 語言科研繪圖模板 --- sciRplothttps://mp.…

LintCode第485題-生成給定大小的數組,第220題-冰雹猜想,第235題-分解質因數

第485題 描述 給你一個大小size,生成一個元素從1 到 size的數組 樣例 1:輸入: size 4輸出: [1, 2, 3, 4]樣例解釋: 返回一個順序填充1到4的數組。樣例 2:輸入: size 1輸出: [1]樣例解釋: 返回一個順序填充1到1的數組 代碼如下: public class Solution { /** * param s…

Pandas:數據處理與分析

目錄 一、Pandas 簡介 二、Pandas 的安裝與導入 三、Pandas 的核心數據結構 &#xff08;一&#xff09;Series &#xff08;二&#xff09;DataFrame 四、Pandas 數據讀取與寫入 &#xff08;一&#xff09;讀取數據 &#xff08;二&#xff09;寫入數據 五、數據清洗…

Linux云計算訓練營筆記day05(Rocky Linux中的命令:管道操作 |、wc、find、vim)

管道操作 | 作用: 將前面命令的輸出&#xff0c;傳遞給后面命令&#xff0c;作為后面命令的參數 head -3 /etc/passwd | tail -1 取第三行 head -8 /etc/passwd | tail -3 | cat -n 取6 7 8行 ifconfig | head -2 | tail -1 只查看IP地址 ifconfig | grep 192 過濾192的ip…

動態規劃:最長遞增子序列

給定一個數組&#xff0c;求最長遞增子序列的長度,就是要求我們求出一個序列中最長的上升子序列的長度&#xff0c;最長上升子序列的定義就是從原序列中按照孫旭去除一些數字&#xff0c;這些數字是逐漸增大的。 *定義dp[i]表示以第i個元素結尾的最長上升子序列的長度。 *初始…

湖北理元理律師事務所:債務優化如何實現還款與生活的平衡?

債務壓力往往讓債務人陷入“還款還是生存”的兩難選擇。湖北理元理律師事務所通過案例實踐發現&#xff0c;科學規劃的核心在于平衡法律義務與基本生活保障&#xff0c;而非單純追求債務縮減。本文結合實務經驗&#xff0c;解析債務優化的可行路徑。 剛性需求優先&#xff1a;…

重力場模型、球諧函數以及重力異常

地球重力場有兩種表達方法&#xff1a; 1、拉普拉斯&#xff08;Laplace&#xff09;方法&#xff0c;將重力場展開為球諧級數。 2、斯托克斯&#xff08;Stokes&#xff09;方法&#xff0c;根據地球的總質量和旋轉角速度計算。 本篇主要說第一種方法&#xff0c;該方法將地…

MySQL的視圖

一、MySQL視圖的介紹和作用 MySQL視圖&#xff0c;加油兄弟們&#xff0c;孰能生巧&#xff0c;完整代碼在最后&#xff01;&#xff01;&#xff01; 視圖是一個虛擬的表&#xff0c;并不是真是存在的&#xff0c;視圖其實并沒有真實的數據&#xff0c;他只是根據一個sql語句…