上期我们介绍了C#中的折线工具,本期我们介绍C#中利用MQTT协议连接baidu服务器。

在使用MQTT之前,我们需要获得我们的MQTT服务器地址和相关信息,往期有介绍关于如何使用百度云创建MQTT服务器并获取连接信息的文章,可以参考百度云物联网之MQTT协议创建设备及获取信息。

关于ESP32连接MQTT的部分可以参考下的(哥们能不水就不水)

ESP32物联网教程之MQTT(Ardunio IDE)

但是有一点要注意的是,WIFI的使用会占用ADC2导致ADC2不能用,所以不能使用ADC2,或者先采集数据,再连接WIFI,再上传数据,之后再断开连接·

相关库

在C#中有许多库是可以使用MQTT的,使用较多的有MQTTnet,M2Mqtt等,我们选择的是M2Mqtt库(MQTTnet我没用明白)我们打开NuGet程序包管理。

在其中搜索M2Mqtt

安装最新版即可。

连接MQTT服务器

接着我们在代码中连接我们的MQTT服务器。

首在全局中创建我们的MQTT句柄,用以连接我们的MQTT服务器。

接着加入如下代码,连接MQTT服务器并且配置我们的回调函数

 private void InitializeMqttClient()
        {
            // 服务器地址
            string brokerAddress = "你的服务器地址";

            // 你的用户名和密码
            string username = "你的用户名";
            string password = "你的密码";

            // 创建MqttClient实例
            mqttClient = new MqttClient(brokerAddress);

            // 设置用户名和密码
            mqttClient.Connect(Guid.NewGuid().ToString(), username, password);

            // 订阅主题
            string topic = "你的主题";
            
            mqttClient.Subscribe(new string[] { topic }, new byte[] { MqttMsgBase.QOS_LEVEL_AT_MOST_ONCE });

            // 设置接收消息的回调函数
            //这个Client_MqttMesgPublishReceived是我自己定义的
            mqttClient.MqttMsgPublishReceived += Client_MqttMsgPublishReceived;
            Console.WriteLine($"Connected to {brokerAddress} with username {username}");
        }

服务器的地址用户名和密码,参考开头的那期有讲解如何获取相关信息的。

接着我们在Form函数中调用这个函数,这样子我们在窗口加载的时候就可以连接到我们的MQTT服务器

        public Form1()
        {
            InitializeComponent();
            InitializeMqttClient();
        }

接着我们点击运行,前往百度云的后台查看是否有设备连接并运行。

首先我们可以看到我们的控制台提示:我们已经连接到了MQTT服务器,并且打印了服务器地址以及用户名。

之后在运维管理中,我们也可以看到我们当前有一个设备正在使用。


接收MQTT消息并显示

连接好设备之后,我们需要编写我们的相关回调函数,我们之前定义了我们的回调函数

这里要对其做具体定义。

我们在上一期的时候介绍了如何使用chart控件显示折线图,我们在消息回调函数中,利用chart控件,将我们的信打印出来。

 private void Client_MqttMsgPublishReceived(object sender, MqttMsgPublishEventArgs e)
        {
            // 处理接收到的消息
            string message = Encoding.UTF8.GetString(e.Message);
            number++; 
            Console.WriteLine(message);
            // 在图表中添加新数据点
            this.Invoke((MethodInvoker)delegate
            {
                Series series = chart1.Series[0];
                series.Points.AddXY(number,int.Parse(message));

                // 如果超过一定数量的数据点,删除最旧的数据点,保持图表显示的数据量有限
                if (series.Points.Count > 50)
                {
                    series.Points.RemoveAt(0);
                }
            });
        }

这里我还定义了一个number变量,用以确定折线图的下标。

需要注意的是,我们收到的数据应该使用Encoding.UTF8.GetString方法转化成字符串否则会报错。

接着我们在百度云中,创建一个新的实例,然后模拟设备,进入MQTT服务端

我们需要订阅和我们程序中连接的服务端一样的主题,之后设置我们的消息,点击发布(Publish)

可以看到我们成功的发布了消息。

同样的我们C#中的服务器也接收到了消息并且在折线图中打印了出来。

这样子我们就成功的让我们的C#服务器连接到MQTT云平台啦。

#中的折线工具,本期我们介绍C#
嘉立创PCB

还没有评论,抢个沙发!