软件环境:VS2022

窗体界面,做的比较粗糙,重点记录过程!

1.新建项目

一般这种软件的路径最好不要有中文路径

直接创建即可,这个版本的vs比之前的版本要精简很多。

2.布置所需控件

控件的布局可以根据自己的需求去设置,遇到控件的使用建议通过AI软件直接搜索,比较简单。窗体布局参考下图,直接从左边的”工具箱“拖动到”Form1.cs[设计]“即可。常用的几种控件。

3.重要代码

添加依赖库,右键 解决方案资源管理器的项目名称,选择”管理NuGet程序包(N)“,在弹出的界面搜索关键字”MQTT“,在搜索结果中选择下图橙色框 下载即可。

下载完毕后,就可以在依赖项-》包 中看到:

然后在”Form1.cs“的第一行插入以下代码:

using System;
using System.Windows.Forms;
using uPLibrary.Networking.M2Mqtt;
using uPLibrary.Networking.M2Mqtt.Messages;

添加服务器相关变量

 // MQTT 客户端实例
 private MqttClient mqttClient = null;
 // MQTT 服务器地址
 private string mqttBrokerAddress = "**.**.***.***";
 // MQTT 服务器端口
 private int mqttBrokerPort = 1883;

(1)连接服务器、数据处理

在”Form1.cs“中添加mqtt的连接和接收处理函数

 private void client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
 {
     // 接收到消息时触发此事件
     string message = System.Text.Encoding.UTF8.GetString(e.Message);

     // 更新 UI 显示接收到的消息
     UpdateReceivedData(message);
 }

 private void UpdateReceivedData(string message)
 {
     // 由于消息接收事件在后台线程中触发,需要使用 Invoke 方法更新 UI
     if (this.label4.InvokeRequired)
     {
         this.label4.Invoke(new Action<string>(UpdateReceivedData), new object[] { message });
     }
     else
     {
        //接收到的数据进行处理、显示,这部分代码根据自己需求更改即可
         if (checkBox1.Checked)
             this.label4.Text = $" {message.Substring(0, 4)}";
     }
 }

(2)button控件处理

双击”Form1.cs[设计]“中的”连接“按钮,就会生成对应按钮的处理函数,函数的内容:

 private void button1_Click(object sender, EventArgs e)
 {
     if (textBox1.Text.Length != 0)
     {
         // 创建 MQTT 客户端实例
         mqttClient = new MqttClient(mqttBrokerAddress, mqttBrokerPort, false, null, null, MqttSslProtocols.None);

         // 注册消息接收事件
         mqttClient.MqttMsgPublishReceived += client_MqttMsgPublishReceived;

         // 生成客户端 ID 并连接到 MQTT 服务器
         string clientId = Guid.NewGuid().ToString();
         mqttClient.Connect(clientId);
         topic = textBox1.Text;
         // 订阅主题
         mqttClient.Subscribe(new string[] { textBox1.Text }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE });

         label12.Text = "连接成功" + "  " + textBox1.Text;
     }
     else
         MessageBox.Show("订阅主题不能为空");
 }

其中textBox1为订阅主题的获取,如果订阅主题固定可以在程序”textBox1.Text“的位置直接替换为字符串,如订阅主题为”topic“,则上面代码替换为以下:

mqttClient.Subscribe(new string[] { "Topic" }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_LEAST_ONCE });

是否连接成功可通过EMQX Dashboard查看:

重复上面过程,为”断开“按钮添加处理事件

private void button2_Click(object sender, EventArgs e)
{
    if ((textBox1.Text.Length != 0) && (topic == textBox1.Text))
    {
        // 取消订阅
        mqttClient.Unsubscribe(new string[] { textBox1.Text });

        // 断开连接
        mqttClient.Disconnect();

        label12.Text = "已断开连接";
    }
    else
    {
        MessageBox.Show("订阅主题已更改");//断开连接 主题不能更改限制
    }

}

断开连接测试,刚才的连接已经消失,代表成功!

上面内容只是MQTT的连接和断开,相当于路是通了,控件的处理还是要单独处理呀!AI起来非常简单.....

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐