You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python Paho-MQTT的on_subscribe回调中获取订阅主题并关联mid?

实现方法

首先在你的类中新增一个字典,用于暂存订阅请求ID(mid)与对应主题列表的关联关系:

def __init__(self):
    # 保留原有初始化代码
    self.mid_to_topics = {}  # 存储mid到主题列表的映射

修改on_connect方法

在发起订阅请求前先整理主题列表,订阅成功后将mid和主题列表绑定存储:

def on_connect(self, client, userdata, flags, rc):
    if rc == 0:
        self.connected = True
        self.logger.info(f"Connected to MQTT broker with result code {str(rc)}")
        try:
            # 整理订阅主题元组列表
            subscribe_tuples = [(self.__topic1, self.__qos), (self.__topic2, self.__qos)]
            # 提取纯主题字符串列表
            topic_list = [t[0] for t in subscribe_tuples]
            
            # 执行订阅操作
            result, mid = self.mqttclient.subscribe(subscribe_tuples)
            if result == mqtt.MQTT_ERR_SUCCESS:
                # 关联mid与主题列表
                self.mid_to_topics[mid] = topic_list
                self.logger.info(f"Subscription request sent (mid: {mid}), topics: {', '.join(topic_list)}")
        except ValueError as e:
            self.logger.error(f"Failed to subscribe to topics: {', '.join(topic_list)}, error: {str(e)}")

修改on_subscribe方法

通过mid从字典中取出对应主题列表,结合granted_qos完成日志记录与关联存储:

def on_subscribe(self, client, userdata, mid, granted_qos):
    if mid in self.mid_to_topics:
        topic_list = self.mid_to_topics.pop(mid)  # 处理后移除条目,避免内存冗余
        # 遍历主题与授权QOS,逐一记录
        for topic, qos in zip(topic_list, granted_qos):
            self.logger.info(
                f"Successfully subscribed to topic: {topic}\n"
                f"Granted QOS: {qos}\n"
                f"Subscription mid: {mid}"
            )
        # 若需要长期存储mid与主题的关联,可将数据存入类的其他属性(如self.subscribed_topics)
    else:
        self.logger.warning(f"Received subscribe ack for unknown mid: {mid}")

关键说明

  • paho-mqtt批量订阅返回的单个mid对应整个批量请求,granted_qos的顺序与你传入的主题顺序完全一致,因此可以用zip完成主题与QOS的一一配对。
  • 使用pop移除字典中的mid条目是为了避免内存占用,若需要长期保留关联关系,可改为直接读取不删除。

内容的提问来源于stack exchange,提问作者EASameh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 21:33:02