本人在一次项目中由于使用到了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
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 mqttclient = mqtt.Client()
# 链接代理服务器,ip为本机ip,端口1883为emqx代理服务器默认端口,链接超时设置为600s
client.connect('127.0.0.1', 1883, 600)
while True:# 利用循环持续不断发布同一主题client.publish('fifa', payload='amazing', qos=0)
(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 mqttdef 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')
4、修复paho-mqtt源码在重建链接时丢失订阅问题
找到项目环境下paho/mqtt/client.py文件,如图:
双击打开client.py文件,找到loop_forever函数
loop_forever函数中此处添加该段代码:
5、启动订阅程序和发布程序就可以了,不会再出现丢失订阅主题的问题了。