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

运行效果

相关推荐
界面开发小八哥21 分钟前
DevExpress ASP.NET Web Forms v25.1新版本开发环境配置要求
c#·asp.net·界面控件·devexpress·ui开发
范纹杉想快点毕业4 小时前
C 语言主控开发与显控开发能力体系及技术栈详解,STM32、QT、嵌入式、边缘系统显示
stm32·单片机·tcp/ip·microsoft·fpga开发·51单片机·wpf
燃尽了,可无5 小时前
Socket通信与网络编程实战
c#·scket通信
钢铁男儿5 小时前
C# 异步编程(计时器)
开发语言·c#
weixin_4471035812 小时前
WPF之绑定!
c#·wpf
喵叔哟12 小时前
41.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--网关集成Swagger
微服务·架构·.net
追逐时光者12 小时前
一款基于 WPF 开源、轻量级的 Markdown 编辑器
.net·markdown
Dm_dotnet13 小时前
WPF优秀项目推荐:Stylet 一个非常轻量但强大的 ViewModel-First MVVM 框架
c#
DataIntel14 小时前
wpf问题记录
wpf
伽蓝_游戏17 小时前
UGUI源码剖析(5):事件的旅程——EventSystem的架构与输入处理管线
游戏·ui·unity·架构·c#·游戏引擎·.net