物联网网络协议-MQTT协议的使用

简介: 物联网网络协议-MQTT协议的使用

非加密消息传输

物联网系统中网络协议是物联网设备之间沟通的“语言”,使用同一种语言,双方才能通信成功。MQTT 协议是最流行的一种,它甚至已经成为物联网系统事实上的网络协议标准。

第一步是安装 hbmqtt,它是一个开源的基于 Python 语言的 MQTT Broker 软件,正好包括我们需要使用一些工具。hbmqtt通过打开终端输入 pip 命令就可以安装。这也是选择使用它的主要原因。
不过要注意的是,hbmqtt 是基于 Python3 实现的,因此这里使用的是 pip3 工具。

pip3 install hbmqtt

安装完成后,我们就可以使用 hbmqtt 中提供的 hbmqtt_sub 和 hbmqtt_pub 这两个命令行工具了。通过名字,你应该也可以看出 hbmqtt_sub 可以充当订阅者的角色;hbmqtt_pub 可以作为消息的发布者。
至于订阅者和发布者之间的经纪人,也就是 MQTT Broker,我们使用 Eclipse 免费开放的在线 Broker 服务。
链接: link.
打开链接,你可以看到关于端口的介绍信息,加密和非加密方式都支持,而且还有基于 Websocket 的实现,这对基于前端网页的应用来说是非常有利的。
我们先使用 1883 端口的非加密方式,然后为消息传输确定一个主题(Topic)。主题确定了消息的类别,用于消息过滤。我们可以把主题可以设为“/geektime/iot”。

/geektime/iot

接着,我们在电脑的终端界面输入下面的命令,就可以订阅这个主题消息:

hbmqtt_sub --url mqtt://mqtt.eclipse.org:1883 -t /geektime/iot

如果你想了解一些命令的执行细节,可以在上面的命令中加上 “-d” 参数。
现在,我们启动另外一个终端界面,通过 hbmqtt_pub 发布一个 “/geektime/iot” 主题的消息:

hbmqtt_pub --url mqtt://mqtt.eclipse.org:1883 -t /geektime/iot -m Hello,World!

通过 Eclipse 的开放 Broker 作为“经纪人”,消息被传输到了我们通过 hbmqtt_sub 运行的订阅者那里。下图是终端界面上运行的结果,一个完整的消息传输过程就这样完成了。

截屏2023-12-27 下午8.09.31.png

MQTT 在物联网领域的优势

MQTT 的生态很完善

在使用 MQTT 的时候会觉得很方便,可供挑选的方案有很多,可以支持多种语言。类似的 MQTT Broker 软件,你还可以选择基于 C 语言的Mosquitto,基于 Erlang 语言的VerneMQ等。
至于 MQTT 的客户端(Client)实现,也有成熟的 Python、C、Java 和 JavaScript 等各种编程语言的开源实现。
而且,还有很多商业公司在持续运营功能更丰富、支持更完备的商业版 Broker 实现,比如提供高并发能力的集群特性、方便拓展的插件机制等。这些会大大提高我们技术开发者的工作效率。

MQTT 自身的“基因”很强大

阿里云、华为云、腾讯云和微软 Azure 这些大厂,之所以不约而同地选择 MQTT 协议作为物联网设备的“第一语言”,不仅是因为 MQTT 的生态完善,MQTT 协议本身的优秀设计也是重要的因素。
它在设计上的优点体现在主要有五个方面:
1.契合物联网大部分应用场景的发布 - 订阅模式。
2.能够满足物联网中资源受限设备需要的轻量级特性。
3.时刻关注物联网设备低功耗需求的优化设计。
4.针对物联网中多变的网络环境提供的多种服务质量等级。
5.支持在物联网应用中越来越被重视的数据安全。

发布 - 订阅模式

刚才通信过程,是一个发布者和一个订阅者的情况。在这之后,你可以再打开一个终端界面,重复和之前一样的命令,再启动一个订阅者。

hbmqtt_sub --url mqtt://mqtt.eclipse.org:1883 -t /geektime/iot

现在,这两个订阅者都订阅了“/geektime/iot” 主题的消息。
然后,你再次使用 hbmqtt_pub 发送消息,就可以看到两个订阅者都收到了同样的消息,这是发布 - 订阅模式的典型特征。

因为采用了发布 - 订阅模式,MQTT 协议具有很多优点,
比如能让一个传感器数据触发一系列动作;
网络不稳定造成的临时离线不会影响工作;
方便根据需求动态调整系统规模等。
这使得它能满足绝大部分物联网场景的需求。

轻量级协议:减少传输数据量

MQTT 是一个轻量级的网络协议,这一点也是它在物联网系统中流行的重要原因。毕竟物联网中大量的都是计算资源有限、网络带宽低的设备。
这种“轻量级”体现在两个方面。
一方面,MQTT 消息采用二进制的编码格式,而不是 HTTP 协议那样的文本的表述方式。
这样子做的好处就是可以充分利用字节位,协议头可以很紧凑,从而尽量减少需要通过网络传输的数据量。
比如,分析 HTTP 的一个请求抓包,它的消息内容是下面这样的(注意:空格和回车、换行符都是消息的组成部分):

GET /account HTTP/1.1    <--注释:HTTP请求行
Host: time.geekbang.com  <--注释:以下为HTTP请求头部
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:81.0) Gecko/20100101 Firefox/81.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6
     <--注释:这个空行是必须的,即使下面的请求体是空的

在 HTTP 协议传输的这段文本中,每个字符都要占用 1 个字节。而如果使用 MQTT 协议,一个字节就可以表示很多内容。下面的图片展示了 MQTT 的固定头的格式,这个固定头只有 2 个字节:
截屏2023-12-27 下午8.09.12.png
第一个字节分成了高 4 位(4~7)和低 4 位(0~3);低 4 位是数据包标识位,其中的每一比特位又可以表示不同的含义;高 4 位是不同数据包类型的标识位。
第二个字节表示数据包头部和消息体的字节共个数,其中最高位表示有没有第三字节存在,来和第二个字节一起表示字节共个数。
如果有第三个字节,那它的最高位表示是否有第四个字节,来和第二个字节、第三个字节一起表示字节总个数。依此类推,还可能有第四个字节、第五个字节,不过这个表示可变头部和消息体的字节个数的部分,最多也只能到第五个字节,所以可以表示的最大数据包长度有 256MB。
比如,一个请求建立连接的 CONNECT 类型数据包,头部需要 14 个字节;发布消息的 PUBLISH 类型数据包头部只有 2~4 个字节。
轻量级的另一方面,体现在消息的具体交互流程设计非常简单,所以 MQTT 的交互消息类型也非常少。为了方便后面的讲解,我在这里整理了一个表格,总结了 MQTT 不同的数据包类型的功能和发消息的流向。
从表格可以看出,MQTT 3.1.1 版本一共定义了 14 种数据包的类型,在第一个字节的高 4 位中分别对应从 1 到 14 的数值。

截屏2023-12-27 下午8.10.23.png

功耗优化:节约电量和网络资源

除了让协议足够轻量,MQTT 协议还很注重低功耗的优化设计,这主要体现在对能耗和通信次数的优化。
比如,MQTT 协议有一个 Keepalive 机制。它的作用是,在 Client 和 Broker 的连接中断时,让双方能及时发现,并重新建立 MQTT 连接,保证主题消息的可靠传输。
这个机制工作的原理是:Client 和 Broker 都基于 Keepalive 确定的时间长度,来判断一段时间内是否有消息在双方之间传输。这个 Keepalive 时间长度是在 Client 建立连接时设置的,如果超出这个时间长度,双方没有收到新的数据包,那么就判定连接断开。

除了 Keepalive 机制,MQTT 5.0 中的重复主题特性也能帮助我们节省网络资源。
Client 在重复发送一个主题的消息时,可以从第二次开始,将主题名长度设置为 0,这样 Broker 会自动按照上次的主题来处理消息。这种情况对传感器设备来说十分常见,所以这个特性在工作中很有实际意义。

3 种 QoS 级别:可靠通信
除了计算资源有限、网络带宽低,物联网设备还经常遇到网络环境不稳定的问题,尤其是在移动通信、卫星通信这样的场景下。比如共享单车,如果用户已经锁车的这个消息,不能可靠地上传到服务器,那么计费就会出现错误,结果引起用户的抱怨。这样怎么应对呢?
这个问题产生的背景就是不稳定的通信条件,所以 MQTT 协议设计了 3 种不同的 QoS (Quality of Service,服务质量)级别。你可以根据场景灵活选择,在不同环境下保证通信是可靠的。
这 3 种级别分别是:
QoS 0,表示消息最多收到一次,即消息可能丢失,但是不会重复。
QoS 1,表示消息至少收到一次,即消息保证送达,但是可能重复。
QoS 2,表示消息只会收到一次,即消息有且只有一次。

截屏2023-12-27 下午8.10.38.png

我用一张图展示了它们各自的特点。可以看到,QoS 0 和 QoS 1 的流程相对比较简单;而 QoS 2 为了保证有且只有一次的可靠传输,流程相对复杂些。
正常情况下,QoS 2 有 PUBLISH、PUBREC、PUBREL 和 PUBCOMP 4 次交互。
至于“不正常的情况”,发送方就需要重复发送消息。比如一段时间内没有收到 PUBREC 消息,就需要再次发送 PUBLISH 消息。不过要注意,这时要把消息中的 “重复”标识设置为 1,以便接收方能正确处理。同样地,如果没有收到 PUBCOMP 消息,发送方就需要再次发送 PUBREL 消息。

安全传输

说到安全传输,首先我们需要验证 Client 是否有权限接入 MQTT Broker。为了控制 Client 的接入,MQTT 提供了用户名 / 密码的机制。在建立连接过程中,它可以通过判断用户名和密码的正确性,来筛选有效连接请求。但是光靠这个机制,还不能保证网络通信过程中的数据安全。因为在明文传输的方式下,不止设备数据,甚至用户名和密码都可能被其他人从网络上截获而导致泄漏,于是其他人就可以伪装成合法的设备发送数据。
所以还需要通信加密技术的支持。
MQTT 协议支持 SSL/TLS 加密通信方式。采用 SSL/TLS 加密之后,MQTT 将转换为 MQTTS。这有点类似于 HTTP 和 HTTPS 的关系。
我们只要将前面测试的命令修改一下,将 “mqtt://” 改为 “mqtts://”,端口改为 8883,就可以用 SSL/TLS 加密通信方式连接到 Eclipse 提供的开放 Broker。
如果这个的 SSL 证书已经过期了,连接会失败。
这里再提供另一个方式,供测试使用)
输入“mqtts://test.mosquitto.org:8883”,把开放 Broker 切换到这个链接,
链接: link.
从链接中下载一个客户端证书,然后通过下面的命令订阅主题消息:

hbmqtt_sub --url mqtts://test.mosquitto.org:8883 -t /geektime/iot --ca-file ~/Downloads/mosquitto.org.crt

接着,我们再通过下面的命令测试发布消息:

hbmqtt_pub --url mqtts://test.mosquitto.org:8883 -t /geektime/iot -m Hello,World! --ca-file ~/Downloads/mosquitto.org.crt

最后在运行 hbmqtt_sub 命令的终端,就可以看到 Hello,World! 的消息:

截屏2023-12-27 下午8.10.49.png

学习笔记总结自‘物联网开发实战’--郭朝斌

相关实践学习
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
6月前
|
数据采集 算法 数据挖掘
模块化控制协议(MCP)在网络中增强智能体执行效率的研究
随着Web3技术的迅速发展,去中心化应用和智能体在各种领域的应用逐渐增多。MCP(Modularized Control Protocol,模块化控制协议)作为一种增强智能体执行能力的关键技术,为Web3场景中的智能体提供了更强的灵活性和可扩展性。本文将探讨如何利用MCP技术提升智能体在Web3场景中的执行能力,并通过实例代码展示其实现路径。
564 22
|
3月前
|
监控 负载均衡 安全
WebSocket网络编程深度实践:从协议原理到生产级应用
蒋星熠Jaxonic,技术宇宙中的星际旅人,以代码为舟、算法为帆,探索实时通信的无限可能。本文深入解析WebSocket协议原理、工程实践与架构设计,涵盖握手机制、心跳保活、集群部署、安全防护等核心内容,结合代码示例与架构图,助你构建稳定高效的实时应用,在二进制星河中谱写极客诗篇。
WebSocket网络编程深度实践:从协议原理到生产级应用
|
4月前
|
消息中间件 安全 物联网
海量接入、毫秒响应:易易互联基于 Apache RocketMQ + MQTT 构筑高可用物联网消息中枢
易易互联科技有限公司是吉利集团旗下专注于换电生态的全资子公司,致力于打造安全、便捷、便宜的智能换电网络。公司依托吉利GBRC换电平台,基于电池共享与车辆全生命周期运营,已布局超470座换电站,覆盖40多个城市,计划2027年达2000座。面对海量设备高并发连接、高实时性要求及数据洪峰挑战,易易互联采用阿里云MQTT与RocketMQ构建高效物联网通信架构,实现稳定接入、低延迟通信与弹性处理,全面支撑其全国换电网络规模化运营与智能化升级。
342 1
海量接入、毫秒响应:易易互联基于 Apache RocketMQ + MQTT 构筑高可用物联网消息中枢
|
4月前
|
数据采集 传感器 监控
Modbus 与 MQTT 协议兼容:MyEMS 的泛在能源数据采集技术实现
MyEMS深度融合Modbus与MQTT协议,破解能源数据采集中协议碎片化、网络异构、数据孤岛等难题。通过Modbus接入95%以上工业设备,实现现场数据精准“拉取”;依托MQTT构建高效物联网传输通道,支持多源数据主动“推送”与云端集成。边缘侧采集规整,中心侧汇聚分析,形成统一、可靠、低延迟的数据流。该架构兼具高兼容性、强扩展性与低运维成本,广泛应用于工业园区、商业楼宇及集团型企业,支撑实时监控、AI分析与跨系统融合,打造泛在互联的能源数据底座,助力企业实现全面智慧能源管理。
389 6
|
4月前
|
运维 架构师 安全
二层协议透明传输:让跨域二层协议“无感穿越”多服务商网络
简介:本文详解二层协议透明传输技术,适用于企业网工、运营商及架构师,解决LLDP/LACP/BPDU跨运营商传输难题,实现端到端协议透传,提升网络韧性与运维效率。
|
8月前
|
物联网
(手把手)在华为云、阿里云搭建自己的物联网MQTT消息服务器,免费IOT平台
本文介绍如何在阿里云搭建自己的物联网MQTT消息服务器,并使用 “MQTT客户端调试工具”模拟MQTT设备,接入平台进行消息收发。
2925 42
|
9月前
|
数据采集 监控 网络协议
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
1056 40
​MCP协议深度解析:原理、应用与物联网时代的机遇-优雅草卓伊凡
|
8月前
|
物联网
如何在腾讯云等平台搭建自己的物联网MQTT服务器Broker
物联网技术及MQTT协议被广泛应用于各种场景。本文介绍物联网MQTT服务助手下载,如何搭建自己的物联网平台,并使用 “MQTT客户端调试工具”模拟MQTT设备,接入平台进行消息收发。
679 37
|
8月前
|
安全 网络协议 Linux
Linux网络应用层协议展示:HTTP与HTTPS
此外,必须注意,从HTTP迁移到HTTPS是一项重要且必要的任务,因为这不仅关乎用户信息的安全,也有利于你的网站评级和粉丝的信心。在网络世界中,信息的安全就是一切,选择HTTPS,让您的网站更加安全,使您的用户满意,也使您感到满意。
245 18
|
7月前
|
监控 安全 Java
Java 开发中基于 Spring Boot 3.2 框架集成 MQTT 5.0 协议实现消息推送与订阅功能的技术方案解析
本文介绍基于Spring Boot 3.2集成MQTT 5.0的消息推送与订阅技术方案,涵盖核心技术栈选型(Spring Boot、Eclipse Paho、HiveMQ)、项目搭建与配置、消息发布与订阅服务实现,以及在智能家居控制系统中的应用实例。同时,详细探讨了安全增强(TLS/SSL)、性能优化(异步处理与背压控制)、测试监控及生产环境部署方案,为构建高可用、高性能的消息通信系统提供全面指导。附资源下载链接:[https://pan.quark.cn/s/14fcf913bae6](https://pan.quark.cn/s/14fcf913bae6)。
1509 0

相关产品

  • 物联网平台