C# 基于.NET Framework框架WPF应用程序-MQTTNet库实现MQTT消息订阅发布

C# 基于.NET Framework框架WPF应用程序-MQTTNet库实现MQTT消息订阅发布

MQTT简述

mqtt官网

MQTTNet简述

MQTTnet

MQTTnet 是一个强大的开源 MQTT 客户端库,适用于 C# 平台。它提供了丰富的功能和灵活的 API,可以轻松地构建基于 MQTT 协议的应用程序。

创建项目(基于.NET Framework框架)


安装MQTTNet库

  • NuGet包管理器 搜索MQTTNet

项目源码

csharp 复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;


using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Server;
using MQTTnet.Adapter;
using MQTTnet.Protocol;
using MQTTnet.Formatter;
using MQTTnet.Extensions;

namespace MQTTNetDemo
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public string STR_MQTT_HOST = "mqtt borker host"; // MQTT borker address
        public string STR_MQTT_USERNAME = "your username";
        public string STR_MQTT_PASSWORD = "your password";
        public string STR_MQTT_CLINETID = "mqtt clientid";
        public string STR_MQTT_SUBTOPIC = "topic_device"; // 订阅Topic
        public string STR_MQTT_PUBTOPIC = "topic_server"; // 发布Topic

        private MqttFactory mqttFactory = new MqttFactory();    // 创建MQTT工厂实例
        private IMqttClient mqttClient = null;  // 定义MqttClient接口

        public MainWindow()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 连接MQTT服务
        /// </summary>
        /// <returns></returns>
        private async Task UserMqttConnect()
        { 
            mqttClient = mqttFactory.CreateMqttClient();
            var mqttClientOptions = new MqttClientOptionsBuilder()
                .WithTcpServer(STR_MQTT_HOST, 1883)
                .WithCredentials(STR_MQTT_USERNAME, STR_MQTT_PASSWORD)
                .WithClientId(STR_MQTT_CLINETID)
                .WithCleanSession(true)
                .Build();
            var response = await mqttClient.ConnectAsync(mqttClientOptions);
            Console.WriteLine("The MQTT Client is connected.");
            Console.WriteLine(response.ToString());
        }

        /// <summary>
        /// 断开MQTT服务
        /// </summary>
        /// <returns></returns>
        private async Task UserMqttDisconnect()
        {
            await mqttClient.DisconnectAsync();
            mqttClient.Dispose();
            Console.WriteLine("The MQTT Client is Disconnected.");            
        }

        /// <summary>
        /// MQTT发布消息
        /// </summary>
        /// <param name="payload">消息内容</param>
        /// <returns></returns>
        public async Task UserMqttPublishMessage(string payload)
        {
            if (mqttClient != null && mqttClient.IsConnected == true)
            {
                var publishPacket = new MqttApplicationMessageBuilder()
                    .WithTopic(STR_MQTT_PUBTOPIC)
                    .WithPayload(payload)
                    .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.ExactlyOnce)
                    .Build();

                //MqttQualityOfServiceLevel.AtMostOnce;
                //MqttQualityOfServiceLevel.AtLeastOnce
                //MqttQualityOfServiceLevel.ExactlyOnce;

                await mqttClient.PublishAsync(publishPacket);
            }
            else
            {
                MessageBox.Show("MQTT Client is Disconnected!");
            }
        }

        /// <summary>
        /// MQTT订阅消息
        /// </summary>
        /// <returns></returns>
        private async Task UserMqttSubscribeMessage()
        {
            await mqttClient.SubscribeAsync(new MqttTopicFilterBuilder()
                .WithTopic(STR_MQTT_SUBTOPIC)
                .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtLeastOnce)
                .Build());

            mqttClient.ApplicationMessageReceivedAsync += delegate (MqttApplicationMessageReceivedEventArgs args)
            {
                // TODO: 解析订阅消息payload内容
                var payload = Encoding.UTF8.GetString(args.ApplicationMessage.PayloadSegment.Array);
                Console.WriteLine("Recv Message:" + payload);
                Console.WriteLine("Recv ClientID:" + args.ClientId);
                Console.WriteLine("Recv Topic:" + args.ApplicationMessage.Topic);
                Console.WriteLine("Recv Retain:" + args.ApplicationMessage.Retain); // 指示消息是否为保留消息
                Console.WriteLine("Recv QOS:" + args.ApplicationMessage.QualityOfServiceLevel);

                // Now respond to the broker with a reason code other than success.
                args.ReasonCode = MqttApplicationMessageReceivedReasonCode.ImplementationSpecificError;
                args.ResponseReasonString = "That did not work!";

                // User properties require MQTT V5!
                args.ResponseUserProperties.Add(new MQTTnet.Packets.MqttUserProperty("My", "Data"));


                // Now the broker will resend the message again;
                return Task.CompletedTask;
            };

            Console.WriteLine("The MQTT is subscribe ...\n");
        }

        private async void btnMqttConnect_Click(object sender, RoutedEventArgs e)
        {
            await UserMqttConnect();
        }

        private async void btnMqttDisconnect_Click(object sender, RoutedEventArgs e)
        {
            await UserMqttDisconnect();
        }

        private async void btnMqttSubscribe_Click(object sender, RoutedEventArgs e)
        {
            await UserMqttSubscribeMessage();
        }

        private async void btnMqttPublish_Click(object sender, RoutedEventArgs e)
        {
            if ("" != textBoxMqttPublishMessage.Text)
            {
                string payload = textBoxMqttPublishMessage.Text.ToString();
                await UserMqttPublishMessage(payload);
            }
            else
            {
                MessageBox.Show("发布消息内容为空!");
            }            
        }
    }
}

运行效果

相关推荐
牧马人win5 小时前
.NET 开发 MCP 服务器完全指南:打造智能数据库查询助手
ai·.net·mcp
唐青枫7 小时前
C#.NET Channel 深入解析:高性能异步生产者消费者模型实战
c#·.net
小峥降临1 天前
Rokid UXR 的手势追踪虚拟中更真实的手实战开发【含 工程源码 和 最终完成APK】
c#
国思RDIF框架4 天前
RDIFramework.NET CS 敏捷开发框架 V6.3 版本重磅发布!.NET8+Framework双引擎,性能升级全维度进化
后端·.net
晨星shine5 天前
GC、Dispose、Unmanaged Resource 和 Managed Resource
后端·c#
用户298698530145 天前
.NET 文档自动化:Spire.Doc 设置奇偶页页眉/页脚的最佳实践
后端·c#·.net
用户3667462526745 天前
接口文档汇总 - 2.设备状态管理
c#
用户3667462526745 天前
接口文档汇总 - 3.PLC通信管理
c#
Ray Liang6 天前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计