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("发布消息内容为空!");
            }            
        }
    }
}

运行效果

相关推荐
shangjg32 小时前
Kafka 如何保证顺序消费
c#·linq
FuckPatience2 小时前
C# 关于闭包与多线程结合使用
c#
半青年3 小时前
IEC61850规约客户端软件开发实战(第二章)
java·c++·qt·网络协议·c#·信息与通信·iec61850
TA远方3 小时前
【C#】一个简单的http服务器项目开发过程详解
服务器·http·c#·wpf·web·winform·console
CodeCraft Studio3 小时前
国产化Excel处理组件Spire.XLS教程:如何使用 C# 将 Excel(XLS 或 XLSX)文件转换为 PDF
pdf·c#·excel
ArabySide3 小时前
【EF Core】 EF Core 批量操作的进化之路——从传统变更跟踪到无跟踪更新
数据库·.net·efcore
招财进宝。。4 小时前
c# 获取电脑 分辨率 及 DPI 设置
开发语言·c#·电脑
zybsjn5 小时前
后端项目中静态文案国际化语言包构建选型
java·后端·c#
vvilkim5 小时前
深入理解C#异步编程:原理、实践与最佳方案
服务器·开发语言·c#
阿蒙Amon9 小时前
C#数字金额转中文大写金额:代码解析
java·mysql·c#