MQTT协议与EMQ
MQTT协议简介
简介
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布订阅(publish/subscribe)构建和构建模式的轻量级通信协议TCP/IP协议上,由IBM在1999年发布。MQTT最大的优点是可以为连接远程设备提供实时可靠的信息服务,代码少,带宽有限。它作为一种低成本、低带宽的即时通信协议,广泛应用于物联网、小型设备、移动应用等领域。 MQTT基于客户端-服务器的消息发布/订阅传输协议。MQTT协议重量轻、简单、开放、易于实现。这些特点使他得到了广泛的应用。在许多情况下,包括第一个环境,如机器和机器(M2M)通信和物联网(IoT)。其他,广泛应用于卫星链路通信传感器、偶尔拨号的医疗设备、智能家居和一些小型设备。
MQTT协议设计规范
因为物联网的环境很特殊,所以MQTT遵循以下设计原则:
- 简化,不添加可有可无的功能
- 发布/订阅模式,方便传感器之间传输新闻,解耦Client/Server模型的好处是没有必要提前知道对方的存在(IP/Port),不必同时运行
- 允许用户动态创建主题(不需要提前创建主题),零运维成本
- 最大限度地降低传输量,提高传输效率
- 考虑低带宽、高延迟、网络不稳定等因素
- 保持和控制连续会话(心跳)
- 理解客户端计算能力可能很低
- 提供服务质量(Quality of service :Qos)管理
- 不强制传输数据的类型和格式,保持灵活性(仅应用业务数据)
MQTT协议的主要特点
MQTT协议设计为低带宽、不可靠的网络远程传感器和控制设备通信,具有一定的主要特点:
- 开放新闻协议,简单实现
- 使用发布/订阅模式,提供一对多的新闻发布,解除应用程序耦合
- 屏蔽负载(协议携带的应用数据)内容的消息传输
- 基于TCP/IP网络连接,提供有序、无损的双向连接 主流的MQTT是基于TCP数据推送连接,但也是基于UDP版本叫MQTT—SN。由于连接方式不同,这两个版本的优缺点自然也不同
- 新闻服务质量(Qos)支持、可靠传输保证:发布服务质量有三种
- QoS1:“至多一次”,消息发布完全依赖底层TCP/IP‘网络。消息会丢失或重复。这个级别可以用于以下情况。环境传感器数据丢失一次读取记录并不重要,因为很快就会有第二次发送,这主要是普通的APP推送,如果你的智能设备在新闻推送中没有联网,推送过去没有收到,再次联网也不会收到
- QoS2:至少一次确保消息到达,但可能会重复消息
- QoS3:只有一次,确保消息一次到达 。这个级别可以用于一些重要严格的计费系统。在计费系统中,消息重复或丢失导致不正确的结果。这种最高质量的消息发布服务也可以用于即时通讯APP推送,确保只收到一次
- 1字节固定报头,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他总是在服务器的网络连接中建立协议的应用程序或设备。客户端可以:
- 发布其他客户端可能订阅的信息
- 订阅其他客户端发布的消息
- 退订或删除应用程序消息
- 断开连接到服务器
MQTT服务端
MQTT服务器又称消息代理(Broker),可以是一个应用程序或一台设备。它是位于消息发布者和订阅着之间,他可以
- 接受客户的网络连接
- 接受客户发布的应用信息
- 处理客户端的订阅和退订请求
- 想订阅的客户转发应用程序信息
发布/订阅、主题、会话
MQTT是基于发布(Publish)/订阅(Subscribe)通信和数据交换模式Http的请求(Request)/应答(Response)模式本质上是不同的 向消息服务器订阅主题。订阅成功后,消息服务器将主题下的消息转发给所有订阅者 主题(Topic)以/为分隔符区分不同层次。包括通配符 或#主题又称主题过滤器;不含通配符的主题名称
MQTT协议中的方法
MQTT该协议定义了一些表示确定资源的方法(也称为行动)。该资源可以代表预先存在的数据或动态生成的数据,这取决于服务器的实现。一般来说,资源只是服务器上的文件或输出。主要方法:
- CONNECT: 连接到服务器的客户端
- CONNACT: 连接确认
- PUBLISH: 发布消息
- PUBACK: 发布确认
- PUBREC: 发布的消息已被接受
- PUBREL: 发布的消息已经发布
- PUBCOMP: 发布完成
- SUBSCRIBE: 订阅请求
- SUBACK: 订阅确认
- UNSUBSCRIBE: 取消订阅
- UNSUBACK: 取消订阅确认
- PINGREQ:客户端发送心跳
- PINGRESP:客户端心跳响应
- DISCONNECT: 断开连接
- AUTI: 认证
MQTT协议数据包结构
MQTT协议中,一个MQTT数据包由:固定头,可变头,消息体构成,MQTT数据包结构如下:
- 固定头:存在于所有MQTT在数据包中,数据包接、发布、订阅、心跳等数据包连接、发布、订阅、心跳等,必须固定头部,所有类型MQTT固定头必须包含在协议中
- 可变头:存在于部分MQTT在数据包中,数据包的类型决定了可变头是否存在及其具体内容。变头不是可选的意思,而是指这部分再有协议类型中存在,在有些协议类型中不存在
- 消息体:存在于部分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客户端工具,它包含了连接、订阅、和发布功能,同时还能查看自己发送和接受的报文数据。