前言
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
- 获取 Docker 镜像
docker pull emqx/emqx:4.3.7
- 启动 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 。