首页 > 解决方案 > 带有 MQTT 的 RabbitMQ 在连接时发送消息

问题描述

我正在使用 mqtt-launcher ( https://github.com/jpmens/mqtt-launcher ) 在收到带有有效负载“0”的某个 MQTT 消息时执行命令。

这是配置

logfile         = '/home/user/mqtt-launcher/logfile'
mqtt_broker     = 'broker'       # default: 'localhost'. If using TLS, this must be set to the domain name signed by$
mqtt_port       = 1883              # default: 1883
mqtt_clientid   = 'mqtt-launcher-1'
mqtt_username   = ''
mqtt_password   = ''
mqtt_tls        = None              # default: No TLS

topiclist = {

    # topic            payload value  program & arguments
    "channel/dostuff" : {
       '0' : [
          '/usr/bin/ssh', 
          '-i', 
          '/home/user/.ssh/privatekey', 
          'user@host',
          'script.sh'
          ]
    }
}

每次,我启动 python 脚本,shell 脚本都会执行两次。

但我希望它只执行一次,如果发送有效载荷为“0”的 MQTT 消息。

我通过清除它确保订阅时隐式创建的队列为空,然后启动 mqtt-launcher 但在程序连接后脚本仍然执行两次。

当我跑步时,user@localhost:~$ mosquitto_sub -h broker -p 1883 -t 'channel/dostuff' -v -u 'user' -P 'mysecurepassword'我得到channel/dostuff 0

我对蚊子不熟悉,但我认为这意味着我收到了一条消息,对吧?

我关闭了保留选项,重新启动了 openHAB 和 RabbitMQ,但仍然发送了消息。这是 openHAB mqtt.cfg:

broker.url=tcp://broker:1883
broker.user=openhab
broker.pwd=mysecurepassword
broker.qos=1
broker.retain=false
broker.async=false

标签: rabbitmqmqtt

解决方案


您已经发布了一条带有有效负载0和保留位集的消息。

这意味着当客户端订阅该主题时,带有保留位集的最后一条消息将被传递给该客户端。

您可以通过将设置了保留位和空负载的消息发布到同一主题来清除保留消息。您可以使用 mosquitto_pub 命令执行此操作,如下所示:

mosquitto_pub -t "channel/dostuff" -u 'user' -P 'password' -r -n

您应该确保通常用于发布消息的内容没有设置保留位。


推荐阅读