MQTT客户端(c#)
1、环境
MQTTnet(3.1.2)、net6.0
Client · dotnet/MQTTnet Wiki · GitHub
2、Form1.cs
using MQTTnet; using MQTTnet.Client; using MQTTnet.Client.Connecting; using MQTTnet.Client.Disconnecting; using MQTTnet.Client.Options; using MQTTnet.Client.Receiving; using MQTTnet.Protocol; using System.Text; using WinFormsMq.core; namespace WinFormsMq { public partial class Form1 : Form { private MqttClient mqttClient = null; public Form1() { InitializeComponent(); } public void Init() { cmbQos.SelectedIndex = 0; cmbRetain.SelectedIndex = 0; } ///<summary> ///连接服务器 /// </summary> /// private async Task ConnectMqttServerAsync() { try { if (mqttClient == null||!mqttClient.IsConnected) { var mqttFactory = new MqttFactory(); mqttClient = mqttFactory.CreateMqttClient() as MqttClient; mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnMqttClientConnected); mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnMqttClientDisConnected); mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnSubscriberMessageReceived); var tcpServer = txtIPAddr.Text;//mqtt服务器地址 var tcpPort = int.Parse(txtPort.Text.Trim()); var mqttUser = txtUserName.Text.Trim(); var mqttPassword = txtPWD.Text.Trim(); var options = new MqttClientOptions { ClientId = txtClientID.Text.Trim(), ProtocolVersion = MQTTnet.Formatter.MqttProtocolVersion.V311, ChannelOptions = new MqttClientTcpOptions { Server = tcpServer, Port = tcpPort, }, WillDelayInterval = 100, WillMessage = new MqttApplicationMessage() { Topic = $"LastWill/{txtClientID.Text.Trim()}", Payload = Encoding.UTF8.GetBytes("I lost the connection!"), QualityOfServiceLevel = MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce } }; if (options.ChannelOptions == null) { throw new InvalidOperationException(); } if (!string.IsNullOrEmpty(mqttUser)) { options.Credentials = new MqttClientCredentials { Username = mqttUser, Password = Encoding.UTF8.GetBytes(mqttPassword) }; } options.CleanSession = true; options.KeepAlivePeriod = TimeSpan.FromSeconds(5); await mqttClient.ConnectAsync(options); //客户端尝试连接 } } catch(Exception ex) { //客户端尝试连接出错 this.Invoke(new Action(() => { txtReceiveMessage.AppendText($"MQTT服务器失败!" + Environment.NewLine+ex.Message+Environment.NewLine); })); } } public void OnMqttClientConnected(MqttClientConnectedEventArgs e) { this.Invoke(new Action(() => { txtReceiveMessage.AppendText("已连接到MQTT服务器!" + Environment.NewLine); })); } public void OnMqttClientDisConnected(MqttClientDisconnectedEventArgs e) { this.Invoke(new Action(() => { txtReceiveMessage.AppendText("客户机已断开!" + Environment.NewLine); })); } public void OnSubscriberMessageReceived(MqttApplicationMessageReceivedEventArgs e) { this.Invoke(new Action(() => { txtReceiveMessage.AppendText($">>{Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}{Environment.NewLine}"); })); } ///<summary> ///客户机断开 /// </summary> private async Task ClientStop() { try { if(mqttClient != null) { await mqttClient.DisconnectAsync(); mqttClient=null; } else { return; } }catch (Exception ex) { //客户端尝试断开server出错 } } /// <summary> /// 发布消息 /// </summary> public async void ClientPublishMqttTopic(string topic,string payload) { try { var message = new MqttApplicationMessage() { Topic = topic, Payload = Encoding.UTF8.GetBytes(payload), QualityOfServiceLevel = (MqttQualityOfServiceLevel)cmbQos.SelectedIndex, Retain = bool.Parse(cmbRetain.SelectedItem.ToString()), }; await mqttClient.PublishAsync(message); //客户端发送成工 mqttClient.Options.ClientId topic }catch(Exception ex) { //客户端发送异常 this.Invoke(new Action(() => { txtReceiveMessage.AppendText(Logger.TraceLog(Logger.LogLevel.Info, String.Format($"发布消息失败{{1}}!{Environment.NewLine}", ex.Message))); })); } } /// <summary> /// 传入消息主题 订阅消息 /// </summary> /// <param name="topic"></param> public async void ClientSubscribeTopic(string topic) { await mqttClient.SubscribeAsync(topic); //订阅成功 this.Invoke(new Action(() => { txtReceiveMessage.AppendText(Logger.TraceLog(Logger.LogLevel.Info,String.Format($"客户端{{0}}订阅主题{{1}}成功!{Environment.NewLine}", mqttClient.Options.ClientId,topic))); })); } public async void ClientUnsubscribeTopic(string topic) { await mqttClient.UnsubscribeAsync(topic); //取消订阅 //订阅成功 this.Invoke(new Action(() => { txtReceiveMessage.AppendText(Logger.TraceLog(Logger.LogLevel.Info, String.Format($"客户端{{0}}取消订阅主题{{1}}成功!{Environment.NewLine}", mqttClient.Options.ClientId, topic))); })); } private void butCon_Click(object sender, EventArgs e) { Task.Run(async () => { await ConnectMqttServerAsync(); }); } private void Form1_Load(object sender, EventArgs e) { Init(); } /// <summary> /// 订阅 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnSubscribe_Click(object sender, EventArgs e) { string topic=txtSubTopic.Text.Trim(); if (string.IsNullOrEmpty(topic)) { MessageBox.Show("订阅主题不能为空!"); return; } else if (!mqttClient.IsConnected) { MessageBox.Show("MQTT客户端尚未连接"); return; } else { ClientSubscribeTopic(topic); } } private void BtnPublish_Click(object sender, EventArgs e) { string pubtopic=txtPubTopic.Text.Trim(); if(string.IsNullOrEmpty(pubtopic)) { MessageBox.Show("发布主题不能为空!"); return; } string inputString = txtSendMessage.Text.Trim(); ClientPublishMqttTopic(pubtopic, inputString); } private void BtnUnSub_Click(object sender, EventArgs e) { string topic = txtSubTopic.Text.Trim(); if (string.IsNullOrEmpty(topic)) { MessageBox.Show("取消订阅主题不能为空!"); return; } if (!mqttClient.IsConnected) { MessageBox.Show("MQTT客户端尚未连接"); return; } ClientUnsubscribeTopic(topic); } private void butUnCon_Click(object sender, EventArgs e) { ClientStop(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)