MQTT客户端的实现

1、准备
下载MQTTNet库
2、界面设计
在这里插入图片描述
3、编程

public ClientForm()
        {
            InitializeComponent();
            cbbClientQos.SelectedIndex = 0;
            cbbClientRetain.SelectedIndex = 0;
            this.btClientConnect.Tag = 0;
            MonitorListBoxInitialize();
        }
        private Action<string> _updateMonitorAction;
        /// <summary>
        /// monitor列表显示控制
        /// </summary>
        private void MonitorListBoxInitialize()
        {
            _updateMonitorAction = new Action<string>((s) =>
            {
                this.lbxMonitor.Items.Add(s);
                if (this.lbxMonitor.Items.Count > 100)
                {
                    this.lbxMonitor.Items.RemoveAt(0);
                }
                var visibleItems = this.lbxMonitor.ClientRectangle.Height / this.lbxMonitor.ItemHeight;
                this.lbxMonitor.TopIndex = this.lbxMonitor.Items.Count - visibleItems + 1;
            });
        }
        #region EventProcess
        private async void btClientConnect_Click(object sender, EventArgs e)
        {
            try
            {
                if (int.Parse(this.btClientConnect.Tag.ToString()) == 0)
                {
                    await ClientStart();
                }else if(int.Parse(this.btClientConnect.Tag.ToString()) == 1)
                {
                    await ClientStop();
                }
            }catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private void btClientPublish_Click(object sender, EventArgs e)
        {
            try
            {
                if(mqttClient==null || !mqttClient.IsConnected)
                {
                    MessageBox.Show("请连接MQTT服务器", "消息", MessageBoxButtons.OK);
                    return;
                }
                string topic = this.rtbClentPublishTopic.Text;
                if (topic.Trim() == "")
                {
                    MessageBox.Show("Topic不能为空", "消息", MessageBoxButtons.OK);
                }
                string payload = this.rtbClientPublishPayLoad.Text;
                ClientPublishMqttTopic(topic, payload);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

        private void btClientSubscribe_Click(object sender, EventArgs e)
        {
            try
            {
                if (mqttClient == null || !mqttClient.IsConnected)
                {
                    MessageBox.Show("请连接MQTT服务器", "消息", MessageBoxButtons.OK);
                    return;
                }
                string topic = this.tbClientSubscribe.Text;
                if (topic.Trim() == "")
                {
                    MessageBox.Show("Topic不能为空", "消息", MessageBoxButtons.OK);
                }
                ClientSubscribeTopic(topic);
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        #endregion

        #region MQTT Client
        private MqttClient mqttClient = null;
        private async Task ClientStart()
        {
            try
            {
                var ip = this.tbClientSetIp.Text;
                var port = int.Parse(this.tbClientSetPort.Text.Trim());
                var username = this.tbClientSetUsername.Text.Trim();
                var password = this.tbClientSetPassword.Text.Trim();
                var mqttFactory = new MqttFactory();
                var options = new MqttClientOptions
                {
                    ClientId = this.tbClientSetClientId.Text.Trim(),
                    ProtocolVersion=MQTTnet.Formatter.MqttProtocolVersion.V311,
                    ChannelOptions=new MqttClientTcpOptions
                    {
                        Server=ip,
                        Port=port
                    },
                    WillDelayInterval=10,
                    WillMessage=new MqttApplicationMessage()
                    {
                        Topic=$"LastWill/{this.tbClientSetClientId.Text.Trim()}",
                        Payload=Encoding.UTF8.GetBytes("Lost the connection"),
                        QualityOfServiceLevel=MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce
                    }
                };
                if (options.ChannelOptions == null)
                {
                    throw new InvalidOperationException();
                }
                if (!string.IsNullOrEmpty(username))
                {
                    options.Credentials = new MqttClientCredentials
                    {
                        Username = username,
                        Password = Encoding.UTF8.GetBytes(password)
                    };
                }
                options.CleanSession = true;
                options.KeepAlivePeriod = TimeSpan.FromSeconds(5);
                mqttClient = mqttFactory.CreateMqttClient() as MqttClient;
                mqttClient.ConnectedHandler = new MqttClientConnectedHandlerDelegate(OnMqttClientConnected);
                mqttClient.DisconnectedHandler = new MqttClientDisconnectedHandlerDelegate(OnMqttClientDisConnected);
                mqttClient.ApplicationMessageReceivedHandler = new MqttApplicationMessageReceivedHandlerDelegate(OnSubscribeMessageReceived);
                await mqttClient.ConnectAsync(options);
                this.lbxMonitor.BeginInvoke(_updateMonitorAction, $"客户端[{options.ClientId}]尝试连接");
            }
            catch(Exception ex)
            {
                this.lbxMonitor.BeginInvoke(_updateMonitorAction, $"客户端尝试连接出错:{ex.Message}");
            }
        }
        private async Task ClientStop()
        {
            try
            {
                if (mqttClient == null) return;
                await mqttClient.DisconnectAsync();
                mqttClient = null;
            }catch(Exception ex)
            {
                this.lbxMonitor.BeginInvoke(_updateMonitorAction, $"客户端尝试断开出错:{ex.Message}");
            }
        }
        private async void ClientPublishMqttTopic(string topic,string payload)
        {
            try
            {
                var message = new MqttApplicationMessage()
                {
                    Topic = topic,
                    Payload = Encoding.UTF8.GetBytes(payload),
                    QualityOfServiceLevel = (MqttQualityOfServiceLevel)this.cbbClientQos.SelectedIndex,
                    Retain = bool.Parse(this.cbbClientRetain.ToString())
                };
                await mqttClient.PublishAsync(message);
                this.lbxMonitor.BeginInvoke(_updateMonitorAction, $"客户端{mqttClient.Options.ClientId}发布主题{topic}成功");
            }catch(Exception ex)
            {
                this.lbxMonitor.BeginInvoke(_updateMonitorAction, $"客户端{mqttClient.Options.ClientId}发布主题{topic}异常");
            }
        }
        private async void ClientSubscribeTopic(string topic)
        {
            await mqttClient.SubscribeAsync(topic);
            this.lbxMonitor.BeginInvoke(_updateMonitorAction, $"客户端{mqttClient.Options.ClientId}订阅主题{topic}成功");
        }
        private async void ClientUnSubscribeTopic(string topic)
        {
            await mqttClient.UnsubscribeAsync(topic);
            this.lbxMonitor.BeginInvoke(_updateMonitorAction, $"客户端{mqttClient.Options.ClientId}取消主题{topic}成功");
        }

        private void OnSubscribeMessageReceived(MqttApplicationMessageReceivedEventArgs obj)
        {
            string Payload = Encoding.UTF8.GetString(obj.ApplicationMessage.Payload);
            string Topic = obj.ApplicationMessage.Topic;
            string QoS = obj.ApplicationMessage.QualityOfServiceLevel.ToString();
            string Retained = obj.ApplicationMessage.Retain.ToString();
            this.lbxMonitor.BeginInvoke(_updateMonitorAction, $"客户端接收到消息Topic:{Topic},Qos:{QoS},Retained:{Retained}");
            this.lbxMonitor.BeginInvoke(_updateMonitorAction, $"客户端接收到消息Payload:{Payload}");
        }

        private void OnMqttClientDisConnected(MqttClientDisconnectedEventArgs obj)
        {
            this.btClientConnect.BeginInvoke(new Action<string, int, Color>((s, i, c) => {
                this.btClientConnect.Text = s;
                this.btClientConnect.Tag = i;
                this.btClientConnect.BackColor = c;
            }), "断开", 0, Color.LightGray);
        }

        private void OnMqttClientConnected(MqttClientConnectedEventArgs obj)
        {
            this.btClientConnect.BeginInvoke(new Action<string, int, Color>((s, i, c) => {
                this.btClientConnect.Text = s;
                this.btClientConnect.Tag = i;
                this.btClientConnect.BackColor = c;
            }),"连接",1,Color.LightGreen);
        }
        #endregion

4、运行效果
在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Qt是一个跨平台的GUI开发框架,通过Qt库可以很方便地实现各种功能。MQTT是一种轻量级的消息发布/订阅协议,用于在物联网设备之间传输消息。因此,我们可以通过Qt实现MQTT客户端来进行消息的发布和订阅。 首先,我们需要在Qt项目中添加MQTT库的支持。可以使用Qt自带的网络模块或者第三方的MQTT库,如QMQTT、Paho等。然后,在Qt的代码中引入相关的头文件,并创建一个MQTT客户端对象。 接下来,我们可以配置MQTT客户端的连接参数,包括服务器地址、端口号、用户名、密码等。可以通过调用MQTT客户端对象的setHostname、setPort、setUsername、setPassword等方法进行设置。 然后,我们需要连接到MQTT服务器。可以调用MQTT客户端对象的connect方法来连接到服务器。连接成功后,可以订阅特定的主题或者取消已有的订阅。可以调用MQTT客户端对象的subscribe和unsubscribe方法进行操作。 在连接成功后,我们可以发送消息到指定的主题。可以调用MQTT客户端对象的publish方法来发送消息,需要指定消息的主题和内容。同时,我们也可以接收来自服务器的消息。可以通过继承MQTT客户端的回调函数,在接收到消息时进行处理。 最后,在使用完MQTT客户端后,记得要正确地关闭连接,以释放资源。可以调用MQTT客户端对象的disconnect方法来关闭连接。 通过以上步骤,我们就可以使用Qt实现一个简单的MQTT客户端。通过该客户端,我们可以实现消息的发布和订阅功能,方便地在物联网设备之间进行通信。当然,具体的实现细节还需要根据具体的需求进行适配和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大浪淘沙胡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值