在Net8.0中使用 MQTTnet 开源库实现 MQTT 应用程序开发(实践)

news2024/11/25 0:52:15

在这里插入图片描述

1. 介绍

MQTTnet 是一个强大的开源 MQTT 客户端库,适用于 C# 平台。它提供了丰富的功能和灵活的 API,可以轻松地构建基于 MQTT 协议的应用程序。本文将逐步学习如何使用 MQTTnet 库创建 MQTT 客户端,并实现基本的发布、订阅功能。

简介

在这里插入图片描述
什么是MQTT?

在这里插入图片描述
MQTT的发布和订阅架构

在这里插入图片描述

2. 搭建MQTT Broker

在Windows 系统上搭建 MQTT Broker,前一篇文章 Docker部署Eclipse Mosquitto开源MQTT的消息代理环境步骤(实践),我们使用docker搭建了Mosquitto环境。如果你觉得比较麻烦,也可以使用软件包来搭建环境。
在这里插入图片描述
具体的搭建步骤,可以查看官网。

3. 安装MQTTnet库

在这里插入图片描述

通过 NuGet 包管理器将 MQTTnet 库添加到我们的项目中。
在这里插入图片描述

4. 项目编码开发

1. MqttSubscriber项目

  1. 新建MqttSubscriber项目。
    在这里插入图片描述
  2. 配置引用MQTTnet库
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
	<ItemGroup>
		<PackageReference Include="MQTTnet" Version="4.3.3.952" />
		<PackageReference Include="MQTTnet.Extensions.ManagedClient" Version="4.3.3.952" />
	</ItemGroup>

</Project>
  1. 编写订阅代码
using System.Text;
using MQTTnet;
using MQTTnet.Client;

class Program
{
    static async Task Main(string[] args)
    {
        var options = new MqttClientOptionsBuilder()
            .WithTcpServer("localhost", 1883)
            .WithCredentials("root","root")
            .Build();

        var factory = new MqttFactory();
        var mqttClient = factory.CreateMqttClient();

        mqttClient.ApplicationMessageReceivedAsync += MqttClient_ApplicationMessageReceivedAsync;

        await mqttClient.ConnectAsync(options);
        await mqttClient.SubscribeAsync("testtopic");

        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();

        await mqttClient.DisconnectAsync();
    }

    private static Task MqttClient_ApplicationMessageReceivedAsync(MqttApplicationMessageReceivedEventArgs arg)
    {
        Console.WriteLine($"Received message: {Encoding.UTF8.GetString(arg.ApplicationMessage.PayloadSegment)}");
        return Task.CompletedTask;
    }
}

2. MqttPublisher项目

  1. 新建MqttPublisher项目。
    在这里插入图片描述
  2. 配置引用MQTTnet库
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>
	<ItemGroup>
		<PackageReference Include="MQTTnet" Version="4.3.3.952" />
		<PackageReference Include="MQTTnet.Extensions.ManagedClient" Version="4.3.3.952" />
	</ItemGroup>

</Project>
  1. 编写发布代码
using System;
using System.Text;
using System.Threading.Tasks;
using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Extensions.ManagedClient;

class Program
{
    static async Task Main(string[] args)
    {
        var options = new MqttClientOptionsBuilder()
            .WithTcpServer("localhost", 1883)
            .WithCredentials("root", "root")
            .Build();

        var factory = new MqttFactory();
        var mqttClient = factory.CreateMqttClient();

        var managedMqttClient = new MqttFactory().CreateManagedMqttClient();
        await managedMqttClient.SubscribeAsync("testtopic");

        await mqttClient.ConnectAsync(options);
        bool bcontinue = true;
        while (bcontinue)
        {
            string input = $"{DateTime.Now.ToString("HH:mm:ss fff")}:{Guid.NewGuid().ToString()}";           
            Console.WriteLine(input);
            var message = new MqttApplicationMessageBuilder()
                .WithTopic("testtopic")
                .WithPayload(Encoding.UTF8.GetBytes(input))
                .WithQualityOfServiceLevel(MQTTnet.Protocol.MqttQualityOfServiceLevel.ExactlyOnce)
                .WithRetainFlag()
                .Build();

            await mqttClient.PublishAsync(message);
        }

        await managedMqttClient.StopAsync();
    }
}
  1. 调试运行
    在这里插入图片描述

5. 参考文档

  • MQTT - The Standard for IoT Messaging
  • Getting started
  • 在.NET7中使用MQTTnet简单实现MQTT通信 - 翔星 - 博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2050347.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无缝融入,即刻智能[二]:Dify-LLM平台(聊天智能助手、AI工作流)快速使用指南,42K+星标见证专属智能方案

无缝融入,即刻智能[二]:Dify-LLM平台(聊天智能助手、AI工作流)快速使用指南,42K+星标见证专属智能方案 1.快速创建应用 你可以通过 3 种方式在 Dify 的工作室内创建应用: 基于应用模板创建(新手推荐) 创建一个空白应用 通过 DSL 文件(本地 / 在线)创建应用 从模板创建…

六级英语翻译

大纲解读 1. 考查方式&#xff1a;段落汉译英。 2. 涉及主题&#xff1a;中国的历史、文化、经济、社会发展等。 3. 篇幅&#xff1a;六级为180-200个汉字。 4. *卷面分&#xff1a;106.5 / 710。 5. *考试时长&#xff1a;30分钟。 第一步&#xff1a;Extracting&…

Nvidia AI 发布 Llama-Minitron 3.1 4B:通过修剪和提炼 Llama 3.1 8B 构建的新语言模型

Nvidia 刚刚发布了语言模型的新版本&#xff0c;不过这次是一个小型语言模型&#xff1a;Llama-3.1-Minitron 4B 模型。这意味着它是语言模型不断发展的重要步骤之一&#xff0c;通过剪枝和知识提炼等尖端技术&#xff0c;将大型模型的效率与小型模型相结合。 Llama-3.1-Minitr…

Qt动画效果、动画曲线

Qt动画效果 QPropertyAnimation *animation new QPropertyAnimation(labelWin, "geometry",this); // 创建胜利标签动画animation->setStartValue(labelWin->geometry()); // 设置动画的起始位置animation->setEndValue(QRect(labelWin->x(), labelW…

Servbay 1.40版支持MySQL了,快升级吧。

全新的服务管理界面及MySQL支持 现在&#xff0c;你可以在ServBay中使用MySQL了。除了带来全新的服务管理界面外&#xff0c;我们还为你带来了MySQL5.1-MySQL9.0的所有版本&#xff0c;满足你对数据管理的一切需求。 全新的数据库管理功能 通过新的数据库管理功能&#xff0c…

Datawhale AI 夏令营 第四期 AIGC Task3

活动简介 活动链接&#xff1a;Datawhale AI 夏令营&#xff08;第四期&#xff09; 以及AIGC里面的本次任务说明&#xff1a;Task 3 进阶上分-实战优化 这次任务呢&#xff0c;主要是对知识的一个讲解&#xff0c;包括ComfyUI工具的使用啊&#xff0c;以及LoRA的原理啊&…

机器学习课程学习周报八

机器学习课程学习周报八 文章目录 机器学习课程学习周报八摘要Abstract一、机器学习部分1.1 self-attention的计算量1.2 人类理解代替自注意力计算1.2.1 Local Attention/Truncated Attention1.2.2 Stride Attention1.2.3 Global Attention1.2.4 聚类Query和Key 1.3 自动选择自…

使用哪种方式可以将 MATLAB 算法转换到FPGA中运行?

FPGA在进行相关算法计算时&#xff0c;一般都会使用高级语言进行算法验证&#xff0c;目前比较常见的就是 MATLAB &#xff0c;那么使用哪种方式可以将MATLAB中实现的算哒转换到FPGA中&#xff1f; 目前可以通过多种方式在 FPGA 中实现算法。 Simulink HDL Coder MathWorks 提供…

Keepalived学习

环境准备&#xff1a;两台服务器&#xff0c;两台客户机&#xff0c;关闭火墙和selinux 在两台主机上安装ka yum install keepalived -y 开启软件 keepalived配置 进入文件 vim /etc/keepalived/keepalived.conf 修改配置 配置slave 效果 在另一台路由配置 抢占模式和非…

UE基础 —— 项目设置

目录 访问项目设置 类别和分段 Project Game Engine Editor Platforms Plugins 通过 项目设置&#xff08;Project Settings&#xff09;&#xff0c;可以配置影响以下内容&#xff1a; 虚幻引擎项目&#xff1b;引擎在运行项目时的行为&#xff1b;项目如何在特定平台…

JavaEE 第13节 synchronized关键字基本实现原理

目录 synchronized的基本特点&#xff1a; synchronized关键字的底层实现&#xff1a; 1&#xff09;锁升级 2&#xff09;锁消除 3&#xff09;锁粗化 synchronized的基本特点&#xff1a; 以下特点只考虑&#xff08;jdk1.8&#xff09;&#xff1a; 1&#xff09;刚开始…

高可用集群keep-alive

keepalive简介 keepalive为LVS应用延伸的高可用服务。lvs的调度器无法做高可用。但keepalive不是为lvs专门集群服务的&#xff0c;也可以为其他的的代理服务器做高可用。 keepalive在lvs的高可用集群&#xff0c;主调度器和备调度器(可以有多个) 一主两备或一主一备。 VRRP: k…

Windows下枚举USB设备信息Demo

目录 1 简介 1.1 设备接口类 1.2 枚举设备信息原理 2 SetupDi系列函数介绍 2.1 SetupDiGetClassDevs 2.2 SetupDiEnumDeviceInfo 2.3 SetupDiGetDeviceRegistryProperty 2.4 SetupDiGetDeviceRegistryProperty 3 演示Demo 3.1 开发环境 3.2 功能介绍 3.3 下载地址 …

70 爬楼梯

解题思路一&#xff1a;&#xff08;动态规划&#xff09; \qquad 假设F(n)返回的是爬n阶的所有方法个数&#xff0c;由题可知&#xff0c;每次可以爬1-2级台阶&#xff0c;那么可以得到&#xff1a; \qquad \qquad \qquad \qquad \qquad F(n) F(n - 1) F(n - 2) \qquad 我…

WeTab AI桌面端的下载安装

wetab AI的使用很方便&#xff0c;收费也不高&#xff0c;专业版的最新版本的AI核心配置如下&#xff1a; 现在推出了桌面端&#xff0c;下载链接&#xff1a;桌面端下载链接 在下载页面点击windows&#xff08;Beta版&#xff09;&#xff1a; 下载并安装&#xff0c;桌面上就…

DRF组件讲解

DRF组件 1. Web应用模式 在开发Web应用中&#xff0c;有两种应用模式&#xff1a; 前后端不分离[客户端看到的内容和所有界面效果都是由服务端提供出来的。 前后端分离【把前端的界面效果(html&#xff0c;css&#xff0c;js分离到另一个服务端&#xff0c;python服务端只需…

LLM agentic模式之工具使用: Toolformer、CoA、MM-React思路

Toolformer Toolformer出自2023年2月Meta上传的论文《Toolformer: Language Models Can Teach Themselves to Use Tools》&#xff0c;它提出了一种通过自监督训练的方式来让模型决定调哪个API什么时候调用。 API调用的表示&#xff1a;为了让模型去能够调用API&#xff0c;将…

实现随机地牢与摄像机追随与拖拽

//author bilibili 民用级脑的研发记录 // 开发环境 小熊猫c 2.25.1 raylib 版本 4.5 // 2024-7-14 // AABB 碰撞检测 在拖拽&#xff0c;绘制&#xff0c;放大缩小中 // 2024-7-20 // 直线改每帧打印一个点&#xff0c;生长的直线&#xff0c;直线炮弹 // 2024-8-4 // 实现敌…

JavaScript高级程序设计 -- -- 观后记录

一、什么是 JavaScript 1、JavaScript 实现 完整的 JavaScript 实现包含以下几个部分&#xff1a; -- --  核心&#xff08;ECMAScript&#xff09;  文档对象模型&#xff08;DOM&#xff09;  浏览器对象模型&#xff08;BOM&#xff09; 2、DOM 文档对象模型&#…

橙色简洁大气体育直播自适应模板赛事直播门户自适应网站源码

源码名称&#xff1a;酷黑简洁大气体育直播自适应模板赛事直播门户网站 源码开发环境&#xff1a;帝国cms 7.5 安装环境&#xff1a;phpmysql 带采集&#xff0c;可以挂着电脑上自动采集发布&#xff0c;无需人工操作&#xff01; 橙色简洁大气体育直播自适应模板赛事直播门户…