【MQTT】MQTT协议与指令下发;MQTT与Kafka比较

本文内容:

  • 一、MQTT协议
      • 1. 发布/订阅模型:
      • 2. 连接和会话:
      • 3. QoS级别(Quality of Service Levels):
      • 4. 保留消息:
      • 5. Last Will and Testament(遗嘱消息):
      • 6. 适用场景和优势:
      • 7. 消息格式:
      • 8. 安全性:
      • 9. 开源实现和协议版本:
  • 二、指令下发
    • 指令下发流程
  • 三、使用MQTT实现指令下发
    • 具体步骤
    • 代码案例
  • 四、MQTT 数据和数据库数据
  • 五、MQTT和Kafka比较
    • MQTT和Kafka主要区别
    • MQTT和Kafka适合的场景

相关文章:
(一)MQTT协议与指令下发;MQTT与Kafka比较
(二)用MQTT在Spring Boot项目中实现异步消息通信


一、MQTT协议

  • 详细讲讲MQTT协议

    当涉及到物联网设备通信时,MQTT(Message Queuing Telemetry Transport)是一种轻量级、开放、灵活的协议。MQTT最初是为低带宽、不稳定网络环境下的传感器和设备之间的通信而设计的,但现在已经广泛应用于各种应用领域。

    以下是关于MQTT协议的详细解释:

    1. 发布/订阅模型:

    • 发布者(Publisher): 负责将消息发布到特定的主题。
    • 订阅者(Subscriber): 订阅特定主题,以接收相关消息。
    • 主题(Topic): 是消息的分类标签,用于描述消息的内容。发布者发布消息到特定主题,而订阅者则订阅特定主题。

    2. 连接和会话:

    • MQTT使用基于TCP的连接,但也可以在WebSocket上运行。
    • 客户端和服务器之间建立长连接,可以维护一个持久的会话状态。
    • 客户端可以选择保持与服务器的连接状态,以接收实时消息。

    3. QoS级别(Quality of Service Levels):

    • QoS 0: 最多一次传递,消息可能会丢失,不保证传递。
    • QoS 1: 至少一次传递,消息被确认,但可能会重复。
    • QoS 2: 正好一次传递,确保消息只传递一次,但是通信开销较大。

    4. 保留消息:

    • 发布者可以设置消息为保留消息,这意味着新的订阅者在订阅相关主题时会收到最新的保留消息。

    5. Last Will and Testament(遗嘱消息):

    • 客户端可以设置遗嘱消息,以便在连接意外断开时通知其他订阅者。

    6. 适用场景和优势:

    • 适用于低带宽、高延迟、不稳定网络环境下的物联网设备通信。
    • 轻量级协议,减少通信开销。
    • 支持发布/订阅模型,允许灵活的通信架构。
    • 易于实现,有许多开源实现和库可用。

    7. 消息格式:

    • MQTT消息由固定头、可变头和消息体组成。
    • 固定头包含消息类型、标志位等信息。
    • 可变头包含不同类型消息的特定信息。
    • 消息体包含实际的消息内容。

    8. 安全性:

    • MQTT本身并没有提供加密功能,但可以在其上使用TLS/SSL进行加密。
    • 用户名和密码可以用于身份验证。

    9. 开源实现和协议版本:

    • Eclipse Mosquitto、HiveMQ、EMQ等是一些常见的MQTT服务器实现。
    • MQTT 3.1和MQTT 5.0是两个主要的协议版本,其中MQTT 5.0提供了更多的功能和改进。

    MQTT协议的灵活性和轻量级特性使其成为连接各种设备和应用程序的理想选择,尤其在物联网领域中。学习MQTT协议可以帮助设计和实施可靠的设备通信系统。

二、指令下发

指令下发通常指的是通过某种通信协议向远程设备发送命令或控制信息。这个过程通常是在分布式系统或物联网(IoT)中的设备管理中使用的。

指令下发是将控制指令从上级控制系统下发发送给下级执行系统以实现控制功能。

具体来说:

  • 指令下发的目的是向下级系统发布控制命令,如开关机、参数设置等。

  • 上级系统负责生成控制指令,下级系统负责接收并执行指令。

  • 指令通常以数字或字符形式表示,通过网络通信等方式从上至下传输。

  • 指令下发是一个控制链路的关键环节,实现上下级系统之间的命令传输与执行。

一些常见的指令下发场景:

  • SCADA系统向过程控制器下发控制参数配置指令。

  • MES系统向生产设备下发产品切换指令。

  • 车联网平台向交通指挥系统下发车辆调度指令。

  • 大数据中心向边缘计算集群下发任务下发指令。

  • APP下发控制指令驱动智能家电执行动作。

所以总体来说,指令下发是上下级控制系统之间实现控制功能的基础,通过它来传达和执行各种操作指令。

指令下发流程

下面是一个一般的指令下发流程:

  1. 指令生成
    • 在系统的控制中心或者上层应用中,某个用户或者自动化程序生成一个需要发送给设备的指令。这个指令可能是控制设备执行某个动作、改变状态、或者请求设备发送特定信息等。
  2. 指令封装
    • 生成的指令需要按照设备能理解的通信协议进行封装。这可能包括将指令转换为特定的数据格式、添加必要的协议头部信息等。
  3. 指令传输
    • 封装后的指令通过通信协议传输到目标设备。这可以通过不同的通信方式实现,例如MQTT、HTTP、CoAP等。在物联网中,MQTT是一个常用的协议,因为它轻量、灵活,适合在资源受限的设备上使用。
  4. 设备接收
    • 目标设备通过相应的通信协议接收到指令。设备需要能够理解协议并正确解析接收到的指令。
  5. 指令解析
    • 设备解析接收到的指令,理解其中的控制或操作内容。
  6. 执行指令
    • 设备执行指令对应的操作。这可能包括改变设备状态、执行某种动作、或者返回请求的信息。
  7. 响应生成
    • 设备生成执行结果的响应,这个响应也需要按照相应的协议进行封装。
  8. 响应传输
    • 设备将响应传输回控制中心或者上层应用。
  9. 响应解析
    • 控制中心或者应用解析接收到的响应,获取设备执行指令的结果。
  10. 处理结果
    • 控制中心或者应用处理设备执行指令的结果,可能会触发进一步的操作或者通知相关的系统。

在这个流程中,MQTT作为通信协议的一部分起到了很关键的作用。它提供了发布/订阅的模式,允许设备和系统之间实现松耦合的通信。在结合MQTT时,需要定义好指令的主题(Topic),确保设备和控制中心都订阅了正确的主题,以便指令的传递。

例如,在一个基于MQTT的系统中,可以按照以下步骤进行指令下发:

  1. 控制中心发布一个包含指令的消息到MQTT Broker,指定了设备的主题。
  2. 目标设备订阅了相应的主题,在接收到消息后解析并执行指令。
  3. 设备执行指令后,可以发布一个包含执行结果的消息到MQTT Broker,指定了相应的主题。
  4. 控制中心订阅了执行结果的主题,在接收到设备的响应消息后进行处理。

这样的设计使得设备和控制中心可以异步地进行通信,实现了灵活而可靠的远程控制。

三、使用MQTT实现指令下发

具体步骤

在使用MQTT进行指令下发时,通常需要考虑以下几个步骤:

  1. 定义MQTT主题(Topic)
    • 在MQTT中,主题是消息发布和订阅的关键。为了实现指令下发,需要定义好主题,以便设备能够订阅这些主题,而控制中心或应用则可以发布消息到这些主题。
  2. 设备订阅主题
    • 设备需要在启动时订阅用于接收指令的MQTT主题。这样,设备就能够监听来自控制中心或应用的指令消息。
  3. 控制中心发布指令消息
    • 控制中心或应用通过MQTT发布包含指令的消息到相应的主题。这个消息应该包含指令的内容,可能是一个JSON格式的数据,以便设备能够解析。
  4. 设备接收指令消息
    • 设备通过MQTT接收到发布的指令消息。这通常在设备的MQTT消息处理回调中完成。
  5. 解析指令
    • 设备解析接收到的指令消息,理解其中的控制或操作内容。
  6. 执行指令
    • 设备执行指令对应的操作。这可能包括改变设备状态、执行某种动作、或者返回请求的信息。

代码案例

以下是一个简单的Java示例代码,演示了如何使用MQTT 客户端库进行 MQTT 指令下发:

import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;public class MqttCommandSender {public static void main(String[] args) {String broker = "tcp://mqtt.eclipse.org:1883";String clientId = "CommandSender";String topic = "device/command"; // 定义指令主题try {MqttClient client = new MqttClient(broker, clientId, new MemoryPersistence());MqttConnectOptions connOpts = new MqttConnectOptions();connOpts.setCleanSession(true);System.out.println("Connecting to broker: " + broker);client.connect(connOpts);System.out.println("Connected");// 定义指令内容,可以是JSON格式的数据String command = "{\\"action\\":\\"start\\", \\"parameter\\":\\"value\\"}";// 发布指令到指定主题client.publish(topic, new MqttMessage(command.getBytes()));System.out.println("Command sent");client.disconnect();System.out.println("Disconnected");} catch (MqttException me) {me.printStackTrace();}}
}

上述代码演示了一个简单的指令发送器,它连接到 MQTT 代理,发布了一个包含指令的消息到指定主题。在实际应用中,需要根据需求定义更多的细节,例如处理设备响应、错误处理等。

在设备端需要实现一个 MQTT 客户端用于订阅指令主题,接收并处理来自控制中心的指令。这可能需要使用 Eclipse Paho 的 MqttCallback 接口。

四、MQTT 数据和数据库数据

MQTT(Message Queuing Telemetry Transport)是一种轻量级的消息传输协议,通常用于在设备之间传递实时数据。与传统数据库相比,MQTT 具有一些特定的特征和应用场景。

以下是 MQTT 数据和数据库数据之间的一些差异:

  1. 实时性和即时性: MQTT 通常用于实时性要求较高的场景,例如物联网设备之间的实时通信。消息可以非常快速地通过 MQTT 传递,而数据库操作可能会有一些延迟。
  2. 消息格式: MQTT 传递的是消息,这些消息可以采用各种格式,如 JSON、二进制数据等。数据库通常存储结构化数据,可能是表格形式的数据。
  3. 存储方式: MQTT 主要用于消息传递,通常不用于数据的长期存储。数据可以被传递到订阅者,但不一定会在中间存储。相比之下,数据库是一种持久化的存储方式,用于长期保存数据。
  4. 数据结构: MQTT 的数据通常是一对多的关系,一个发布者可以将消息发送给多个订阅者。数据库中的数据通常是一对一或一对多的关系,具有固定的结构。

在一般的物联网系统中,通常会将 MQTT 数据和数据库数据结合使用:

  • MQTT 数据流向数据库: 设备产生的实时数据通过 MQTT 发送到一个消息代理,然后可以选择将这些数据存储到数据库中,以便后续分析、查询和长期存储。
  • 数据库数据供给 MQTT: 某些应用可能需要将数据库中的数据推送到设备,可以通过定期查询数据库,然后使用 MQTT 发送数据到相关的设备。

综上所述,MQTT 主要用于实时通信和消息传递,而数据库主要用于数据的长期存储和结构化查询。在实际应用中,它们通常是相辅相成的,一起构建完整的物联网系统。

五、MQTT和Kafka比较

MQTT和Kafka主要区别

MQTT和Kafka是两种主流的消息中间件二者的主要区别如下:

  1. 架构设计

    • MQTT是一个单发布/订阅消息模型,Kafka采用发布/订阅和消息队列模型。

    • MQTT面向点对点通讯,Kafka面向发布/订阅,可以进行广播通讯。

  2. 消息传输模式

    • MQTT消息以推方式发送,Kafka消息支持推和拉加载务。
  3. 消息Durability

    • MQTT消息不支持持久化,Kafka支持消息持久化存储。
  4. 性能

    • Kafka性能更高,吞吐量更大,可以处理巨大流量。MQTT吞吐量和并发能力相对较低。
  5. 存储能力

    • Kafka可以对消息进行存储管理和备份,而MQTT不支持消息存储。
  6. 可靠性

    • Kafka支持分布式部署高可用,MQTT单点故障风险较高。
  7. 应用场景

    • MQTT更适用于物联网场景的低延迟和低带宽连接。

    • Kafka适用于大数据量、高吞吐的场景,例如实时日志、点击流等。

总体来说:

  • MQTT适用于IoT边缘接入场景,Kafka更强大进行大数据实时处理。
  • MQTT单点,Kafka支持分布式。
  • Kafka消息持久化,可追溯;MQTT不支持存储。

MQTT和Kafka适合的场景

  • IoT场景下,MQTT更适用于设备到云端的低延时数据上报,像温湿度传感器这类。Kafka更适用于需求较高的场景,如视频云。

  • 使用Kafka来处理和分析实时数据更好,它支持持久化和横向扩展能力强。MQTT不适合大规模数据处理。

  • 日志分析Kafka和Elasticsearch都很好,Kafka用于高吞吐预处理,Elasticsearch用于搜索和分析。

  • 物流追踪这样低延迟的场景MQTT足够,不需要Kafka的高性能。

  • 服务间通讯可以使用Kafka,但性能考虑最好还是用专用MQ。

  • 推送使用MQTT订阅更高效可靠。

  • Crowdfunding实时更新可以用Kafka做事件传播与处理。

  • 视频直播可以用Kafka转发流数据,用MQTT实现弹幕交互。

总体来说,MQTT更适用于物联网即时报告,Kafka更适用于大数据实时计算。两个都很强大,选择要根据实际场景需求进行权衡。具体实施也可以结合两者各自优点,如Kafka处理大数据,MQTT边缘物联网连接


相关文章:
(一)MQTT协议与指令下发;MQTT与Kafka比较
(二)用MQTT在Spring Boot项目中实现异步消息通信

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/622591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springcloud微服务分布式 springboot+vue的轻院校园网购商城管理系统 Eureka

本文的研究目标是以商城的轻院网购商城管理体系为对象,论文的研究内容包括:商品信息、系统公告等方面进行了研究。系统以当前应用最为广泛的Java语言为基础,结合了目前应用最为广泛的嵌入式嵌入式平台,集成了B/S体系结构。数据库选…

Tensor Core的一些概念理解

英伟达的GPU产品架构发展如下图,Tensor Core是从2017年的Volta架构开始演变的针对AI模型大量乘加运算的特殊处理单元。本文主要梳理一些关于Tensor Core的一些基础概念知识。 什么是混合精度? 混合精度在底层硬件算子层面,使用半精度&#xf…

墙地砖外形检测的技术方案-图像获取

硬件系统 墙地砖外形检测硬件系统主要由工业相机、光源、瓷砖位置检测电路和上位机组成,其结构如图所示。为了提高系统检测精度和稳定性,系统采用的是较高精度的高速工业相机用于抓取墙地砖表面轮廓图像,图像数据通过USB接口向上位机传送&am…

9个Linux系统信息命令

通过这些命令可以查看 Linux 系统硬件、内核、发行版、主机名、正常运行时间等详细信息。 1. uname – 打印系统信息 uname 命令可打印 Linux 系统内核、硬件架构、主机名和操作系统的详细信息。其中包括版本号和机器信息。 uname(Unix name的缩写)打…

阿里云服务器的tcp端口无法访问(云服务厂家问题?)

问题->无法访问 阿里云服务器的tcp端口 最近一台阿里云服务器的一个端口61616无法访问,在服务器内用外网地ip发现无法访问,用内网ip访问是正常的,通过技术排查: 解决->无法访问 阿里云服务器的tcp端口 1 配置官网的安全组…

【angular教程240107】04 Dom及表单双向数据绑定,ToDoList+service 服务+实现数据的持久化

05 Angular中Dom操作 以及表单( input、checkbox、radio、select、 textarea )结合双休数据绑定实现在线预约功能 0快捷键 输入法快速切换 :shitf alt 半角 全角 ctrl空格 Angular表单 Dom获取表单值 以及双向数据绑定 1. Angular表单 D…

c++学习笔记-STL案例-演讲比赛管理系统2

目录 功能介绍 代码结构部分 查看一下类图 1.Speaker.h 2.speechManager.h 3.speechManager.cpp 4.演讲比赛流程关系系统.cpp 功能介绍 speechManager.h函数包含演讲比赛流程的所有功能如下: 开始演讲比赛:完成整届比赛的流程,每…

数据结构.线性表(2)

一、模板 例子: a: b: 二、基本操作的实现 (1)初始化 (2)销毁和清空 (3)求长度和判断是否为空 (4)取值 (5)查找 (6)插入 &…

【期末考试】数据库综合复习宝典

目录 第一章 数据库系统概述 第二章 关系代数 第四章 关系数据库理论 第五章 数据库设计 第六章 数据库管理系统 第八章 事务管理 第一章 数据库系统概述 1.1三级模式 ①外模式:它为特定的应用程序或用户群体提供了一个数据视图,这个视图是独立于…

Maven和MyBatis框架简单实现数据库交互

MyBatis是一种基于Java语言的持久层框架,它的主要目的是简化与数据库的交互过程。MyBatis通过XML或注解配置来映射Java对象和数据库表之间的关系,并提供了灵活的查询方式和结果集处理机制。MyBatis还提供了事务管理、缓存机制、插件扩展等特性。 使用My…

Maven编译时,如何忽略swagger注解

public class School implements Serializable {private static final long serialVersionUID 1595261592489L;ApiModelProperty(value "主键")private Long id;ApiModelProperty(value "学校名称")private String name;ApiModelProperty(value "…

Linux学习记录——사십 高级IO(1)

文章目录 1、IO2、同、异步IO(5种IO类型)3、其它高级IO4、非阻塞IO 其它IO类型的实现在这篇之后的三篇 1、IO input,output。调用read或recv接口时,如果对方长时间不向我方接收缓冲区拷贝数据,我们的进程就只能阻塞&a…

python桶排序

桶排序是一种分布式排序算法,它将待排序的元素分散到不同的桶中,然后对每个桶中的元素进行排序,最后按照桶的顺序将所有元素合并起来。 桶排序的基本思想是将待排序的元素分散到若干个有序的桶中,然后对每个桶中的元素进行排序&a…

SpringBoot 操作Redis

Redis的Java客户端 Redis的Java客户端常用的有: JedisLettuceSpring Data Redis Spring Data Redis是Spring的一部分,对Redis底层开发包进行了高度封装。在Spring项目中,可以使用Spring Data Redis来简化操作。 Spring Data Redis使用方式…

基于面向对象,C++实现双链表

双链表同单链表类似,由一个值和两个指针组成 Node.h节点头文件 #pragma once class Node { public:int value;Node* prev;Node* next;Node(int value);~Node(); };Node.cpp节点源文件 #include "Node.h"Node::Node(int value) {this->value value…

如何开启文件共享及其他设备如何获取

1.场景分析 日常生活中,常常会遇到多台电脑共同办公文件却不能共享的问题,频繁的用移动硬盘、U盘等拷贝很是繁琐,鉴于此,可以在同一内网环境下设置共享文件夹,减少不必要的文件拷贝工作,提升工作效率。废话…

希尔排序和计数排序

📑前言 本文主要是【排序】——希尔排序、计数排序的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 🌄每日一句…

Jmeter 压测接口返回大量数据时吞吐量上不去问题记录

1. 背景介绍 近期需要对外部提供一个批量查询接口,接口逻辑并不复杂,只是返回的数据有点多。分页查询,最大查询100个单子,分页单页最大值没有限制,那么,极端情况下,就是一次查询100个单…

【PyTorch简介】3.Loading and normalizing datasets 加载和规范化数据集

Loading and normalizing datasets 加载和规范化数据集 文章目录 Loading and normalizing datasets 加载和规范化数据集Datasets & DataLoaders 数据集和数据加载器Loading a Dataset 加载数据集Iterating and Visualizing the Dataset 迭代和可视化数据集Creating a Cust…

【Docker篇】从0到1搭建自己的镜像仓库并且推送镜像到自己的仓库中

文章目录 🔎docker私有仓库🍔具体步骤 🔎docker私有仓库 Docker私有仓库的存在为用户提供了更高的灵活性、控制和安全性。与使用公共镜像仓库相比,私有仓库使用户能够完全掌握自己的镜像生命周期。 首先,私有仓库允许…