看看如何使用 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版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
2月前
|
缓存 C# Windows
C#程序如何编译成Native代码
【10月更文挑战第15天】在C#中,可以通过.NET Native和第三方工具(如Ngen.exe)将程序编译成Native代码,以提升性能和启动速度。.NET Native适用于UWP应用,而Ngen.exe则通过预编译托管程序集为本地机器代码来加速启动。不过,这些方法也可能增加编译时间和部署复杂度。
116 2
|
2月前
|
存储 消息中间件 安全
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
【10月更文挑战第9天】本文介绍了如何利用JUC组件实现Java服务与硬件通过MQTT的同步通信(RRPC)。通过模拟MQTT通信流程,使用`LinkedBlockingQueue`作为消息队列,详细讲解了消息发送、接收及响应的同步处理机制,包括任务超时处理和内存泄漏的预防措施。文中还提供了具体的类设计和方法实现,帮助理解同步通信的内部工作原理。
JUC组件实战:实现RRPC(Java与硬件通过MQTT的同步通信)
|
2月前
|
C#
C# 图形验证码实现登录校验代码
C# 图形验证码实现登录校验代码
84 2
|
3月前
|
消息中间件 Kafka 数据安全/隐私保护
RabbitMQ异步通信详解
RabbitMQ异步通信详解
96 16
|
2月前
|
中间件 数据库连接 API
C#数据分表核心代码
C#数据分表核心代码
41 0
|
4月前
|
数据安全/隐私保护 C# UED
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
53 0
|
4月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
106 0
|
4月前
|
前端开发 程序员 API
从后端到前端的无缝切换:一名C#程序员如何借助Blazor技术实现全栈开发的梦想——深入解析Blazor框架下的Web应用构建之旅,附带实战代码示例与项目配置技巧揭露
【8月更文挑战第31天】本文通过详细步骤和代码示例,介绍了如何利用 Blazor 构建全栈 Web 应用。从创建新的 Blazor WebAssembly 项目开始,逐步演示了前后端分离的服务架构设计,包括 REST API 的设置及 Blazor 组件的数据展示。通过整合前后端逻辑,C# 开发者能够在统一环境中实现高效且一致的全栈开发。Blazor 的引入不仅简化了 Web 应用开发流程,还为习惯于后端开发的程序员提供了进入前端世界的桥梁。
390 0
|
4月前
|
消息中间件 开发工具
【Azure Event Hub】原生应用中使用RabbitMQ,是否可以不改动代码的情况下直接转换为使用Event Hub呢?
【Azure Event Hub】原生应用中使用RabbitMQ,是否可以不改动代码的情况下直接转换为使用Event Hub呢?
|
4月前
|
物联网 网络性能优化 Python
"掌握MQTT协议,开启物联网通信新篇章——揭秘轻量级消息传输背后的力量!"
【8月更文挑战第21天】MQTT是一种轻量级的消息传输协议,以其低功耗、低带宽的特点在物联网和移动应用领域广泛应用。基于发布/订阅模型,MQTT支持三种服务质量级别,非常适合受限网络环境。本文详细阐述了MQTT的工作原理及特点,并提供了使用Python `paho-mqtt`库实现的发布与订阅示例代码,帮助读者快速掌握MQTT的应用技巧。
91 0