首页 > 编程语言 >C# mqtt

C# mqtt

时间:2023-10-07 16:01:08浏览次数:34  
标签:Console C# await MQTT MQTTnet mqtt WriteLine ###

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,常用于物联网设备之间的通信。在C#中,我们可以使用MQTT库来实现与其他物联网设备之间的通信,本文将介绍如何使用C#中的MQTT库进行通信。

一、安装MQTT库

C#中有多个MQTT库可供选择,例如M2Mqtt、MQTTnet等,本文以MQTTnet为例进行讲解。在Visual Studio中,可以使用NuGet包管理器安装MQTTnet库,或者通过命令行安装,具体如下:

使用NuGet包管理器安装:在Visual Studio中,右键单击项目,选择“管理NuGet程序包”,在搜索框中搜索MQTTnet,选择MQTTnet库进行安装。

使用命令行安装:在Visual Studio中,打开“工具”菜单,选择“NuGet包管理器”,选择“程序包管理器控制台”,在控制台中输入以下命令进行安装:

Install-Package MQTTnet

安装完成后,就可以在项目中使用MQTTnet库了。

二、连接MQTT服务器

在使用MQTT进行通信之前,需要先连接MQTT服务器。连接MQTT服务器需要指定MQTT服务器的地址、端口、客户端ID等信息。下面是一个示例代码,展示如何连接MQTT服务器:

using MQTTnet;
using MQTTnet.Client;
using MQTTnet.Client.Options;

var factory = new MqttFactory();
var client = factory.CreateMqttClient();
var options = new MqttClientOptionsBuilder()
.WithTcpServer("localhost", 1883)
.WithClientId("client1")
.Build();

await client.ConnectAsync(options);
在上面的代码中,我们创建了一个MQTT客户端,并指定了MQTT服务器的地址和端口。其中,WithTcpServer方法指定了MQTT服务器的地址和端口,WithClientId方法指定了客户端ID。最后,使用await client.ConnectAsync(options)方法连接MQTT服务器。

三、发布MQTT消息

连接到MQTT服务器后,就可以开始发布消息了。使用MQTTnet库可以轻松地发布MQTT消息。下面是一个示例代码,展示如何发布MQTT消息:

var message = new MqttApplicationMessageBuilder()
.WithTopic("topic1")
.WithPayload("Hello MQTT")
.WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtMostOnce)
.WithRetainFlag(false)
.Build();

await client.PublishAsync(message);
在上面的代码中,我们创建了一个MQTT消息,指定了消息的主题、负载、服务质量等信息,并使用await client.PublishAsync(message)方法发布消息。

四、订阅MQTT消息

订阅MQTT消息可以接收其他物联网设备发布的消息。使用MQTTnet库可以轻松地订阅MQTT消息。下面是一个示例代码,展示如何订阅MQTT消息:

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

mqttClient.UseConnectedHandler(async e =>
{
Console.WriteLine("### CONNECTED WITH SERVER ###");

// Subscribe to a topic
await mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("my/topic").Build());

Console.WriteLine("### SUBSCRIBED ###");
});

mqttClient.UseDisconnectedHandler(async e =>
{
Console.WriteLine("### DISCONNECTED FROM SERVER ###");
await Task.Delay(TimeSpan.FromSeconds(5));

try
{
await mqttClient.ConnectAsync(options.Build(), CancellationToken.None);
}
catch
{
Console.WriteLine("### RECONNECTING FAILED ###");
}
});

mqttClient.UseApplicationMessageReceivedHandler(e =>
{
Console.WriteLine("### RECEIVED APPLICATION MESSAGE ###");
Console.WriteLine($"+ Topic = {e.ApplicationMessage.Topic}");
Console.WriteLine($"+ Payload = {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
Console.WriteLine($"+ QoS = {e.ApplicationMessage.QualityOfServiceLevel}");
Console.WriteLine($"+ Retain = {e.ApplicationMessage.Retain}");
});

await mqttClient.ConnectAsync(options.Build(), CancellationToken.None);
在这个示例代码中,我们使用了UseConnectedHandler和UseDisconnectedHandler方法来处理连接成功和连接断开事件。在连接成功后,我们使用SubscribeAsync方法来订阅一个主题,并在控制台上输出一条订阅成功的信息。在消息处理方面,我们使用了UseApplicationMessageReceivedHandler方法来处理收到的消息,其中包括消息的主题、负载、QoS等信息。

以上就是如何使用MQTTnet库在C#中与其他物联网设备进行通信的方法,包括连接MQTT服务器、发布消息和订阅消息。使用MQTT协议可以轻松地实现物联网设备之间的通信,从而构建一个可靠的物联网系统。
————————————————
版权声明:本文为CSDN博主「polsnet」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/polsnet/article/details/130302374

标签:Console,C#,await,MQTT,MQTTnet,mqtt,WriteLine,###
From: https://www.cnblogs.com/hphsh/p/17746531.html

相关文章

  • RedisStack部署/持久化/安全/与C#项目集成
    前言Redis可好用了,速度快,支持的数据类型又多,最主要的是现在可以用来向量搜索了。本文记录一下官方提供的redis-stack部署和配置过程。关于redis-stackredis-stackinstallsaRedisserverwithadditionaldatabasecapabilitiesandtheRedisInsight.redis提供了俩......
  • vscode设置文件忽略
    转到顶部菜单中的"文件"(File)>"首选项"(Preferences)>"设置"(Settings)或者您可以使用快捷键Ctrl+,或Cmd+,打开设置。在设置页面中,搜索框内输入"files.exclude" 在这里添加即可 ......
  • Netflix之Actuator
    一、Actuator简介监控应用,上报状态信息二、开启监控<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>三、端点SpringBoot2.0的Actuator默认只暴露了health和info端点1、......
  • 【常用操作】CentOS系统配置远程桌面
    一、前言当前系统使用最小化安装方式,因使用需求变更,需要使用图形化界面操作,此处介绍如何安装图形化界面,并配置远程桌面二、安装部署1、安装图形化界面安装Gnome包yumgroupinstall"GNOMEDesktop""GraphicalAdministrationTools"-y更新系统运行级别ln-sf/lib/sy......
  • 带宽优化新思路:RoCE网卡聚合实现X2增长
    本文分享自华为云社区《2个RoCE网卡Bond聚合,实现带宽X2》,作者:tsjsdbd。我们知道操作系统里面,可以将2个实际的物理网卡,合体形成一个“逻辑网卡”,从而达到如主备/提升带宽等目的。但是RoCE网卡,是否也跟普通网卡一样,支持Bond能力呢?答案是的,RoCE也可以组Bond,只是比普通网卡多了一些......
  • Go - Composing Structs from Other Structs
    Problem: Youwantastructthathasdataandmethodsofanotherstruct. Solution: Embedanunnamedstructwithinanotherstruct.Theouterstructwillgainthedataandmethodsoftheinnerstruct. Inheritanceisnottheonlymechanismyoucanusefor......
  • TALL: Temporal Activity Localization via Language Query
    1introduction确定任务:TALL(TemporalActivityLocalizationviaLanguage):基于文本的时间活动定位,具体来说就是给定给定一个未修剪的视频和一个自然语言查询,目标是确定视频中所描述活动的开始和结束时间。将视觉和文本特征嵌入到公共空间以获得更好效果,但是这样对齐任务(alignme......
  • vue3中defineComponent 的作用详解
    转自:https://www.jb51.net/article/263096.htm 这篇文章主要介绍了vue3中defineComponent 的作用,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下 vue3中,新增了defineComponent,它并没有实现任何的逻辑,只是把接收的......
  • c#动态执行字符串脚本(优化版)
    像javascript中有eval()来执行动态代码,c#中是没有的,于是自己动手丰衣足食,先来代码1usingSystem;2usingSystem.Data;3usingSystem.Configuration;4usingSystem.Text;5usingSystem.CodeDom.Compiler;6usingMicrosoft.CSharp;7usingSystem.Re......
  • idea报错:Failed to execute goal org.codehaus.mojo:exec-maven-plugin:3.0.0:exec (d
    idea版本:​​2020.3​​idea报错:在查阅了资料以后发现是​​IDEA2020​​的兼容问题 Failedtoexecutegoalorg.codehaus.mojo:exec-maven-plugin:3.0.0:exec(default-cli)onprojectsms:Commandexecutionfailed.解决方法:1、测试不要用​​main​​方法测试,使用​​......