前言:
----在2023年的今天,智能家居与智能家电的兴起犹如滚滚长江迅速袭来,智能终端设备也不断出现在人们的视野当中,实现远程控制,其中必然不能缺少终端与终端,终端与服务之间的交互,如何来解决这一难题呢,接下来我们就来讲解消息传输协议(MQTT)是如何连接万物互联的通讯桥梁。
一、MQTT介绍
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻量级”通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网小型设备、移动应用等方面有较广泛的应用。
二、为何选择MQTT
----MQTT是基于TCP长连接,首先是先跟MQTT服务器建立TCP连接,然后发送登录请求,要保持长连接,定时发心跳包跟服务保持连接。这使其非常适合硬件性能低下的远程设备以及网络状况糟糕的情况下传输数据。
MQTT特点:
-
使用发布/订阅消息模式,提供一对多的消息发布,解除应用程序耦合。
-
二进制形式编码,小型化传输,协议开销较小,极大降低网络开销。
-
三种消息发布服务质量(Qos):至多一次、至少一次、只有一次。
-
采用心跳机制,通过间断性的发送报文,来维持客户端和服务端的心跳长连接,以减少电量的消耗,提升系统资源利用率。
*发布/订阅模型为客户提供了彼此独立的存在,增强了整个系统的可靠性。当一个客户端出现故障时,整个系统可以继续正常工作。
三、为什么不选择其他众多网络协议
----在以往我们服务与服务之间交互通常采用HTTP/HTTPS请求响应等方式完成,为何不继续采用请求响应,原因有以下几点:
- HTTP 是一种同步协议。客户端需要等待服务器响应。Web 浏览器具有这样的要求,但它的代价是牺牲了可伸缩性。在 IoT 领域,大量设备以及很可能不可靠或高延迟的网络使得同步通信成为问题。异步消息协议更适合 IoT 应用程序。传感器发送读数,让网络确定将其传送到目标设备和服务的最佳路线和时间。
- HTTP 是单向的。客户端必须发起连接。在 IoT 应用程序中,设备或传感器通常是客户端,这意味着它们无法被动地接收来自网络的命令。
- HTTP 是一种 1-1 协议。客户端发出请求,服务器进行响应。将消息传送到网络上的所有设备上,不但很困难,而且成本很高,而这是 IoT 应用程序中的一种常见使用情况。
- HTTP 是一种有许多标头和规则的重量级协议。它不适合受限的网络。
四、MQTT 跟传统的消息队列相比,有哪些区别
----MQTT是一种消息队列遥测传输协议,但并非说他就是消息队列,常用的消息队列有RabbitMQ Kafka RocketMQ等,两者适用场景不一样,绝大部分 MQTT Broker 不保证消息顺序(Queue),常用于物联网、消息传输等。
两者区别:
- 在传统消息队列中,在发送消息之前,必须先创建相应的队列;在 MQTT 中,不需要预先创建要发布的主题(可订阅的 Topic)
- 在传统消息队列中,未被消费的消息总是会被保存在某个队列中,直到有一个消费者将其消费;在 MQTT中,如果发布一个没有被任何客户端订阅的消息,这个消息将被直接扔掉
- 在传统消息队列中,一个消息只能被一个客户端获取,在 MQTT 中,一个消息可以被多个订阅者获取,MQTT 协议也不支持指定消息被单一的客户端获取。
五、MQTT主题
----在MQTT当中,消息是没有消息队列这一概念,那它是怎么隔离区分各种繁杂的消息呢,这里就涉及到 主题 概念,不同的主题可被不同的订阅者订阅,发布者可以发布不同的主题消息,从而将消息进行一个隔离区分。MQTT 协议规定主题是 UTF-8 编码的字符串。
命名规则:
- 所有的主题名必须至少包含一个字符
- 主题名是大小写敏感的。ACCOUNTS 和 Accounts 是不同的主题名
- 主题名可以包含空格字符。Accounts payable 是合法的主题名
- 主题名以前置或后置斜杠 / 区分。/finance 和 finance 是不同的
- 只包含斜杠 / 的主题名是合法的
- 主题名不能包含 null 字符(Unicode U+0000)
MQTT 主题通配符包含单层通配符 “+” 及多层通配符 “#”,主要用于客户端一次订阅多个主题。
-
单层通配符
如客户端订阅AAA/+/CCC主题消息,则会收到AAA/1/CCC,AAA/2/CCC,…,AAA/N/CCC主题消息
-
多层通配符
如客户端订阅AAA/#主题消息,则会收到AAA,AAA/BBB,AAA/BBB/CCC主题消息
-
以$开头的主题为系统主题
***注意:通配符只能用于订阅,不能用于发布。
六、Linux环境搭建服务
---- EMQX 是一款全球下载量超千万的开源物联网 MQTT 服务器,单集群支持 1 亿物联网设备连接,消息分发时延低于 1 毫秒,助力企业构建关键业务的 IoT 平台与应用。
本章主要介绍Centos7系统搭建,依次执行以下命令:
1、curl -s https://assets.emqx.com/scripts/install-emqx-rpm.sh | sudo bash
2、yum install emqx
3、systemctl start emqx
查看运行状态:systemctl status emqx
*如果遇到openssl问题,请先更新openssl,命令如下:
1、yum install -y epel-release
2、yum install -y openssl11 openssl11-devel
七、常见端口与控制台
- 1883 MQTT TCP 协议端口
- 8883 MQTT/TCP SSL 端口
- 8083 MQTT/WebSocket 端口
- 8084 MQTT/WebSocket with SSL 端口
- 8080 MQTT执行引擎HTTP API 端口
- 18083 EMQX Dashboard 管理控制台端口
浏览器输入:http://localhost:18083/,访问控制台页面,账号admin/public
八、使用Windows桌面软件工具
----MQTT X 是一个强大的跨平台 MQTT 5.0 桌面和 CLI 客户端,使学习、探索和开发 MQTT 变得快速而简单。
此图为作者测试所截:
好了,今天的教程就到这里了,下一章节我们来讲解如何在SpringBoot项目中对接mqtt服务,实现订阅和发布,希望大家多多关注(首席摸鱼师 微信同号)支持哦~