• 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();
            }
        }
    }
  • 相关阅读:
    [学习笔记&教程] 信号, 集合, 多项式, 以及各种卷积性变换 (FFT,NTT,FWT,FMT)
    [学习笔记] CDQ分治&整体二分
    [日常] NOIp 2018 滚粗记
    [学习笔记] 模拟退火 (Simulated Annealing)
    [日常] NOIWC 2018爆零记
    [日常] PKUWC 2018爆零记
    [日常] 最近的一些破事w...
    [BZOJ 1877][SDOI2009]晨跑
    [COGS 2583]南极科考旅行
    [日常] NOIP 2017滚粗记
  • 原文地址:https://www.cnblogs.com/watm/p/16138771.html
Copyright © 2020-2023  润新知