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();
        }
    }
}

 

posted @ 2022-04-13 09:33  天明宝  阅读(3805)  评论(0编辑  收藏  举报