C#中MQTT的使用小結(jié)
一、MQTT:物聯(lián)網(wǎng)通信協(xié)議
MQTT(Message Queuing Telemetry Transport,消息隊列遙測傳輸)是一種輕量級的通信協(xié)議,專為物聯(lián)網(wǎng)(IoT)設計,作用是:
輕量級通信:協(xié)議頭極?。ü潭^部僅2字節(jié)),適合低帶寬、低功耗設備發(fā)布/訂閱模式:設備無需直接通信,通過中間代理(Broker)傳遞消息多種QoS級別:支持QoS 0/1/2,確保消息可靠傳遞 適合場景:智能家居、工業(yè)自動化、車聯(lián)網(wǎng)、智慧城市等物聯(lián)網(wǎng)應用
典型應用:智能燈泡通過主題home/light/control接收開關指令,土壤傳感器將濕度數(shù)據(jù)發(fā)布到farm/section1/moisture,灌溉系統(tǒng)訂閱該主題并自動控制水泵。
1.1 核心模型:發(fā)布/訂閱模式
MQTT的使用模型最核心的就是發(fā)布/訂閱模式,它由三個關鍵角色組成:

1.2 工作流程(簡單版)

1.3 詳細工作流程
- 建立連接:客戶端與代理(Broker)建立TCP連接(可選加密,端口1883或8883)
- 訂閱主題:客戶端向代理發(fā)送訂閱請求,如
home/light/control - 發(fā)布消息:發(fā)布者向指定主題發(fā)布消息,如
home/light/control,內(nèi)容為{"status": "on"} - 消息分發(fā):代理將消息轉(zhuǎn)發(fā)給所有訂閱了該主題的客戶端
- 接收消息:訂閱者接收并處理消息
1.4 超輕量級(最突出的特點?。?/h3>
- 固定報文頭最小僅2字節(jié),比HTTP協(xié)議的報文小多了
- 控制報文只有幾個字節(jié),開發(fā)人員可以很快理解和實現(xiàn)
- 網(wǎng)絡開銷極低,特別適合帶寬有限的設備
- 擁有多語言客戶端(Java、Python、C#、Go等)
- 支持多種連接方式:TCP、SSL/TLS、WebSocket等
- 開源實現(xiàn)豐富,社區(qū)支持好
二、基礎使用示例
C#中主要用兩個庫:
- MQTTnet(推薦!)- 輕量級、功能全,最新版已經(jīng)支持MQTT 5.0
- M2Mqtt - 老牌庫,適合簡單場景
小貼士:MQTTnet 4.3.7+版本是目前主流選擇,功能更豐富,社區(qū)支持也更好
1.安裝庫(NuGet)
使用NuGet安裝 Install-Package MQTTnet
2.簡單客戶端連接示例
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;
// 創(chuàng)建MQTT工廠
var factory = new MqttFactory();
// 配置連接選項
var options = new MqttClientOptionsBuilder()
.WithClientId("CSharpClient")
.WithTcpServer("broker.hivemq.com", 1883) // 替換為你的MQTT服務器地址
.WithCleanSession()
.Build();
// 創(chuàng)建并連接客戶端
var mqttClient = factory.CreateMqttClient();
var connectResult = await mqttClient.ConnectAsync(options);
if (connectResult.ResultCode == MqttClientConnectResultCode.Success)
{
Console.WriteLine("已成功連接到MQTT服務器!");
// 發(fā)布消息
var message = new MqttApplicationMessageBuilder()
.WithTopic("test/topic")
.WithPayload("Hello from C# MQTT!")
.WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce) // QoS 1
.Build();
await mqttClient.PublishAsync(message);
// 訂閱主題
await mqttClient.SubscribeAsync("test/topic");
// 處理收到的消息
mqttClient.ApplicationMessageReceivedAsync += (e) =>
{
Console.WriteLine($"收到消息: {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
return Task.CompletedTask;
};
}3.斷開重連機制(重要?。?/h3>
在實際項目中會遇到網(wǎng)絡波動問題,MQTTnet自帶了重連機制:
// 配置自動重連
var options = new MqttClientOptionsBuilder()
.WithClientId("CSharpClient")
.WithTcpServer("your-broker-address", 1883)
.WithKeepAlivePeriod(TimeSpan.FromSeconds(30))
.WithConnectionRetryInterval(TimeSpan.FromSeconds(5)) // 重連間隔
.Build();
// 連接時處理重連
mqttClient.ConnectAsync(options);
mqttClient.DisconnectedAsync += (e) =>
{
Console.WriteLine("連接已斷開,正在嘗試重連...");
return Task.CompletedTask;
};三、QoS級別選擇指南
選擇QoS級別是MQTT使用中的關鍵決策:

- QoS 0:最多一次,適合不重要的數(shù)據(jù)(如傳感器狀態(tài))
- QoS 1:至少一次,適合一般重要數(shù)據(jù)(如設備控制指令)
- QoS 2:只有一次,適合關鍵數(shù)據(jù)(如訂單確認、支付信息)
在物聯(lián)網(wǎng)場景中,QoS 1是最佳平衡點,既保證可靠性又不會過度消耗資源
四、實際應用場景
4.1 物聯(lián)網(wǎng)數(shù)據(jù)上傳
// 模擬傳感器數(shù)據(jù)
var sensorData = new { Temperature = 25.5, Humidity = 60 };
var json = JsonConvert.SerializeObject(sensorData);
// 發(fā)布到MQTT
var message = new MqttApplicationMessageBuilder()
.WithTopic("sensors/room1")
.WithPayload(json)
.WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
.Build();
await mqttClient.PublishAsync(message);4.2 MQTT到ModbusRTU數(shù)據(jù)轉(zhuǎn)發(fā)(工業(yè)場景)
// 從MQTT接收數(shù)據(jù),轉(zhuǎn)發(fā)到Modbus設備
private void HandleReceivedMessage(MqttApplicationMessageReceivedEventArgs e)
{
var payload = Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
// 解析數(shù)據(jù)并寫入Modbus設備
ModbusWriter.WriteToDevice(payload);
}五、專業(yè)建議
- 使用異步編程:MQTT操作都是I/O密集型,務必使用
async/await,避免阻塞主線程 - 錯誤處理:不要只檢查連接狀態(tài),要處理所有可能的異常
try
{
await mqttClient.ConnectAsync(options);
}
catch (Exception ex)
{
// 記錄錯誤并嘗試重連
Console.WriteLine($"連接失敗: {ex.Message}");
}- 會話管理:根據(jù)需求設置
WithCleanSession(),持久會話適合需要恢復訂閱的場景 - 安全考慮:生產(chǎn)環(huán)境務必使用SSL/TLS加密
.WithTls() .WithTlsVersion(TlsVersion.Tls12)
安全性
- 傳輸加密:使用 TLS/SSL(端口 8883)加密通信,防止中間人攻擊。
- 身份認證:
- 用戶名/密碼認證(推薦強密碼)。
- 更高級方案:客戶端證書(mTLS)、OAuth 2.0(部分 Broker 支持)。
- 訪問控制(ACL):配置 Broker 的 ACL 規(guī)則,限制客戶端對主題的發(fā)布/訂閱權(quán)限。
- 避免明文敏感數(shù)據(jù):即使使用 TLS,也建議對 payload 進行加密或脫敏。
資源與性能優(yōu)化
- 消息大小控制:MQTT 不適合傳輸大文件,建議 payload 控制在 KB 級別。
- 心跳與超時:合理設置 keepAlive 和 broker 的 session expiry。
- Broker 選型與部署:根據(jù)并發(fā)量選擇合適 Broker(如 Mosquitto、EMQX、HiveMQ),并做好集群與監(jiān)控。
六、與MQTT類似的協(xié)議對比

七、協(xié)議選擇建議
- 如果你的設備資源極其有限(電池壽命要求高)→ 選CoAP
- 你需要高可靠性和復雜路由 → 選AMQP
- 你想要簡單易用的文本協(xié)議 → 選STOMP
- 你需要實時交互和擴展性 → 選XMPP
- 你主要是管理設備 → 選LwM2M
到此這篇關于C#中MQTT的使用小結(jié)的文章就介紹到這了,更多相關C# MQTT使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C# AvaloniaUI實現(xiàn)圖片讀取與顯示的兩種方式
在 AvaloniaUI 中,圖片的讀取與顯示可以通過 Image 控件和 Bitmap 類實現(xiàn),以下是一個完整的示例代碼,展示如何從文件路徑加載圖片并顯示在界面上,需要的朋友可以參考下2026-05-05
C#使用NAudio實現(xiàn)監(jiān)聽系統(tǒng)聲音
這篇文章主要為大家詳細介紹了C#如何使用NAudio實現(xiàn)監(jiān)聽系統(tǒng)聲音并屏蔽麥克風其他聲音,文中的示例代碼講解詳細,有需要的小伙伴可以參考下2024-02-02
C# IPAddress 和 IPEndPoint 類的使用小結(jié)
本文主要介紹了C# IPAddress 和 IPEndPoint 類的使用小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2025-12-12

