MQTT协议与EMQ

简介: MQTT协议与EMQ

前言

EMQX官方文档:EMQX官方文档

一、MQTT协议介绍

1. 物联网的通信协议:

设备与设备之间要进行交互 这个应该是什么样的格式 设备与平台 设备与人要进行交互 这个数据应该是什么格式 都是协议来定义的

物联网的协议必须针对物联网的通信有几个关键的问题需要解决

第一个问题 :

物联网设备所处的网络环境复杂 :

比如有的地方设备环境网络不是特别稳 有的设备所在环境相对比较好

这可能会导致有一些设备一会在线 一会不在线

那设备与设备 设备与平台之间要进行消息的交互 因为网络的原因 这些数据有可能被接收到也有可能会接收不到 那这个通信协议就必须具备能保证这个消息数据整体发送的质量 就是消息一定 要被接收到

第二个问题 :

这些物理设备在这个设备上装一些芯片 传感器 那么这些芯片上都会去嵌入一些程序 那这些程序在运行过程中 内存不是很大 处理能力不强 那么在芯片上的程序不能特别大

处理数据不能特别繁琐 也不能去处理很大量的数据 那这些问题都是物联网通信协议需要去考虑的问题

MQTT协议就是专门在物联网行业中对这些问题有非常好的解决方案

MQTT 是基于 Publish/Subscribe 模式的物联网通信协议,凭借简单易实现、支持 QoS、报文小等特点,占据了物联网协议的半壁江山:

mqtt官网:http://mqtt.org/

mqtt中文网:http://mqtt.p2hp.com/

传统的请求响应模型 服务端不会主动发送请求给客户端 一个请求对应一个响应

2.MQTT 协议特点

1.简单.
2.支持消息服务质量 解决因为网络环境的复杂.不可靠导致的消息不能被安全可靠传输的问题
3.发送的报文数据小 占用带宽小 解决芯片存储数小的问题

一次订阅成功之后 后续只要客户端有数据发送过来
MQTT服务端主动将数据推送给pc端或者手机端
极少的代码有限的带宽 为远程的一些设备提供实时可靠的消息服务本身性能网络开销小

3. MQTT协议设计规范

由于物联网的环境是非常特别的,所以MQTT遵循以下设计原则:

(1)精简,不添加可有可无的功能;

(2)发布/订阅(Pub/Sub)模式,方便消息在传感器之间传递,解耦Client/Server模式,带来的好处在于不必预先知道对方的存在(ip/port),不必同时运行;

(3)允许用户动态创建主题(不需要预先创建主题),零运维成本;

(4)把传输量降到最低以提高传输效率;

(5)把低带宽、高延迟、不稳定的网络等因素考虑在内;

(6)支持连续的会话保持和控制(心跳);

(7)理解客户端计算能力可能很低;

(8)提供服务质量( quality of service level:QoS)管理;

(9)不强求传输数据的类型与格式,保持灵活性(指的是应用层业务数据)。

4.MQTT协议主要特性

MQTT协议工作在低带宽、不可靠的网络的远程传感器和控制设备通讯,而设计的协议,它具有以下主要的几项特性;

(1)开放消息协议,简单易实现。

(2)使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。

(3)对负载(协议携带的应用数据)内容屏蔽的消息传输。

(4)基于TCP/IP网络连接,提供有序,无损,双向连接。

主流的MQT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT-SN。

这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了。

(5)消息服务质量(Q0S)支持,可靠传输保证;有三种消息发布服务质量:

QoS0:“至多一次",消息发布完全依赖底层TCP/IP网络。会发生消息丢失或重复。这一级别可用

如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久后还会有第二次发送。这一种方式主要普通APP的推送,倘若你的智能设备在消息推送时未联网,推送过去没收到,再次联网也就收不了。

QoS1:“至少一次",确保消息到达,但消息重复可能会发生。 在支付情况在不可取

QoS2:“只有一次",确保消息到达一次。在一些要求比较严格的计费系统中,可以使用此级别。在计费系统中,消息重复或丢失会导致不正确的结果。这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用户收到且只会收到一次。

(6)1字节固定报头,2字节心跳报文,最小化传输开销和协议交换,有效减少网络流量,

这就是为什么在介绍里说它非常适合"在物联网领域,传感器与服务器的通信,信息的收集,要知道嵌入式设备的运算能力和带宽都相对薄弱,使用这种协议来传递消息再适合不过了。

(7)在线状态感知:使用Last Will和Testament特性通知有关各方客户端异常中断的机制。

服务端和客户端有心跳感知 服务端实实检测客户端或者设备的状态

Last Wi:即遗言机制,用于通知同一主题下的其他设备,发送遗言的设备已经断开了连接。

当客户端下线 服务端帮客户端执行某一件事情

Testament:遗嘱机制,功能类似于Last Will.

5.MQTT协议实现方式

实现MQTT协议需要客户端和服务器端通讯完成,在通讯过程中,MQTT协议中有三种身份:

发布者(Publish)、代理(Broker)(服务器),订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端消息代理是服务器,消息发布者可以同时是订阅者。

6.MQTT客户端

一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户端可以:

(1)发布其他客户端可能会订阅的信息;

(2)订阅其它客户端发布的消息;
(3)退订或删除应用程序的消息;
(4)断开与服务器连接

7.MQTT服务器端

MQTT服务器以称为"消息代理”(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅者之间,它可以:

(1)接受来自客户的网络连接;
(2)接受客户发布的应用信息;

(3)处理来自客户端的订阅和退订请求;
(4)向订阅的客户转发应用程序消息。

8. 发布/订阅、主题、会话

MQTT 是基于 发布(Publish)/订阅(Subscribe) 模式来进行通信及数据交换的,与 HTTP 的 请求(Request)/应 答(Response) 的模式有本质的不同。

订阅者(Subscriber) 会向 消息服务器(Broker) 订阅一个 主题(Topic) 。成功订阅后,消息服务器会将该主题下的消息转发给所有的订阅者。

主题(Topic)以 ‘/’ 为分隔符区分不同的层级。包含通配符 ‘+’ 或 ‘#’ 的主题又称为 主题过滤器(Topic Filters); 不含通配符的称为 主题名(Topic Names) 例如:

chat/room/1
sensor/10/temperature
sensor/+/temperature
$SYS/broker/metrics/packets/received
$SYS/broker/metrics/#

‘+’: 表示通配一个层级,例如a/+,匹配a/x, a/y

‘#’: 表示通配多个层级,例如a/#,匹配a/x, a/b/c/d

注: ‘+’ 通配一个层级,’#’ 通配多个层级(必须在末尾)。

发布者(Publisher) 只能向 ‘主题名’ 发布消息,订阅者(Subscriber) 则可以通过订阅 ‘主题过滤器’ 来通配多个主题名称。

会话(Session)

每个客户端与服务器建立连接后就是一个会话,客户端和服务器之间有状态交互。会话存在于一个网络之间,也可能在客户端和服务器之间跨越多个连续的网络连接。

9. MQTT协议中的方法

MQTT协议中定义了一些方法(也被称为动作),来于表示对确定资源所进行操作。这个资源可以代表预先存在的数据或动态生成数据,这取决于服务器的实现。通常来说,资源指服务器上的文件或输出。主要方法有:

(1)CONNECT:客户端连接到服务器

(2)CONNACK:连接确认

(3)PUBLISH:发布消息

(4)PUBACK:发布确认

(5)PUBREC:发布的消息已接收

(6)PUBREL:发布的消息已释放

(7)PUBCOMP:发布完成

(8)SUBSCRIBE:订阅请求

(9)SUBACK:订阅确认

(10)UNSUBSCRIBE:取消订阅

(11)UNSUBACK:取消订阅确认

(12)PINGREQ:客户端发送心跳

(13)PINGRESP:服务端心跳响应

(14)DISCONNECT:断开连接

(15)AUTH:认证

10.MQTT协议数据包结构

官方文档中对于MQTT协议包的结构有着具体的说明:http://mqtt.org/documentation

二、EMQX简介

MQTT属于是物联网的通信协议,在MQTT协议中有两大角色:客户端(发布者/订阅者),服务端(Mqtt

broker);针对客户端和服务端需要有遵循该协议的的具体实现,EMQ/EMQ X就是MQTT Broker的一种实现。

EMQ官网:https://www.emqx.io/cn/

EMQ X 是开源百万级分布式 MQTT 消息服务器(MQTT Messaging Broker),用于支持各种接入标准 MQTT协议的设备, 实现从设备端到服务器端的消息传递,以及从服务器端到设备端的设备控制消息转发。从而实现物联网设备的数据采集,和对设备的操作和控制。

1. EMQ X服务端环境搭建与配置

1.1安装

EMQ X 目前支持的操作系统:

Centos6

Centos7

OpenSUSE tumbleweed

Debian 8

Debian 9

Debian 10

Ubuntu 14.04

Ubuntu 16.04

Ubuntu 18.04

macOS 10.13

macOS 10.14

macOS 10.15

产品部署建议 Linux 服务器,不推荐 Windows 服务器。

安装包下载链接:https://www.emqx.io/cn/downloads#broker

更多安装教程:https://docs.emqx.cn/broker/v4.3/getting-started/install.html

Shell 脚本一键安装 (Linux)

curl https://repos.emqx.io/install_emqx.sh | bash
  1. 获取 Docker 镜像
docker pull emqx/emqx:4.3.7
  1. 启动 Docker 容器
docker run -d --name emqx -p 1883:1883 -p 8081:8081 -p 8083:8083 -p 8084:8084 -p 8883:8883 -p 18083:18083 emqx/emqx:4.3.7

1.2启动

当 EMQ X 成功运行在你的本地计算机上且 EMQ X Dashboard 被默认启用时,通过访问
http://localhost:18083 来查看Dashboard,默认用户名是 admin ,密码是 public 。

相关实践学习
消息队列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
相关文章
|
10天前
|
消息中间件 监控 物联网
MQTT协议对接及RabbitMQ的使用记录
通过合理对接MQTT协议并利用RabbitMQ的强大功能,可以构建一个高效、可靠的消息通信系统。无论是物联网设备间的通信还是微服务架构下的服务间消息传递,MQTT和RabbitMQ的组合都提供了一个强有力的解决方案。在实际应用中,应根据具体需求和环境进行适当的配置和优化,以发挥出这两个技术的最大效能。
61 0
|
27天前
|
物联网 C# 智能硬件
智能家居新篇章:WPF与物联网的智慧碰撞——通过MQTT协议连接与控制智能设备,打造现代科技生活的完美体验
【8月更文挑战第31天】物联网(IoT)技术的发展使智能家居设备成为现代家庭的一部分。通过物联网,家用电器和传感器可以互联互通,实现远程控制和状态监测等功能。本文将探讨如何在Windows Presentation Foundation(WPF)应用中集成物联网技术,通过具体示例代码展示其实现过程。文章首先介绍了MQTT协议及其在智能家居中的应用,并详细描述了使用Wi-Fi连接方式的原因。随后,通过安装Paho MQTT客户端库并创建MQTT客户端实例,演示了如何编写一个简单的WPF应用程序来控制智能灯泡。
45 0
|
1月前
|
物联网 网络性能优化 Python
"掌握MQTT协议,开启物联网通信新篇章——揭秘轻量级消息传输背后的力量!"
【8月更文挑战第21天】MQTT是一种轻量级的消息传输协议,以其低功耗、低带宽的特点在物联网和移动应用领域广泛应用。基于发布/订阅模型,MQTT支持三种服务质量级别,非常适合受限网络环境。本文详细阐述了MQTT的工作原理及特点,并提供了使用Python `paho-mqtt`库实现的发布与订阅示例代码,帮助读者快速掌握MQTT的应用技巧。
48 0
|
3月前
|
数据采集 监控 物联网
MQTT协议在智能制造中的应用案例与效益分析
【6月更文挑战第8天】MQTT协议在智能制造中的应用案例与效益分析
104 1
|
3月前
|
消息中间件 存储 RocketMQ
消息队列 MQ产品使用合集之Remoting协议是否可以直接和proxy交互的吗
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
|
3月前
|
消息中间件 Serverless Windows
消息队列 MQ产品使用合集之MQTT协议是否可以应用于社交软件的系统通知场景
阿里云消息队列MQ(Message Queue)是一种高可用、高性能的消息中间件服务,它允许您在分布式应用的不同组件之间异步传递消息,从而实现系统解耦、流量削峰填谷以及提高系统的可扩展性和灵活性。以下是使用阿里云消息队列MQ产品的关键点和最佳实践合集。
|
3月前
|
传感器 物联网
物联网协议概述:MQTT、CoAP 和 HTTP
【6月更文挑战第3天】探索物联网的三大协议——MQTT、CoAP 和 HTTP。MQTT 是高效的消息传递使者,适用于大规模、不稳定网络环境;CoAP 小巧灵活,适合资源有限的设备;HTTP 则是熟悉的网络通信老将。根据不同场景选择合适的协议,让物联网设备有效交流。示例代码展示它们的使用方式。
118 0
|
4月前
|
消息中间件 小程序 网络性能优化
蓝易云 - 直播小程序源码有用的协议知识:MQTT协
在直播小程序源码中,MQTT协议可以用于实现实时消息推送,如弹幕、聊天消息、礼物信息等。通过使用MQTT协议,可以确保消息的实时性和可靠性,从而提高用户体验。
178 0
|
4月前
|
弹性计算 JSON 监控
使用Logtail采集MQTT协议数据
本文主要介绍如何使用Logtail来采集MQTT协议的数据。
117 0
使用Logtail采集MQTT协议数据
|
2月前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。