三、使用C#PC端编程读取MQTT服务器上特定的主题信息
以下是使用C#编程利用MQTT协议接收MQTT服务器“mqtt.laobai.net”上的“laobai_topic001”主题上的订阅信息,并动态显示在多行文本框中的程序代码示例,包括完整的代码注释和编程说明:
using System;
using System.Windows.Forms;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;
using MQTTnet.Extensions.ManagedClient;
namespace MQTT_Client
{
public partial class MainForm : Form
{
private IManagedMqttClient mqttClient;
public MainForm()
{
InitializeComponent();
}
private async void MainForm_Load(object sender, EventArgs e)
{
// 创建MQTT客户端实例
var options = new ManagedMqttClientOptionsBuilder()
.WithAutoReconnectDelay(TimeSpan.FromSeconds(5)) // 设置自动重新连接的延迟时间
.WithClientOptions(new MqttClientOptionsBuilder()
.WithTcpServer("mqtt.laobai.net", 1883) // 设置MQTT服务器地址和端口
.WithCredentials("username", "password") // 设置MQTT服务器的用户名和密码(如果需要)
.WithClientId("client1") // 设置MQTT客户端ID
.Build())
.Build();
mqttClient = new MqttFactory().CreateManagedMqttClient();
// 订阅消息接收事件
mqttClient.UseApplicationMessageReceivedHandler(HandleReceivedMessage);
// 连接到MQTT服务器
await mqttClient.StartAsync(options);
// 订阅主题
await mqttClient.SubscribeAsync("laobai_topic001");
// 显示连接成功信息
AppendToTextBox("Connected to MQTT server.");
}
private async void HandleReceivedMessage(MqttApplicationMessageReceivedEventArgs e)
{
// 处理接收到的消息
string topic = e.ApplicationMessage.Topic;
string payload = System.Text.Encoding.UTF8.GetString(e.ApplicationMessage.Payload);
// 在文本框中显示接收到的消息
AppendToTextBox($"Topic: {topic}, Message: {payload}");
// 处理完消息后,确认接收
await mqttClient.PublishAsync(new MqttApplicationMessageBuilder()
.WithTopic(e.ApplicationMessage.Topic)
.WithPayload("")
.WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
.WithRetainFlag(false)
.Build());
}
private void AppendToTextBox(string message)
{
// 在多行文本框中动态显示消息
textBox.AppendText($"{message}{Environment.NewLine}");
}
private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
// 断开与MQTT服务器的连接
mqttClient.StopAsync();
}
}
}
上述代码是一个Windows窗体应用程序,其中包含了一个多行文本框(textBox)用于显示接收到的MQTT消息。
在窗体的Load
事件处理程序中,创建了一个MQTT客户端实例,并设置了自动重新连接的延迟时间、MQTT服务器的地址和端口、用户名和密码以及客户端ID。
然后,订阅了消息接收事件,并在事件处理程序中处理接收到的消息,将其显示在多行文本框中。
在HandleReceivedMessage
方法中,通过MqttApplicationMessageReceivedEventArgs
参数获取消息的主题和内容,然后调用AppendToTextBox
方法将其显示在多行文本框中。
在处理消息后,通过调用PublishAsync
方法发送确认消息,以确保消息已被接收。
在窗体的Closing
事件处理程序中,调用StopAsync
方法断开与MQTT服务器的连接。
请注意,上述代码是一个简单的示例,你可以根据实际需求进行修改和扩展。同时,你需要在窗体中添加一个多行文本框(名为textBox
)以显示接收到的MQTT消息。另外,你还需要在项目中添加对"MqttNet"库的引用,可以通过NuGet包管理器或手动下载并添加引用。