如何在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
相关产品推荐
相关产品推荐

