C# 完美实现物联网 MQTT 数据通信

这篇具有很好参考价值的文章主要介绍了C# 完美实现物联网 MQTT 数据通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

C# 完美实现物联网 MQTT 数据通信

前言

MQTT 协议由于其用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务,具有开销低、占用带宽低、即时通讯等优点,使其在物联网、小型设备、移动应用等方面有较广泛的应用,在工业物联网中,MQTT也有广泛的应用。

Step By Step 步骤

  1. 搭建一个 MQTT 服务器

    • 见本人其它文章《手把手教你在 Windows 环境中搭建 MQTT 服务器》
  2. 创建一个 .Net Framework Console 项目,命名为 MQTTSample

  3. 添加 NuGet 包

    <package id="MQTTnet" version="4.3.1.873" targetFramework="net48" />
    <package id="MQTTnet.Extensions.WebSocket4Net" version="4.3.1.873" targetFramework="net48" />
    

    注:在添加这两个包时,会自动添加其它依赖包

  4. 在 Program.cs 编写 MQTT 通信(重点看注释

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using MQTTnet;
    using MQTTnet.Client;
    using MQTTnet.Packets;
    using MQTTnet.Protocol;
    using System.Security.Authentication;
    using MQTTnet.Formatter;
    using MQTTnet.Extensions.WebSocket4Net;
    using System.Threading;
    
    namespace MQTTSample
    {
    	internal class Program
    	{
    		static async Task Main(string[] args)
    		{
    			// 设计两个参数,是为了可以打开两个 CMD 客户端进行测试
    			if (args[0] == "publish")
    			{
    				Console.WriteLine("Publish message...");
    				await PublishMessage();
    			}
    			else
    			{
    				Console.WriteLine("Receive message...");
    				await SubscribeTopic();
    			}   
    		}
    
    		// 循环不断地发布消息
    		private static async Task PublishMessage()
    		{
    			var i = 0;
    			while (i <= 1000)
    			{
    				var mqttFactory = new MqttFactory();
    
    				using (var mqttClient = mqttFactory.CreateMqttClient())
    				{
    					// 1. 连接 MQTT 服务器
    					var mqttClientOptions = new MqttClientOptionsBuilder()
    						.WithTcpServer("192.168.3.233", 1883) 	// MQTT 服务器IP+端口
    						.WithClientId("publish_client") 		// 客户端名称
    						//.WithProtocolVersion(MqttProtocolVersion.V500)
    						//.WithCleanSession()
    						.Build();
    
    					var response = await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None);
    
    					Console.WriteLine($"The MQTT client is connected. IsConnected: [{mqttClient.IsConnected}]");
    					Console.WriteLine(response.ResultCode);
    
    					// 2. 发布消息
    					// 2.1 在名为 topic2 的主题上发布消息 this is a test message
    					var applicationMessage = new MqttApplicationMessageBuilder()
    						.WithTopic("topic2")
    						.WithPayload("this is a test message")
    						.Build();
    
    					// 2.2 异步发布消息
    					await mqttClient.PublishAsync(applicationMessage, CancellationToken.None);
    
    					// 3. 断开连接
    					await mqttClient.DisconnectAsync();
    
    					Console.WriteLine("MQTT application message is published.");
    				}
    
    				i++;
    				Thread.Sleep(1000);
    			}
    		}
    
    		// 订阅消息
    		// 订阅一次就可以,不需要循环
    		// 当订阅的主题有发布消息时,这个程序就可以接收到
    		private static async Task SubscribeTopic()
    		{
    			var mqttFactory = new MqttFactory();
    
    			using (var mqttClient = mqttFactory.CreateMqttClient())
    			{
    				// 1. 设置连接 MQTT 服务器的属性
    				var mqttClientOptions = new MqttClientOptionsBuilder()
    					.WithTcpServer("192.168.3.233", 1883)
    					.WithClientId("subscribe_client")
    					//.WithCleanSession()
    					.Build();
    
    				// 2. 定义一个事件,当订阅的主题有发布消息时,接收并打印消息
    				// 2.1 这段代码必须写在连接 MQTT 服务器的代码之前,才能确保可以接收到消息
    				mqttClient.ApplicationMessageReceivedAsync += e =>
    				{
    					Console.WriteLine("Received application message.");
    					Console.WriteLine(e.ApplicationMessage.Topic);
    					Console.WriteLine(Encoding.UTF8.GetString(e.ApplicationMessage.Payload));
    					Console.WriteLine("===================");
    
    					return Task.CompletedTask;
    				};
    				
    				// 3. 连接 MQTT 服务器
    				await mqttClient.ConnectAsync(mqttClientOptions, CancellationToken.None);
    
    
    				// 4. 订阅名为 topic2 的主题的消息
    				var mqttSubscribeOptions = mqttFactory.CreateSubscribeOptionsBuilder()
    				.WithTopicFilter(
    					f =>
    					{
    						f.WithTopic("topic2")       
    						 .WithExactlyOnceQoS();		//即精准一次
    					})
    				.Build();
    
    				await mqttClient.SubscribeAsync(mqttSubscribeOptions, CancellationToken.None);
    
    				Console.WriteLine("MQTT client subscribed to topic.");
    
    				// 5. 离开时才断开连接 
    				Console.WriteLine("Press enter to exit.");
    				Console.ReadLine();
    			}
    
    		}
    	}
    }
    
  5. 编译并运行测试

    1. 打开一个 CMD 命令窗口,姑且称为 CMD1,定位到 MQTTSample.exe 所有目录,如

      cd D:\MQTTSample\MQTTSample\bin\Debug
      
    2. 运行以下命令,运行 MQTT 接收订阅消息客户端

      MQTTSample.exe subscribe
      

      注:这个时候,还没有运行 MQTT 发布消息客户端MQTT 接收订阅消息客户端 还没有显示接收的消息

    3. 重新打开一个 CMD 命令窗口,姑且称为 CMD2,定位到 MQTTSample.exe 所有目录

    4. 运行以下命令,运行 MQTT 发布消息客户端

      MQTTSample.exe publish
      

      注:此时,按照程序设定,MQTT 发布消息客户端 每隔 1 秒不断发布消息:this is a test message

    5. 此时,CMD1 窗口的 MQTT 接收订阅消息客户端 也会不停地显示其接收的消息:this is a test message

    6. 至此,说明此 "MQTT 通信" 程序的两个不同客户端成功利用 MQTT 服务器进行通信文章来源地址https://www.toymoban.com/news/detail-781290.html

到了这里,关于C# 完美实现物联网 MQTT 数据通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 适合于物联网通信的数据加密AES算法

            AES加密算法全称是Advanced Encryption Standard(高级加密标准),是最为常见的对称加密算法之一。AES支持三种长度的密钥:128位、192位、256位。         在物联网通信应用中通常传输的是十六进制的数据,需要考虑数据的加密问题。         AES数据加密算法可

    2024年01月22日
    浏览(57)
  • Unity串口通信、接受和发送数据、C#

    串行接口(串口)通常指COM接口,是采用串行通信方式的扩展接口。串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。特别适用于远距离通信。 查看串口:右键 我的电脑-管理-设备管理器

    2023年04月13日
    浏览(55)
  • ESP8266-01s入门:上报和下发数据控制单片机 AT指令讲解和上云 烧录AT固件与OneNET MQTT通信教程包含MQTT.fx1.7.1教程(微信小程序通信单片机前置任务)

    本项目教程总共分为四节 1.创建OneNET新版MQTT设备:为微信小程序与单片机通信打基础(微信小程序通信单片机前置任务) 2.(当前文章)ESP8266-01s入门:烧录AT固件与OneNET MQTT通信教程包含MQTT.fx1.7.1教程(微信小程序通信单片机前置任务) 3.物联网实践教程:微信小程序结合

    2024年02月04日
    浏览(57)
  • 【OpenCV】OpenCV (C++) 与 OpenCvSharp (C#) 之间数据通信

      OpenCV是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的

    2024年03月27日
    浏览(44)
  • C#串口通信从入门到精通(26)——多个串口多个线程发送数据和接收数据

    我们在开发串口程序的过程中有时候会遇到多个串口,并且多个串口也需要在多个线程进行操作,本文就来讲解如何实现多个串口在多线程下的安全发送与接收。 我们首先使用虚拟串口助手虚拟COM1、COM2这一对串口;COM3、COM4这一对串口,然后使用代码操作COM1,然后打开一个

    2024年02月11日
    浏览(63)
  • C#串口通信从入门到精通(14)——多个串口接收数据

    我们在开发串口通信程序时,有时候会需要连接不止一个串口,这时候该怎么写程序呢?本文就来介绍多个串口数据的接收 我们在之前的专栏中介绍了串口数据的发送,当时有提到过,我们是通过创建一个SerialPort类的对象,然后利用这个对象来实现对串口的访问,那么以此

    2024年02月05日
    浏览(89)
  • 物联网通信协议-MQTT及使用python实现

    简述 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的\\\"轻量 级\\\"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作

    2024年02月10日
    浏览(48)
  • Java 使用 EMQX 实现物联网 MQTT 通信

    EMQX 实现物联网 MQTT 通信。物联网的 MQ 消息通信方式。 MQTT(Message Queuing Telemetry Transport, 消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的\\\"轻量级\\\"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,

    2024年02月03日
    浏览(39)
  • 搭建阿里云物联网平台实现MQTT通信

    1,点击进入阿里云官方网站:阿里云-上云就上阿里云 (aliyun.com) 2,注册登录并且进行实名认证; 如下图: 点击右上角 控制台,进入如图界面:  3,在阿里物联网云平台创建设备:   首先创建产品:大致过程如下(多图预警)    添加自定义功能:  发布上线后,就成为了

    2024年02月08日
    浏览(63)
  • OPC通信从入门到精通_1_OPC基础知识及简单C#程序编写(OPCDA,OPCUA简介;OPC通信数据流框架图;C#程序编写)

    OPC的诞生及历史 :软件进行开发时需要与各种不同的协议进行对接,例如Modbus协议等,当设备很多,协议很多的情况下,上位机与硬件的沟通就会变得很麻烦,所以就有了将这些协议抽象出一个标准接口,对于软件人员就无需和协议对接,只需要对接接口即可,因此OPC就诞生

    2024年02月15日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包