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

    文章

    747

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何用 MQTT 实现设备间通信(超简单实操版)

    用法。 先厘清核心逻辑:MQTT不支持设备直连互通,全程采用发布/订阅+云端Broker中转模式。所有设备只对接MQTT服务器,发消息的设备当发布
    发表于 04-28 13:51

    瑞芯微(EASY EAI)RV1126B mqtt

    1.MQTT简介MQTT(MessageQueuingTelemetryTransport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的“轻
    的头像 发表于 04-13 17:22 1251次阅读
    瑞芯微(EASY EAI)RV1126B <b class='flag-5'>mqtt</b>

    基于LuatOS的MQTT物联网通信全解

    MQTT通信架构,涵盖连接、订阅发布、重连等完整流程。 一、基于TCP/IP初步认识MQTT   今天我们讲的LuatOS MQTT是L
    的头像 发表于 01-29 19:42 443次阅读
    基于LuatOS的<b class='flag-5'>MQTT</b>物联网通信全解

    IO数采终端支持MQTT通信吗

    IO数采终端通常支持MQTT通信 ,尤其在物联网和工业物联网(IIoT)场景中,MQTT因其轻量级、低带宽占用和发布/订阅模式的优势,成为IO数采终端数据传输的常用协议。以下是具体分析
    的头像 发表于 12-09 14:31 770次阅读
    IO数采终端支持<b class='flag-5'>MQTT</b>通信吗

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

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

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

    (Message Queuing Telemetry Transport,消息队列遥测传输协议)是一种基于发布/订阅模式的轻量级通信协议。你可以把它想象成一个邮局系统: 发布者(Publisher) :就像
    的头像 发表于 09-29 18:10 752次阅读
    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 1410次阅读

    【创龙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

    完整指南:如何搭建树莓派MQTT代理服务器?

    什么是MQTT(消息队列遥测传输)?MQTT是一种轻量级的发布-订阅消息协议,专为受限环境和不可靠网络而设计。它最初由IBM在20世纪90年代末开发,因其简单性和在物联网生态系统中的高
    的头像 发表于 08-04 17:03 1151次阅读
    完整指南:如何搭建树莓派<b class='flag-5'>MQTT</b>代理服务器?

    GraniStudio :MQTT 协议的深度剖析

    在工业物联网(IIoT)的通信协议体系中,MQTT(Message Queuing Telemetry Transport)凭借其轻量级、发布 - 订阅模式和低带宽占用等特性,成为连接边缘设备与云端
    的头像 发表于 08-04 09:48 1279次阅读
    GraniStudio :<b class='flag-5'>MQTT</b> 协议的深度剖析

    第二十三章 W55MH32 MQTT_OneNET示例

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

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

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

    MQTT介绍

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