首页 > 其他分享 >浅谈MQTT协议

浅谈MQTT协议

时间:2024-08-19 08:55:17浏览次数:16  
标签:协议 浅谈 mqttClient M2Mqtt MQTT 消息 using 客户端

一、基本介绍

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种轻量级的消息传输协议,设计用于连接一些使用TCP/IP协议的设备。它被广泛用于物联网(IoT)中,因为其低带宽、低延迟、高可靠性的特点,非常适合于远程设备和移动设备之间的通信。

二、关键特性

  1. 轻量级:MQTT 协议的设计非常简洁,消息头部最小只有2字节,这使得它在带宽受限的环境中表现良好。

  2. 发布/订阅模型:MQTT 使用发布/订阅模式,消息发布者(发布者)不会将消息直接发送给特定的接收者(订阅者),而是发布到一个主题(Topic),订阅了该主题的客户端将收到消息。

  3. 多种QoS级别

    • QoS 0:最多一次传输,消息可能丢失,但不保证送达。
    • QoS 1:至少一次传输,确保消息至少送达一次。
    • QoS 2:只有一次传输,确保消息只送达一次。
  4. 持久化消息:客户端可以设置消息为持久化,这样即使客户端断开连接,消息也会被代理(Broker)保存,并在客户端重新连接时发送给它。

  5. 遗嘱消息:客户端可以设置遗嘱消息,当客户端意外断开连接时,Broker会将遗嘱消息发送给订阅了遗嘱主题的客户端。

  6. 保持连接:客户端可以设置保持连接的消息,即使没有数据传输,Broker也会定期发送消息以维持连接。

  7. 安全性:MQTT 支持多种安全机制,包括TLS/SSL加密传输、客户端认证等。

  8. 可扩展性:MQTT 可以很容易地扩展到成千上万的客户端,适用于大规模的分布式系统。

  9. 跨平台:MQTT 可以在多种操作系统和硬件平台上运行,包括嵌入式系统。

三、用法示例

安装 M2Mqtt 库

首先,你需要通过 NuGet 包管理器安装 M2Mqtt 库。你可以在 Visual Studio 中使用 NuGet 包管理器控制台执行以下命令:

Install-Package M2Mqtt

编写 MQTT 客户端代码

以下是一个简单的 MQTT 客户端示例,展示了如何连接到 MQTT 代理(Broker),订阅主题,并发布消息:

using System;
using M2Mqtt;
using M2Mqtt.Exceptions;
using M2Mqtt.Interfaces;
using M2Mqtt.Net;

class Program
{
    static async System.Threading.Tasks.Task Main(string[] args)
    {
        // MQTT 代理服务器地址和端口
        string broker = "broker.hivemq.com";
        int port = 1883;

        // 创建 MQTT 客户端
        using (var factory = new MqttFactory())
        using (var mqttClient = factory.CreateMqttClient())
        {
            // 设置连接选项
            var options = new MqttClientOptionsBuilder()
                .WithTcpServer(broker)
                .WithPort(port)
                .Build();

            // 连接到 MQTT 代理
            await mqttClient.ConnectAsync(options);

            // 订阅主题
            await mqttClient.SubscribeAsync("my/test/topic", MqttQualityOfServiceLevel.AtLeastOnce);

            // 接收消息事件
            mqttClient.UseConnectedHandler(async e =>
            {
                Console.WriteLine("Connected to MQTT Broker.");

                // 发布消息
                await mqttClient.PublishAsync("my/test/topic", "Hello MQTT!", MqttQualityOfServiceLevel.AtLeastOnce);
            });

            mqttClient.UseDisconnectedHandler(e =>
            {
                Console.WriteLine("Disconnected from MQTT Broker.");
            });

            mqttClient.UseMessageReceivedHandler(e =>
            {
                Console.WriteLine($"Received message: {System.Text.Encoding.UTF8.GetString(e.Message.Payload)}");
            });

            // 等待退出
            Console.ReadLine();
        }
    }
}

这个示例程序首先连接到公共 MQTT 代理服务器 broker.hivemq.com,然后订阅了 "my/test/topic" 主题,并在连接成功后向该主题发布了一条消息。同时,它还设置了消息接收事件处理器,用于打印接收到的消息。

请注意,这个示例使用了异步编程模式,使用了 await 关键字来等待异步操作完成。此外,M2Mqtt 库提供了丰富的配置选项和事件处理器,你可以根据需要进行自定义配置。

在实际应用中,你可能需要根据自己的需求调整 MQTT 客户端的配置,比如设置客户端 ID、使用 TLS/SSL 加密连接、处理遗嘱消息等。

四、使用场景

MQTT 的使用场景非常广泛,包括智能家居、车载系统、工业自动化、智慧城市等。例如,在智能家居中,各种设备(如智能灯泡、温度传感器等)可以作为MQTT客户端,通过MQTT协议与中央控制系统通信,实现远程控制和数据收集。

标签:协议,浅谈,mqttClient,M2Mqtt,MQTT,消息,using,客户端
From: https://blog.csdn.net/a876106354/article/details/141310464

相关文章

  • 【TCP/IP】自定义应用层协议,常见端口号
    互联网中,主流的是TCP/IP五层协议5G/4G上网,是有自己的协议栈,要比TCP/IP更复杂(能够把TCP/IP的一部分内容给包含进去了)应用层可以代表我们所编写的应用程序,只要应用程序里面用到了网络通信,就可以认为这个代码就是属于应用层的代码日常开发中最常用到的一层:使用大佬......
  • 【TCP/IP】UDP协议数据格式和报文格式
    学习一个网络协议,主要就是学习“数据格式”/“报文格式”源端口/目的端口端口号是属于传输层的概念UDP报头使用两个自己的长度来表示端口号之所以端口号的范围是0~65535,是因为底层网络协议做出了强制要求如果使用一个10w这样的端口,就会在系统底层被“截断”UDP......
  • 【嵌入式linux开发】智能家居入门6:最新ONENET,物联网开放平台(QT、微信小程序、MQTT协议
    智能家居入门6:最新ONENET物联网开放平台前言最终现象一、ONENET云平台创建产品与设备二、使用MQTT客户端软件测试2.1测试前的准备2.2测试三、LInuxQT代码四、onenet云端API介绍及微信小程序代码4.1onenetAPI介绍4.2微信小程序代码五、板端运行前言ONENET云......
  • 串口通信协议(hal库)
    目录串口通信协议串行/并行同步/异步单工/半双工/全双工DR寄存器轮询方式中断方式主要中断事件:DMA方式USART模块的常用HAL库常用接口函数串口通信协议串口通信(SerialCommunication)指的是数据通过一个串行的通道进行传输,每次传输一位数据。常见的串口通信协议......
  • 浅谈哈希长度扩展攻击
    攻击原理:我们首先需要了解一下MessageAuthenticationcodes(MACs),称为消息验证码,一般用于服务器验证消息的真实性。服务器把密钥和消息连接起来,用摘要算法获取摘要,对于H(secret+data)此类构造的散列函数,在密钥长度****和数据已知的情况下,通常可以使用哈希长度扩展攻击。......
  • RabbitMQ集群 - 仲裁队列、Raft协议(最详细的选举流程)
    文章目录仲裁队列概述Raft协议概述基本概念选举流程(重点)消息复制仲裁队列的使用MQ管理平台SpringAMQP仲裁队列概述1)RabbitMQ普通队列在一个节点宕机之后,其他节点无法读写宕机节点的队列,为了解决这个问题,引入了仲裁队列.2)仲裁队列通过Raft协议,实现了不同......
  • UART串行通信协议
    UART串行通信协议UART(UniversalAsynchronousReceiver/Transmitter,通用异步接收器/发送器)是一种串行通信协议,用于异步通信,即发送和接收设备不需要共享一个时钟信号来同步数据传输。以下是UART的详细介绍:UART的基本特性异步通信:UART不使用时钟信号来同步数据,而是依赖于数据包......
  • ssrf 内网访问 伪协议 读取文件 端口扫描
    SSRF(Server-SideRequestForgery,服务器侧请求伪造)是一种利用服务器发起网络请求的能力来攻击内网资源或执行其他恶意活动的技术。SSRF可以用于访问通常不可由外部直接访问的内网资源,读取文件,甚至进行端口扫描。以下是关于SSRF在CTF中针对内网访问、伪协议读取文件和端口扫描的......
  • 【漫谈C语言和嵌入式004】深入理解RS232、RS422和RS485:嵌入式系统中的串行通信协议
            在嵌入式系统设计中,串行通信协议是设备间数据传输的重要方式。其中,RS232、RS422和RS485是三种常用的标准。这些协议不仅在工业控制、仪器仪表、网络通信等领域得到广泛应用,也在许多嵌入式系统项目中扮演着重要角色。在本文中,我们将深入探讨这三种串行通信标准......
  • USB 2.0 协议专栏之 USB 设备描述符(三)
    前言:本篇博客为手把手教学的USB2.0协议栈类精品博客,该专栏博客侧重针对USB2.0协议进行讲解。第3篇重点为USB2.0协议中的设备描述符 DeviceDescriptors进行讲解,并结合CH32V307与STM32代码进行分析。USB协议栈是嵌入式工程研发过程中很大的坑,USB协议栈非常冗......