MQTT:无法订阅自己的$topic

MQTT:无法订阅自己的$topic,mqtt,Mqtt,我目前正在运行几个MQTT IOT设备(MQTT硬件:raspberry pi 2,MQTT代理:Mosquitto,设备主要是ESP8266)。作为固件,我运行的是esp8266 HOMI固件的定制混合。这几个月来效果不错,但现在我面临一个关于$topics使用的问题 举个简单的例子,我的设备将其联机状态发布到一个主题:home/device/$online,当设备断开连接时,will消息将确保该主题变为false 运行此命令时,我可以看到该主题(以及其他主题): 所以这个主题就在那里,而且确

我目前正在运行几个MQTT IOT设备(MQTT硬件:raspberry pi 2,MQTT代理:Mosquitto,设备主要是ESP8266)。作为固件,我运行的是esp8266 HOMI固件的定制混合。这几个月来效果不错,但现在我面临一个关于$topics使用的问题

举个简单的例子,我的设备将其联机状态发布到一个主题:home/device/$online,当设备断开连接时,will消息将确保该主题变为false

运行此命令时,我可以看到该主题(以及其他主题):

所以这个主题就在那里,而且确实包含数据,太好了!因此,逻辑规定运行此函数应返回真实值:

mosquitto_sub -h <brokerIP> -u <username> -P <password>  -t home/device/$online -v
mosquitto_sub-h-u-P-t home/device/$online-v
输出: 没什么


但可悲的是,这两天以来没有返回任何内容。我能想到的唯一变化可能是对raspberry pi的更新。

$
是向shell(最有可能是bash)表示环境变量的字符,因此在执行命令之前,它将尝试使用存储在环境变量中的值展开
$online

由于
$online
很可能未设置为任何值,这意味着实际执行的是:

mosquitto_sub -h <brokerIP> -u <username> -P <password>  -t home/device/ -v
mosquitto_sub-h-u-P-t home/device/-v
您可以通过引用主题字符串来解决此问题,如下所示:

mosquitto_sub -h <brokerIP> -u <username> -P <password>  -t 'home/device/$online' -v
mosquitto_sub-h-u-P-t'home/device/$online'-v
mosquitto_sub -h <brokerIP> -u <username> -P <password>  -t home/device/ -v
mosquitto_sub -h <brokerIP> -u <username> -P <password>  -t 'home/device/$online' -v