看看如何使用 C# 代码让 MQTT 进行完美通信

简介: 看看如何使用 C# 代码让 MQTT 进行完美通信

前言

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

Step By Step 步骤

  1. 搭建一个 MQTT 服务器
  1. 创建一个 .Net Framework Console 项目,命名为 MQTTSample
  2. 添加 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

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

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

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

MQTTSample.exe publish

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

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

8.至此,说明此 “MQTT 通信” 程序的两个不同客户端成功利用 MQTT 服务器进行通信


相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
4月前
|
机器学习/深度学习 算法 定位技术
Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现裂缝的检测识别(C#代码UI界面版)
本项目基于YOLOv8模型与C#界面,结合Baumer工业相机,实现裂缝的高效检测识别。支持图像、视频及摄像头输入,具备高精度与实时性,适用于桥梁、路面、隧道等多种工业场景。
471 27
|
2月前
|
消息中间件 Ubuntu Java
SpringBoot整合MQTT实战:基于EMQX实现双向设备通信
本教程指导在Ubuntu上部署EMQX 5.9.0并集成Spring Boot实现MQTT双向通信,涵盖服务器搭建、客户端配置及生产实践,助您快速构建企业级物联网消息系统。
869 1
|
7月前
|
消息中间件 Java 数据库
RocketMQ实战—9.营销系统代码初版
本文主要介绍了实现营销系统四大促销场景的代码初版:全量用户推送促销活动、全量用户发放优惠券、特定用户推送领取优惠券消息、热门商品定时推送。
RocketMQ实战—9.营销系统代码初版
|
2月前
|
消息中间件 存储 Java
RabbitMQ 和 Spring Cloud Stream 实现异步通信
本文介绍了在微服务架构中,如何利用 RabbitMQ 作为消息代理,并结合 Spring Cloud Stream 实现高效的异步通信。内容涵盖异步通信的优势、RabbitMQ 的核心概念与特性、Spring Cloud Stream 的功能及其与 RabbitMQ 的集成方式。通过这种组合,开发者可以构建出具备高可用性、可扩展性和弹性的分布式系统,满足现代应用对快速响应和可靠消息传递的需求。
166 2
RabbitMQ 和 Spring Cloud Stream 实现异步通信
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
679 2
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
307 2
|
消息中间件 Kafka 数据安全/隐私保护
RabbitMQ异步通信详解
RabbitMQ异步通信详解
406 18
|
中间件 数据库连接 API
C#数据分表核心代码
C#数据分表核心代码
139 0
|
数据安全/隐私保护 C# UED
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
190 0