python - paho-mqtt 不会给我排队的消息
问题描述
使用 paho-mqtt 并尝试让它接收排队的消息。我使用的代理是 emqx 4.2.2,这是我的脚本:
from paho.mqtt.client import Client, MQTTv5
def on_connect(mqttc, obj, flags, rc, other):
print(" Session present: " + str(flags['session present']))
print(" Connection result: " + str(rc))
mqttc.subscribe([
('/message/1', 1)
])
def on_message(*args, **kwargs):
print("received a message")
client = Client(
client_id='test-client-id',
protocol=MQTTv5,
)
client.username_pw_set(
username="test-user-2",
password="test"
)
client.on_connect = on_connect
client.on_message = on_message
client.connect(
host='localhost',
port=1883,
keepalive=60,
clean_start=False,
)
client.loop_forever()
我现在去向经纪人发布一条消息:
mosquitto_pub -u test-user-2 -P test -t '/message/1' -m 'this is a message' -q 1 -V mqttv5
当客户端连接到代理时,它确实接收到消息,但鉴于我订阅的是 QoS 1 并且消息是使用 QoS 1 发布的,我希望如果我断开客户端与代理的连接,然后发布更多 QoS 1 条消息到该主题,然后使用相同的固定 client_id 将我的客户端重新连接到代理,然后我的客户端将收到在我的客户端离开时已排队的消息。好吧,这并没有发生,并且使用带有 -c 标志的 mosquitto_sub 模拟相同的功能一切都按预期工作,这让我问自己...... paho-mqtt 有问题吗?难道我做错了什么?
解决方案
在 MQTT v5 中,干净启动仅意味着会话是否在开始时被删除。要控制断开连接后会话持续多长时间,您需要设置会话到期间隔:
import paho.mqtt.properties as properties
...
connect_properties = properties.Properties(properties.PacketTypes.CONNECT)
connect_properties.SessionExpiryInterval = 3600
client.connect("localhost", 1883, 60, properties=connect_properties)
推荐阅读
- sql - 从交叉连接表内的函数返回的连接值
- libvirt - 如何更新 devstack 中的 upper_constraints.txt
- arduino - Adafruit Huzzah32 esp32 4mb flash SPIFFS 大小
- regex - Redshift POSIX 正则表达式顺序无关紧要
- javascript - 如何为子组件中的图像绑定 :src?
- ios - 无法更改静态单元格中 UILabel 的背景颜色
- javascript - 内存不足,无法打开此页面
- arrays - JSON序列化不适用于swift 4上的这个json?
- python - 如何将变量传递到 FLASK 中的另一条路由
- haskell - TemplateHaskell 似乎没有报告需要导入什么函数