Python系列 - MQTT协议

news2024/12/1 13:14:28

Python系列 - MQTT协议

资源连接

MQTT的介绍和应用场景的示例说明

一、什么是MQTT

百度关于MQTT的介绍如下:
MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布订阅范式的消息协议。它工作在 TCP/IP协议之上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议,
MQTT是一个基于客户端-服务器的消息发布/订阅传输协议。MQTT协议是轻量、简单、开放和易于实现的。
MQTT适用范围非常广泛。在很多情况下,包括受限的环境中,如:机器与机器(M2M)通信和物联网(IoT)。其次,通过卫星链路通信传感器、偶尔拨号的医疗设备、智能家居、及一些小型化设备中已广泛使用。

二、 MQTT的特点

MQTT协议是为大量计算能力有限,且工作在低带宽、不可靠的网络的远程传感器和控制设备通讯而设计的协议,因此它具有以下主要的几项特性:

  • 轻量级和高效‌:MQTT协议的客户端代码量小,对系统资源的需求较低。小型传输,开销很小(固定长度的头部是 2 字节),协议交换最小化,以降低网络流量,提高了传输效率。

  • 支持双向通信‌:MQTT协议支持设备到云端以及云端到设备之间的消息传递,使得向大量设备广播消息变得相对简单。

  • 数据传输可靠‌:MQTT支持多种消息服务质量等级(QoS),确保数据按需可靠传输。QoS 0表示最多发送一次,QoS 1表示至少发送一次,QoS 2表示确保消息只有一次到达。

  • 支持离线消息‌:通过保留消息和持久会话,MQTT支持设备离线时的消息保存和转发。

  • 简单易用‌:MQTT协议使用 TCP/IP 提供网络连接,结构简单,易于实现和维护,适合低带宽和不可靠的网络环境。

  • 发布/订阅模式‌:MQTT基于发布/订阅模式,消息通过主题进行分类。客户端可以订阅一个或多个主题,发布者发送消息到特定的主题,所有订阅该主题的客户端都将接收到这些消息,通过提供一对多的消息发布,解除应用程序耦合。

三、 MQTT的工作流程

MQTT的信息基于发布和订阅模式,通过主题进行相应的分类,基于发布订阅模式及其代理服务器的理解示意图:
在这里插入图片描述基于MQTT的发布订阅模式下,其工作流程如下:
在这里插入图片描述其中,MQTT传输的内容包括两个部分:

  • 主题(Topic):主题可以理解为信息的主题,订阅者订阅(Subscribe)后,就会收到该主题的内容(payload);
  • 负载(payload):可以理解为信息的内容,是指订阅的具体要使用的内容。

四、MQTT的工作模式

MQTT提供三种工作模式来保证数据的传输,三种工作模式和应用场景介绍如下:

  • 至多一次:丢掉记录无所谓的场景;
  • 至少一次:确保信息到达,但信息可能会重复;
  • 只有一次:确保消息到达一次(小型传输,开销小)

五、MQTT的应用场景

MQTT的在如下三种场景下具有明显的优势:

  • 带宽低
  • 网络延迟高
  • 网络通信不稳定

由于MQTT在三大场景下的优势,使得MQTT特别适合物联网(IoT)和类似场景:

  • 物联网(IoT)‌:MQTT是物联网领域中最典型的应用之一。在物联网中,大量的设备和传感器需要进行数据的收集、监控和控制。MQTT协议的特性使其成为物联网通信的理想选择。例如,智能家居系统可以使用MQTT来监控和控制家中的各种设备,如智能灯泡、恒温器等。

  • 工业控制和远程监测‌:MQTT在工业控制和远程监测领域也有广泛的应用。它的可靠性和低带宽消耗特性使其非常适合在工业环境中进行实时数据传输和远程控制。例如,工业设备监控可以通过MQTT实时将数据上传至云端或控制中心,用于生产线状态监控、设备维护预警等。

  • 即时通讯和实时数据传输‌:MQTT的低延迟和可靠性使其成为即时通讯和实时数据传输的理想选择。例如,聊天室和实时消息推送应用可以使用MQTT来实现用户之间的实时通讯。此外,MQTT还适用于需要实时数据传输的应用,如实时股票行情、天气数据等。

  • 实时位置追踪‌:MQTT可以用于实时位置追踪应用。移动设备可以发布自己的位置信息,其他用户或系统可以订阅这些信息来获取实时位置数据。这对于车队管理、物流跟踪等应用非常有用。

  • 其他场景‌:MQTT还应用于传感器数据传输、数据传输和同步、远程监控和控制系统等领域。例如,气象站、环境监测等领域可以使用MQTT进行传感器数据的采集和传输;跨平台数据同步、数据备份等场景也可以利用MQTT实现数据的实时同步。

六、python代码实现订阅

> #!/usr/bin/env python 
> # 基于Pika实现对MQTT的通信
> import pika 
> import sys 
> import json
> 

> channel = conn.channel()
> 
> channel.exchange_declare(exchange='test.topic',exchange_type='topic',durable=True) #订阅的topic
> 
> result = channel.queue_declare(queue='2570',
> durable=True,auto_delete=False,exclusive=False) queue_name =
> result.method.queue
> 
> channel.queue_bind(
>         exchange='test.topic', queue=queue_name, routing_key='order.PM02.2570')
> 
> print(' [*] Waiting for logs. To exit press CTRL+C')
> 
> 
> def callback(ch, method, properties, body):
>     #print(" [x] %r:%r" % (method.routing_key, body))
>     j_text = json.loads(body)
>     print(j_text)
>     #j_Order = j_text['maintOrder']
>     #print(j_Order)
>     j_PM = j_text['pmType']
>     print(j_PM)

> # 执行订阅程序
> channel.basic_consume(
>     queue=queue_name, on_message_callback=callback, auto_ack=True) try:
>     channel.start_consuming() except Exception as e :
>     print(e)
>     channel.start_consuming()

参考:
MQTT
MQTT协议
mqtt的应用场景有哪些

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2251126.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ipad项目 蓝湖宽度

ipad项目 横屏状态时 蓝湖宽度设置930px media screen and (orientation: portrait) {/* 竖屏时的样式 */ } media screen and (orientation: landscape) {/* 默认是 横屏时的样式 */ }

理解Java集合的基本用法—Collection:List、Set 和 Queue,Map

本博文部分参考 博客 ,强烈推荐这篇博客,写得超级全面!!! 图片来源 Java 集合框架 主要包括两种类型的容器,一种是集合(Collection),存储一个元素集合(单列…

搭建深度学习框架+nn.Module

一、搭建项目框架(YOLO框架的简约版本) 最终成品的项目框架如下图,最终实现的效果,通过自己配置的框架函数,对模型进行定义与参数调配。同时在参数配置的过程中可选择是否进行模型初始化参数的使用。适用于YOLO框架的…

FFmpeg 简介与编译

1. ffmpeg 简介: FFmpeg是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec,为了保证高可移…

打latex公式可以练到像手写一样快吗?

这里分享两个Python Latex工具latexify和handcalcs。 latexify生成LaTeX 数学公式 import math import latexify @latexify.with_latex #调用latexify的装饰器 def solve(a, b, c):return (-b + math.sqrt(b**2 - 4*a*c)) / (2*a)solve 更多例子.......

【Linux】磁盘 | 文件系统 | inode

🪐🪐🪐欢迎来到程序员餐厅💫💫💫 主厨:邪王真眼 主厨的主页:Chef‘s blog 所属专栏:青果大战linux 总有光环在陨落,总有新星在闪烁 模电好难啊&#xff…

AntFlow 0.20.0版发布,增加多数据源多租户支持,进一步助力企业信息化,SAAS化

传统老牌工作流引擎比如activiti,flowable或者camunda等虽然功能强大,也被企业广泛采用,然后也存着在诸如学习曲线陡峭,上手难度大,流程设计操作需要专业人员,普通人无从下手等问题。。。引入工作流引擎往往需要企业储…

Scrapy管道设置和数据保存

1.1 介绍部分: 文字提到常用的Web框架有Django和Flask,接下来将学习一个全球范围内流行的爬虫框架Scrapy。 1.2 内容部分: Scrapy的概念、作用和工作流程 Scrapy的入门使用 Scrapy构造并发送请求 Scrapy模拟登陆 Scrapy管道的使用 Scrapy中…

洛谷 B3626 跳跃机器人 C语言 记忆化搜索

题目: https://www.luogu.com.cn/problem/B3626 题目描述 地上有一排格子,共 n 个位置。机器猫站在第一个格子上,需要取第 n 个格子里的东西。 机器猫当然不愿意自己跑过去,所以机器猫从口袋里掏出了一个机器人!这…

docker快速部署gitlab

文章目录 场景部署步骤默认账号密码效果 场景 新增了一台机器, 在初始化本地开发环境,docker快速部署gitlab 部署步骤 编写dockerfile version: 3.7services:gitlab:image: gitlab/gitlab-ce:latestcontainer_name: gitlabrestart: alwayshostname: gitlabenviron…

计算机视觉工程师紧张学习中!

在当今这个日新月异的科技时代,计算机视觉作为人工智能的重要分支,正以前所未有的速度改变着我们的生活和工作方式。为了紧跟时代步伐,提升自我技能,一群怀揣梦想与热情的计算机视觉设计开发工程师们聚集在了本次线下培训活动中。…

RabbitMq死信队列(详解)

死信队列的概念 死信(dead message)简单理解就是因为种种原因,无法被消费的信息,就是死信。 有死信,自然就有死信队列。当消息在⼀个队列中变成死信之后,它能被重新被发送到另⼀个交换器中,这个交换器就是DLX( Dead L…

30分钟学会正则表达式

正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个“规则字符串”,这个“规则字符串”用来表达对字符串的一种过滤逻辑。 作用 匹配 查看一个字符串是否符合正则表达式的语法 搜索 正…

IDEA无法创建java8、11项目创建出的pom.xml为空

主要是由于Spring3.X版本不支持JDK8,JDK11,最低支持JDK17 解决的话要不就换成JDK17以上的版本,但是不太现实 另外可以参考以下方式解决 修改spring初始化服务器地址为阿里云的 https://start.aliyun.com/

Unity类银河战士恶魔城学习总结(P149 Screen Fade淡入淡出菜单)

【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili 教程源地址:https://www.udemy.com/course/2d-rpg-alexdev/ 本章节实现了进入游戏和死亡之后的淡入淡出动画效果 UI_FadeScreen.cs 1. Animator 组件的引用 (anim) 该脚本通过 Animator 控制 UI 元…

IDEA 解决Python项目import导入报错、引用不到的问题

使用Idea 23.1 专业版编写Python项目时,import 导入爆红,无法引入其他package的代码,现象如: 解决方案:Idea表头打开 File -> Project Settring 解决效果:

[NSSRound#12 Basic]ordinary forensics

解压出来两个文件,一个是镜像文件另一个不知道 先查看镜像文件 vol.py -f /home/kali/Desktop/forensics.raw imageinfo再查看进程,发现有个cmd的程序 vol.py -f /home/kali/Desktop/forensics.raw --profileWin7SP1x64 pslist进行查看,有…

uniapp中父组件数组更新后与页面渲染数组不一致实战记录

简单描述一下业务场景方便理解: 商品设置功能,支持添加多组商品(点击添加按钮进行增加).可以对任意商品进行删除(点击减少按钮对选中的商品设置进行删除). 问题: 正常添加操作后,对已添加的任意商品删除后,控制台打印数组正常.但是与页面显示不一致.已上图为例,选中尾…

【Git系列】利用 Bash 脚本获取 Git 最后一次非合并提交的提交人

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

hadoop环境配置-vm安装+麒麟ubantu

一.VM版本 选择16版本,15版本存在windows蓝屏的情况,也不用设置HV等相关设置 激活下载参考下述博客:https://blog.csdn.net/matrixlzp/article/details/140674802 提前在bois打开SVM设置,不设置无法打开新建的虚拟机 ubantu下载…