上期我们介绍了C#中的折线工具,本期我们介绍C#中利用MQTT协议连接百度云服务器。
在使用MQTT之前,我们需要获得我们的MQTT服务器地址和相关信息,往期有介绍关于如何使用百度云创建MQTT服务器并获取连接信息的文章,可以参考
百度云物联网之MQTT协议创建设备及获取信息
。
关于ESP32连接MQTT的部分可以参考公众号下的(哥们能不水就不水)
但是有一点要注意的是,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云平台啦。
** 下期介绍使用ESP32连接MQTT服务器发送数据
(但是MQTT存在很大的缺陷后续可能不会使用MQTT)
**