0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在MQTT中发布和订阅实体

陈斌 来源:jf_44873076 作者:jf_44873076 2025-05-20 17:21 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

在MQTT中发布和订阅实体(主题)是MQTT通信的核心操作,下面将详细介绍其原理、步骤以及示例代码,帮助你全面理解这一过程。

一、MQTT发布与订阅的基本概念

发布(Publish):客户端将消息发送到MQTT代理(Broker)上的特定主题(Topic)。发布者无需知道有哪些客户端订阅了该主题,只需将消息发送到代理即可。

订阅(Subscribe):客户端向MQTT代理注册感兴趣的主题,当有消息发布到这些主题时,代理会将消息推送给订阅者。订阅者可以订阅一个或多个主题。

主题(Topic):主题是MQTT中的消息分类标识,使用类似文件路径的字符串表示,例如"home/livingroom/temperature"。主题支持通配符,#表示多级通配符,+表示单级通配符。

二、发布和订阅的步骤

(一)建立MQTT连接

在发布或订阅消息之前,客户端需要先与MQTT代理建立连接。这通常涉及以下参数:

代理地址和端口:例如tcp://broker.hivemq.com:1883。

客户端ID:用于唯一标识客户端。

用户名和密码(可选):用于身份验证。

QoS等级:消息质量服务等级,分为0(最多一次)、1(至少一次)、2(恰好一次)。

(二)订阅主题

客户端通过订阅特定主题来接收相关消息。订阅操作可以指定QoS等级,代理会按照该等级向订阅者推送消息。

(三)发布消息

客户端将消息发布到指定的主题。发布时需要指定主题名称、消息内容和QoS等级。

(四)消息接收与处理

订阅者接收到代理推送的消息后,可以对消息进行处理,例如解析JSON数据、更新UI界面等。

(五)断开连接

当客户端不再需要通信时,可以断开与MQTT代理的连接。

三、代码示例

以下是使用Python的paho-mqtt库实现MQTT发布和订阅的示例代码:

(一)订阅者代码

pythonimport paho.mqtt.client as mqtt # 定义连接回调函数def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) # 订阅主题 client.subscribe("home/livingroom/#") # 使用通配符订阅多级主题 # 定义消息接收回调函数def on_message(client, userdata, msg): print(f"Received message on topic {msg.topic}: {msg.payload.decode()}") # 创建MQTT客户端实例client = mqtt.Client() # 设置回调函数client.on_connect = on_connectclient.on_message = on_message # 连接到MQTT代理client.connect("broker.hivemq.com", 1883, 60) # 启动网络循环,处理网络消息和回调函数client.loop_forever()

(二)发布者代码

pythonimport paho.mqtt.client as mqttimport time # 创建MQTT客户端实例client = mqtt.Client() # 连接到MQTT代理client.connect("broker.hivemq.com", 1883, 60) # 发布消息的函数def publish_message(topic, payload, qos=0): result = client.publish(topic, payload, qos) # result是一个元组,包含消息ID和中间队列对象 status = result[0] if status == 0: print(f"Message '{payload}' published to topic '{topic}'") else: print(f"Failed to publish message to topic '{topic}'") # 发布多条消息topics = ["home/livingroom/temperature", "home/livingroom/humidity", "home/kitchen/temperature"]payloads = ["25.5", "60", "22.0"] for topic, payload in zip(topics, payloads): publish_message(topic, payload, qos=1) # 使用QoS等级1发布消息 time.sleep(1) # 等待1秒,模拟不同时间点的发布 # 断开连接client.disconnect()

四、关键点说明

主题设计

层次结构:使用斜杠(/)分隔主题的各个层级,例如"home/livingroom/temperature"。这种层次结构便于对消息进行分类和管理。

通配符使用:+表示单级通配符,匹配任意一级主题;#表示多级通配符,必须放在主题末尾,匹配任意多级主题。例如,"home/+/temperature"可以匹配"home/livingroom/temperature"和"home/kitchen/temperature",而"home/#"可以匹配"home/livingroom/temperature"、"home/kitchen/light"等所有以"home/"开头的主题。

QoS等级选择

QoS 0:最多一次。消息发送后不等待确认,可能会丢失,适用于对消息可靠性要求不高的场景,如实时性要求较高但允许少量数据丢失的环境监测

QoS 1:至少一次。消息发送后会等待确认,如果未收到确认会重发,可能会重复接收消息,适用于对消息可靠性有一定要求但允许少量重复的场景,如智能家居中的设备控制指令。

QoS 2:恰好一次。消息发送和接收会经过多次握手确认,确保消息只被接收一次,但开销较大,适用于对消息可靠性要求极高的场景,如金融交易数据传输。

错误处理

在实际应用中,需要处理连接失败、消息发布失败等情况。例如,在连接代理时,可以检查返回的连接结果码,如果连接失败则进行重试或报警。

通过以上步骤和示例代码,你可以在MQTT中实现实体(主题)的发布和订阅,构建高效、可靠的物联网通信系统。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • MQTT
    +关注

    关注

    5

    文章

    721

    浏览量

    24786
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Air780EPM嵌入式开发:LuatOS下的MQTT通信实践

    Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅模式的轻量级通信协议。你可以把它想象成一个邮局系统: 发布者(Publisher) :就像寄信的人,把
    的头像 发表于 09-30 16:11 1609次阅读
    Air780EPM嵌入式开发:LuatOS下的<b class='flag-5'>MQTT</b>通信实践

    LuatOS嵌入式开发实战:Air780EPM与MQTT通信

    (Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅模式的轻量级通信协议。你可以把它想象成一个邮局系统: 发布者(Publisher) :就像
    的头像 发表于 09-29 18:10 290次阅读
    LuatOS嵌入式开发实战:Air780EPM与<b class='flag-5'>MQTT</b>通信

    【HZ-RK3568开发板免费体验】MQTT服务搭建与客户端移植

    的权限类型,具有往Topic中发布消息的权限。 订阅(Sub):操作Topic的权限类型,具有从Topic中订阅消息的权限。 MQTT协议的主题和消息 Figure ‑
    发表于 08-30 21:05

    物联网MQTT网关是什么

    ,适用于智能家居、工业物联网、环境监测等多个领域。 一、核心定义与定位 MQTT(Message Queuing Telemetry Transport)是一种基于发布/订阅模式的轻量级通信协议,专为低带宽、不稳定网络环境设计,
    的头像 发表于 08-29 15:24 656次阅读

    【创龙TL3562-MiniEVM开发板试用体验】--MQTT通讯

    本篇讲述开发板MQTT通讯。 MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布订阅(Publish/Subscr
    发表于 08-17 22:45

    【嘉楠堪智K230开发板试用体验】CanMV K230 MQTT通信

    Topic的权限类型,具有往Topic中发布消息的权限。 订阅(Sub):操作Topic的权限类型,具有从Topic中订阅消息的权限。 MQTT协议的主题和消息 Figure 1‑2
    发表于 08-16 23:39

    第二十三章 W55MH32 MQTT_OneNET示例

    本文讲解了如何在 W55MH32 芯片上实现 MQTT 协议并连接 OneNET 平台,通过实战例程展示了从准备工作、连接配置到消息订阅发布及接收处理的完整过程。文章详细介绍了
    的头像 发表于 07-24 14:59 696次阅读
    第二十三章 W55MH32 <b class='flag-5'>MQTT</b>_OneNET示例

    第二十二章 W55MH32 MQTT&amp;Aliyun示例

    本文讲解了如何在 W55MH32 芯片上实现 MQTT 协议并连接阿里云平台,通过实战例程展示了从准备工作、连接配置到消息订阅发布及接收处理的完整过程。文章详细介绍了
    的头像 发表于 07-24 14:17 697次阅读
    第二十二章 W55MH32 <b class='flag-5'>MQTT</b>&amp;Aliyun示例

    MQTT介绍

    的消息传输协议,近年来被广泛应用于智能家居、工业控制、车联网等场景。 MQTT 是一种基于发布/订阅(Pub/Sub)模式的轻量级消息协议,设计初衷是为低带宽、不稳定网络环境下的设备通信而生。它更像是广播电台:你
    的头像 发表于 07-14 09:34 3505次阅读
    <b class='flag-5'>MQTT</b>介绍

    KaihongOS操作系统:MQTT物联网通讯协议

    ): void 订阅mqtt发布消息事件。使用callback方式作为异步方法。 系统能力:SystemCapability.Communication.khNetStack 参数: 参数名类型必填
    发表于 05-08 07:51

    KaihongOS多实例MQTT接口

    : Callback<{messageId: number}>): ResponseCode; 订阅mqtt发布消息事件。 系统能力
    发表于 05-08 06:58

    《DNESP32S3使用指南-IDF版_V1.6》第五十五章 基于MQTT协议连接阿里云服务器

    下载验证 55.1MQTT协议简介(1)MQTT是什么?MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/
    发表于 03-18 09:22

    MQTT物联网平台有哪些?有哪些功能?

    MQTT(Message Queuing Telemetry Transport)是一种基于客户端-服务器架构的发布/订阅模式的消息传输协议,它广泛应用于机器与机器的通信(M2M)以及物联网环境
    的头像 发表于 03-15 14:23 1222次阅读
    <b class='flag-5'>MQTT</b>物联网平台有哪些?有哪些功能?

    基于MQTT协议的车云通信设计

    Queuing Telemetry Transport)是由OASIS发布的应用层协议,采用订阅/发布的通信模式,下层基于TCP/IP进行传输。该标准在工业物联网、车联网等领域有广泛应用。
    的头像 发表于 01-08 10:24 1721次阅读
    基于<b class='flag-5'>MQTT</b>协议的车云通信设计

    百问MQTT协议分析 - MQTT简述及协议报文格式组成

    16.1 mqtt协议介绍 16.1.1 概述 ​MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议。它的设计思想是轻巧、开放、简单、规范,易于实现。这些特点使得它对很多场景
    发表于 12-13 09:29