MQTT协议与EMQ

MQTT协议简介

简介

MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建与TCP/IP协议上,由IBM在1999年发布。MQTT最大的优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较为广泛的应用。
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的。这些特点使他适用范围非常广泛。在很多情况下,包含首先的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其他,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型设备中广泛应用。

MQTT协议设计规范

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

  1. 精简,不添加可有可无的的功能
  2. 发布/订阅模式,方便消息在传感器之间传递,解耦Client/Server模式,带来的好处在于不必预先知道对方存在(IP/Port),不必同时运行
  3. 允许用户动态创建主题(不需要预先创建主题),零运维成本
  4. 把传输量降到最低以提高传输效率
  5. 把低带宽、高延迟、不稳定的网络等因素考虑在内
  6. 支持连续会话保持和控制(心跳)
  7. 理解客户端计算能力可能很低
  8. 提供服务质量(Quality of service :Qos)管理
  9. 不强求传输数据的类型与格式,保持灵活(只应用业务数据)

MQTT协议主要特性

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

  1. 开放消息协议,简单实现
  2. 使用发布/订阅模式,提供一对多的消息发布,解除应用程序耦合
  3. 对负载(协议携带的应用数据)内容屏蔽的消息传输
  4. 基于TCP/IP网络连接,提供有序、无损的双向连接
    主流的MQTT是基于TCP连接进行数据推送的,但是同样有基于UDP的版本,叫做MQTT—SN。这两种版本由于基于不同的连接方式,优缺点自然也就各有不同了
  5. 消息服务质量(Qos)支持,可靠传输保证:有三种发布服务质量
  • QoS1:“至多一次”,消息发布完全依赖底层TCP/IP‘网络。会发生消息丢失或重复。这一级别可用于如下情况,环境传感器数据,丢失一次读记录无所谓,因为不久还会有第二次发送,这种方式主要普通的APP的推送,倘若您的智能设备在消息推送未联网,推送过去没收到,再次联网也就收不到了
  • QoS2:“至少一次”,确保消息到达,但消息重复可能会发生
  • QoS3:“只有一次”,确保消息到达一次 。在一些重要比较严格的计费系统中,可以使用此级别,在计费系统中,消息重复或丢失导致不正确的结果,这种最高质量的消息发布服务还可以用于即时通讯类的APP的推送,确保用于只会收到一次
  1. 1字节固定报头,2字节心跳报文,最小传输开销和协议交换,有效减少网络流量
    这就是为什么在介绍里说他非常适合“在物联网领域,传感器与服务器的通信,信息的收集,要知道嵌入式设备的运算能力和带宽都相对薄弱”,使用这种协议来传递消息在适合不过了
  2. 在线状态感知:使用Last Will和Testament特性和通知有关各方客户端异常终端的机制
    Last Will:遗言机制,用于通知同一主题下的其他设备,发送遗言的设备已经断开了连接
    Testament: 遗嘱机制,功能类似于Last Will

应用

MQTT协议广泛应用于物联网、移动物联网、智能硬件、车联网、电力能源等领域

  • 物联网M2M通信,物联网大数据采集
  • Android消息的推送,Web消息推送
  • 移动即时消息,例如Facebook Messager
  • 智能硬件、智能家居、智能电器
  • 车联网通信,电动车站桩采集
  • 智慧城市、远程医疗、远程教育
  • 电力、石油与能源等行业市场

MQTT协议原理

MQTT协议实现方式

实现MQTT协议需要客户端和服务器通讯完成,在通许过程中,MQTT协议有三种身份:发布者(Publish)、代理(Broker)、订阅着(Subsscribe),其中,消息的发布者和订阅着都是客户端,消息代理是服务器,消息发布者可以同时是订阅者
MQTT 传输的消息分为 主题(Topic)和负载(payload)两部分:

  • Topic,可以理解为消息的类型,订阅者订阅(Subscribe)后,就会收到该主题的消息内容(payload)
  • payload,可以理解为消息内容,是指订阅者具体要使用的内容

网络传输与应用消息

MQTT会构建底层网络传输:他将建立客户端到服务器的连接,提供两者之间的一个有序的、无损的、基于字节流的双向传输
当应用数据通过MQTT网络发送时,MQTT会把与之相关的服务质量(Qos)和主题名(Topic)相关联

MQTT客户端

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

  1. 发布其他客户端可能会订阅的信息
  2. 订阅其他客户端发布的消息
  3. 退订或删除应用程序的消息
  4. 断开与服务器连接

MQTT服务端

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

  1. 接受来自客户的网络连接
  2. 接受客户发布的应用消息
  3. 处理来自客户端的订阅和退订请求
  4. 想订阅的客户转发应用程序消息

发布/订阅、主题、会话

MQTT是基于发布(Publish)/订阅(Subscribe)模式来进行通信及数据交换的,与Http的请求(Request)/应答(Response)的模式有本质的不同
订阅者会向消息服务器订阅一个主题。成功订阅后,消息服务器会将该主题下的消息转发给所有的订阅者
主题(Topic)以“/”为分隔符区分不同的层级。包含通配符“+”或“#”的主题又称为主题过滤器;不含通配符的成为主题名

MQTT协议中的方法

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

  1. CONNECT: 客户端连接到服务器
  2. CONNACT: 连接确认
  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. AUTI: 认证

MQTT协议数据包结构

MQTT协议中,一个MQTT数据包由:固定头,可变头,消息体构成,MQTT数据包结构如下:

  1. 固定头:存在于所有的MQTT数据包中,表示数据包类型及数据包的分组类标识,如连接,发布,订阅,心跳等,其中固定头是必须的,所有类型的MQTT协议中,都必须包含固定头
  2. 可变头:存在于部分MQTT数据包中,数据包类型决定了可变头是否存在及其具体内容。可变头不是可选的意思,而是指这部分再有协议类型中存在,在有些协议类型中不存在
  3. 消息体:存在于部分MQTT数据包中,表示客户端收到具体内容。与可变头一样,在有些协议类型中有消息内容,有些协议类型中没有消息内容

EMQX简介

MQTT属于物联网的通信协议,在MQTT协议中有两大角色:客户端(发布者/订阅者),服务器(MQTT broker);针对客户端和服务端需要遵循该协议的具体实现,EMQ/EMQX就是MQTT Broker的一种实现。
EMQ官网: https://www.emqx.io/cn/

EMQ X是什么

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

EMQ X与物联网平台的关系是什么

典型的物联网平台包括设备硬件、数据采集、数据存储、分析、Web/移动应用。EMQ X位于数据采集这一层,分别与硬件和数据存储、分析进行交互,是物联网平台的核心;前端硬件通过MQTT协议与位于数据采集层的EMQ X交互,通过EMQ X将数据采集后,通过EMQ X提供数据接口,将数据保存到后台的持久化平台中(各种关系型数据库和NOSQL数据库),或者流失处理框架等,上层应用通过这些数据分析后得到的结果呈现给最终用户

Docker安装

拉取: docker pull emqx/emqx:latest
运行:

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:latest

访问emqt的web管理页面
http://127.0.0.1:18083

#账号: admin

#密码: public

端口

 1883:MQTT 协议端口8883:MQTT/SSL 端口8083:MQTT/WebSocket 端口8080:HTTP API 端口18083:Dashboard 管理控制台端口

基本命令

如果采用的是非docker部署的,那么EMQX提供了一些常用的命令行工具,方便用户对EMQ X进行启动,关闭、进入控制台等操作

  • emqx start
    后台启动EMQ X Broker
  • emqx stop
  • emqx restart
  • emqx console
    使用控制台启动EMQX Broker
  • emqx foreground
    使用控制台启动EMQ XBroker,与 emqx console不同,emqx foreground不支持输入Erlang命令
  • emqx ping
    Ping EMQ X Broker

客户端websocket消息收发

在EMQ XBroker提供了Dashboard中的 Tools 导航下的websocket 页面提供了一个简易但有效的webSocket客户端工具,它包含了连接、订阅、和发布功能,同时还能查看自己发送和接受的报文数据。

MQTT协议与EMQ相关推荐

  1. 使用java实现MQTT协议客户端的接收、发布消息和订阅、退订主题topic

    记录一下我实习的第一个任务,学习MQTT协议 首先呢得了解MQTT是什么,这里推荐一个我学习MQTT的中文文档 MQTT协议的基于TCP/IP协议的一个物联网协议,有几个概念必须要弄懂得主题(topi ...

  2. MQTT协议通俗讲解

    参考 Reference v3.1.1 英文原版 中文翻译版 其他资源 网站 MQTT官方主页 Eclipse Paho 项目主页 测试工具 MQTT Spy(基于JDK) Chrome插件 MQTT ...

  3. IoT:MQTT协议详解

    IoT -- (七)MQTT协议详解 转自:https://blog.csdn.net/anxianfeng55555/article/details/80908795 MQTT是什么? MQTT(M ...

  4. 电信运营商基于 MQTT 协议 构建千万级 IoT 设备管理平台

    MQTT 是用于物联网的标准消息传递协议.它被设计为一种非常轻量级的发布/订阅消息传送,非常适合以较小的代码占用量和网络带宽连接远程设备.MQTT 协议具有以下特点: 轻巧高效:MQTT 客户端非常小 ...

  5. MQTT 协议是什么

    MQTT 协议是什么 随着 5G 时代的来临,万物互联的伟大构想正在成为现实.联网的 物联网设备 在 2018 年已经达到了 70 亿,在未来两年,仅智能水电气表就将超过10亿. 海量的设备接入和设备 ...

  6. Java物联网开发(一) —— MQTT协议

    基于 Publish/Subscribe 模式的物联网通信协议MQTT 一. 简介 二. 特点 QoS消息发布质量介绍 三. 应用场景 四. 原理 MQTT协议中的方法 五. MQTT协议数据包结构 ...

  7. 001-STM32+BC26/260Y基本控制篇(自建物联网平台)--基础知识-MQTT协议

    先来体验一下MQTT通信 1.提示: 可以把MQTT软件安装到自己的电脑,也可以安装在云服务器上 如果把MQTT服务器安装在自己的电脑上,连接服务器的IP地址就是自己电脑的IP地址 如果安装到云服务器 ...

  8. 基于MQTT协议实现微信小程序控制树莓派

    基于MQTT协议实现微信小程序控制树莓派 在我的github上有源码,大家可以直接下载来用 https://github.com/yjc-123/-MQTT- ,这里给大家说一下实现的过程. 小程序端 ...

  9. MQTT消息服务——EMQ

    最近的开发中用到MQTT协议和EMQ消息服务器,MQTT和EMQ是物联网的产物,想必会随着5G时代和万物互联的到来而逐渐火热. # EMQ:     是一个MQTT消息服务器     ### 基于 A ...

最新文章

  1. Flask框架(flask中的数据库SQLAlchemy(python3),配置、模型类、创建表)
  2. malloc、calloc、realloc和free
  3. 关于发布DIPS的MVC项目的IIS 7.0环境配置的方法
  4. 互联网日报 | 3月13日 星期六 | 蚂蚁集团公布碳中和目标;小鹏汽车累计交付突破50000台;阿迪达斯发未来五年新战略...
  5. 据说有人面试栽在了Thread类的stop()方法和interrupt()方法上
  6. 基于 SSH 的远程操作以及安全,快捷的数据传输转
  7. 【java笔记】网络编程:文件上传案例
  8. 【LeetCode】【数组】题号:*189,旋转数组
  9. JS Learun 消息对话框
  10. 群晖transmission 下载失败 权限设置 permission denied
  11. python数据分析入门之高效的学习路径
  12. 国产操作系统有哪些,你知道吗?
  13. jQuery插件的使用和写法
  14. 京东/淘宝的手机销售榜(前4名 -- 手机品牌 --手机型号*3 --手机分辨率 -- 手机操作系统 --安卓版本号)
  15. PTA题目:7-9 抢红包 (25分)
  16. 电车难题和他的n个**变种分享
  17. IT 行业平均薪资第一
  18. PyQt5  PyQt5-tools 安装
  19. BZOJ1415【NOI2005】聪聪和可可
  20. HTML之marquee标签(滚动字幕(跑马灯))

热门文章

  1. 使用jmeter进行APP端(安卓手机)脚本录制
  2. java小程序点餐系统
  3. Qt 图片压缩 指定文件大小和尺寸
  4. wepy 实现倒计时代码
  5. linux怎么换桌面图片不显示不出来,如何在 Linux 中为每个屏幕设置不同的壁纸
  6. TinkerBoard运行树莓派Raspbian OS
  7. CSS stylus 中 hover 触发子元素
  8. Calendar日历类
  9. vue支付项目-APP微信支付功能
  10. 七选五 排列组合+容斥/错排