rabbitmq - 带有 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
解决方案
您已经发布了一条带有有效负载0
和保留位集的消息。
这意味着当客户端订阅该主题时,带有保留位集的最后一条消息将被传递给该客户端。
您可以通过将设置了保留位和空负载的消息发布到同一主题来清除保留消息。您可以使用 mosquitto_pub 命令执行此操作,如下所示:
mosquitto_pub -t "channel/dostuff" -u 'user' -P 'password' -r -n
您应该确保通常用于发布消息的内容没有设置保留位。
推荐阅读
- powershell - Powershell 核心脚本仅在 pwsh 命令中运行
- azure - 将 Azure AD B2C 用户连接到我的数据库帐户的正确 Core 3.0 API 中间件?
- ssl - SSL 在所有主机上都失败。(SSL证书问题:证书链中的自签名证书)
- python - 如何为 .csv 文件中找到的每个重复条目创建一个新列表?
- python - 无法将超过 1000 条记录写入 HDFS 配置单元表 pyspark
- java - 5 次迭代后退出循环函数
- node.js - 即使选择器返回命中也无法单击元素
- java - 远程 Kafka 连接问题 - 代理可能不可用
- python - 根据时间戳间隔创建 csv 文件的数据框
- javascript - OnKeyPress 不触发