WHCSRL 技术网

paho.mqtt丢失订阅主题解决办法

本人在一次项目中由于使用到了mqtt协议,在网上找到其paho-mqtt的协议python开发工具包,在使用其编写发布订阅程序做测试时发现,订阅程序运行一段时间后丢失了订阅的主题,必须要重新建立链接才能继续订阅,因此,将我的解决方法记录在此,如若有人遇到和我相同问题,可以作为借鉴。

备注:本人测试用的mqtt代理服务器为emqx。

1、首先下载mqtt代理服务器(百度网盘链接):
https://pan.baidu.com/s/1xBa0yvc8QDl8oLREJcjlzQ
提取码: t35x
下载解压后控制台进入解压的文件夹下/bin文件夹,输入emqx.exe start启动mqtt代理服务器。,如下:在这里插入图片描述

2、安装paho-mqtt开发工具包

pip install paho-mqtt
  • 1

3、编写发布程序和订阅程序:
(1)发布程序mqtt_pub.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : LuBowen
# @Number  : 20210509
# @FileName  :mqtt_pub.py
# @Time      :2021/10/18 9:12
# @Software: PyCharm Community Edition
# @Version : Python3
# ====================================
import paho.mqtt.client as mqtt

client = mqtt.Client()
# 链接代理服务器,ip为本机ip,端口1883为emqx代理服务器默认端口,链接超时设置为600s
client.connect('127.0.0.1', 1883, 600)
while True:
    # 利用循环持续不断发布同一主题
    client.publish('fifa', payload='amazing', qos=0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

(2)订阅程序mqtt_sub.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Author  : LuBowen
# @Number  : 20210509
# @FileName  :mqtt_sub.py
# @Time      :2021/10/18 9:13
# @Software: PyCharm Community Edition
# @Version : Python3
# ====================================
import paho.mqtt.client as mqtt


def on_message(client, userdata, msg):
    # 这里用户可以对订阅的主题消息进行处理,我这里测试只做打印处理
    print("topic:{},payload:{}".format(msg.topic, msg.payload))


# 实例化客户端
client = mqtt.Client()

# 利用while循环保证在订阅丢失时重建链接
while True:
    # 消息处理程序
    client.on_message = on_message
    # 链接代理服务器
    client.connect('127.0.0.1', 1883, 600)
    # 订阅主题
    client.subscribe('fifa', qos=0)
    # 保持长连接
    client.loop_forever()
    print('reconnected')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

4、修复paho-mqtt源码在重建链接时丢失订阅问题
找到项目环境下paho/mqtt/client.py文件,如图:
在这里插入图片描述

双击打开client.py文件,找到loop_forever函数
在这里插入图片描述
loop_forever函数中此处添加该段代码:
在这里插入图片描述
5、启动订阅程序和发布程序就可以了,不会再出现丢失订阅主题的问题了。

推荐阅读