首页 > 编程语言 >C#通过MQTT与其他物联网设备通信

C#通过MQTT与其他物联网设备通信

时间:2023-10-10 14:15:30浏览次数:40  
标签:Console C# await 联网 MQTTnet MQTT WriteLine ###

转自:https://blog.csdn.net/polsnet/article/details/130302374

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服务器:

 1 using MQTTnet;
 2 using MQTTnet.Client;
 3 using MQTTnet.Client.Options;
 4  
 5 var factory = new MqttFactory();
 6 var client = factory.CreateMqttClient();
 7 var options = new MqttClientOptionsBuilder()
 8     .WithTcpServer("localhost", 1883)
 9     .WithClientId("client1")
10     .Build();
11  
12 await client.ConnectAsync(options);

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

三、发布MQTT消息

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

1 var message = new MqttApplicationMessageBuilder()
2     .WithTopic("topic1")
3     .WithPayload("Hello MQTT")
4     .WithQualityOfServiceLevel(MqttQualityOfServiceLevel.AtMostOnce)
5     .WithRetainFlag(false)
6     .Build();
7  
8 await client.PublishAsync(message);

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

四、订阅MQTT消息

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

 1 var mqttClient = new MqttFactory().CreateMqttClient();
 2  
 3 mqttClient.UseConnectedHandler(async e =>
 4 {
 5     Console.WriteLine("### CONNECTED WITH SERVER ###");
 6  
 7     // Subscribe to a topic
 8     await mqttClient.SubscribeAsync(new TopicFilterBuilder().WithTopic("my/topic").Build());
 9  
10     Console.WriteLine("### SUBSCRIBED ###");
11 });
12  
13 mqttClient.UseDisconnectedHandler(async e =>
14 {
15     Console.WriteLine("### DISCONNECTED FROM SERVER ###");
16     await Task.Delay(TimeSpan.FromSeconds(5));
17  
18     try
19     {
20         await mqttClient.ConnectAsync(options.Build(), CancellationToken.None);
21     }
22     catch
23     {
24         Console.WriteLine("### RECONNECTING FAILED ###");
25     }
26 });
27  
28 mqttClient.UseApplicationMessageReceivedHandler(e =>
29 {
30     Console.WriteLine("### RECEIVED APPLICATION MESSAGE ###");
31     Console.WriteLine($"+ Topic = {e.ApplicationMessage.Topic}");
32     Console.WriteLine($"+ Payload = {Encoding.UTF8.GetString(e.ApplicationMessage.Payload)}");
33     Console.WriteLine($"+ QoS = {e.ApplicationMessage.QualityOfServiceLevel}");
34     Console.WriteLine($"+ Retain = {e.ApplicationMessage.Retain}");
35 });
36  
37 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,联网,MQTTnet,MQTT,WriteLine,###
From: https://www.cnblogs.com/gzy2016Blog/p/17754506.html

相关文章

  • Jenkins 配置MAC节点,编译iOS项目
     文章主要介绍Jenkins主从节点配置,mac机配置slave节点。从机已经搭建android和ios编译环境为例,介绍Jenkins节点配置。环境介绍主机环境介绍:主机Jenkins运行在tomcat中。Jenkins本身安装的环境仅包括java环境和gradle环境。#setjavaenvironmentexportJAVA_HOME=/usr......
  • Math、System、Runtime //BigDecimal、Date、SimpleDaateFormat、Calendar
    1、Math =======================================================================================BigDecimal 1、构造器publicBigDecimal(Stringval)publicclassBigDecimalDemo01{publicstaticvoidmain(String[]args){//目标:掌握BigDecimal的......
  • 线程安装-synchronized关键字
         ......
  • C++ libwebsockets搭建WebSocket服务端及Http客户端、服务端
    https://blog.csdn.net/fantasysolo/article/details/88908948  概念WebRTCWebRTC,名称源自网页即时通信(英语:WebReal-TimeCommunication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API。它于2011年6月1日开源并在Google、Mozilla、Opera支持下被纳入万维网联......
  • BOSHIDA DC电源模块电容滤波器的原理及构成
    BOSHIDADC电源模块电容滤波器的原理及构成DC电源模块电容滤波器是电源输出端的重要组成部分,其主要作用是滤除由电源输出的直流电压中所含的杂波和噪声,并将其平滑处理为一个稳定的直流电压输出。在电子设备的数字、模拟电路、电机驱动等方面,稳定的电源输出对于保证设备的正常运行......
  • rpc项目中的长连接与短连接的思考
    对于rpc项目,在接受大佬指导的时候曾问过对于长连接和短连接是处理处理的,在面试的时候也被问起socket是长连接还是短连接,发现自己没有好好思考过这个问题,因此好好总结一下。前置知识点:rpc基础,tcp基础rpc项目中的长连接与短连接的思考什么是rpc项目中的长连接和短连接类似于ht......
  • typescript: Flyweight Pattern
     /***FlyweightPattern享元是一种结构型设计模式,它允许你在消耗少量内存的情况下支持大量对象。*https://refactoringguru.cn/design-patterns/flyweight/typescript/example#lang-features*TheFlyweightstoresacommonportionofthestate(alsocalledintr......
  • 【ABC320C】题解
    AtCoderBeginnerContest320ProblemC-SlotStrategy2(Easy)题解题目简述给定\(3\)个长度为\(m\)的转盘,转动过后三个转盘分别可以在不同的时间停下,求停下时所有转盘都显示相同数字的最小时间。思路由于这题\(m\le100\),数据较水,所以可以先把每个数列都复制\(......
  • 【ABC320D】题解
    AtCoderBeginnerContest320ProblemD-RelativePosition题解题目保证不矛盾,就可以直接vector建图,然后dfs一遍,边权为\((w_x,w_y)\)表示坐标的差,从\(u=1\)开始搜索,设点\(u,v\)有一条无向边,\(v_x=u_x+w_x,v_y=u_y+w_y\),最后如果没有被标记过的话(也就是没有......
  • ResourceManager处理作业提交请求
    1.背景之前写过Yarn状态机的两篇文章。https://blog.51cto.com/u_15327484/4940200介绍了AsyncDispatcher线程,它提供以下机制:通过调用它的register()方法注册不同类型事件对应的处理器,放入Map中。通过调用它的handle()方法将具体的事件放入到事件队列BlockingQueue中。内部e......