在MQTT中,主题是一种由代理(broker)用来过滤消息的字符串。客户端发布(publish)消息到特定的主题,而其他客户端订阅(subscribe)这个主题来接收消息。主题是大小写敏感的,并且可以包括多个层级,层级之间使用斜杠(/)分隔。
例如,一个关于温度的主题可能是home/livingroom/temperature
。
这里是设置和使用MQTT主题的基本步骤:
发布消息到主题
当客户端想要发送消息到一个特定的主题时,可以使用mosquitto_pub
命令行工具,语法如下:
mosquitto_pub -h [服务器地址] -t [主题] -m [消息内容]
例如,要发布消息"25"到主题"home/livingroom/temperature",可以这样做:
mosquitto_pub -h localhost -t "home/livingroom/temperature" -m "25"
订阅一个主题
若要接收发布到特定主题的消息,需要订阅这个主题。可以使用mosquitto_sub
命令行工具,语法如下:
mosquitto_sub -h [服务器地址] -t [主题]
例如,要订阅主题"home/livingroom/temperature",可以这样做:
mosquitto_sub -h localhost -t "home/livingroom/temperature"
主题通配符
MQTT还支持两种通配符,用于订阅匹配多个主题的模式:
- 单层级通配符
+
:可以匹配任何一个层级的值。例如,home/+/temperature
可以匹配home/livingroom/temperature
和home/kitchen/temperature
。 - 多层级通配符
#
:可以匹配多个层级的值。例如,home/#
可以匹配home/livingroom/temperature
和home/kitchen/light
。
注意事项
- 主题不能包含空格。
- 主题不能包含通配符
+
和#
之外的特殊字符。 - 主题应该具有意义,易于理解,以便于管理。
一旦设置了主题,你就可以开始发布和接收消息了。这对实时数据通讯和物联网(IoT)应用尤其有用。
关于一些疑问:mqtt需要提前设定主题吗?
解答:
在MQTT协议中,主题的设计是动态的,不需要提前设定。客户端可以随时订阅任何主题,而不管是否已经有消息发布到该主题。
当一个客户端向某个特定的主题发布消息时,MQTT代理(broker)会查找所有订阅了该主题的客户端,并将消息分发给它们。如果在消息被发布时没有任何客户端订阅该主题,那么这个消息将不会被传递给任何客户端,并且一般情况下会被丢弃。
因此:
- 客户端可以随时订阅一个主题,无论该主题上是否有活跃的发布者。
- 如果客户端在消息被发布之前已经订阅了相应的主题,那么它会收到所有后续发布到该主题的消息。
- 如果客户端在消息发布之后订阅一个主题,它将不能收到在它订阅之前发布的消息,除非使用了消息队列服务(如MQTT的保留消息或持久会话)。
这意味着,订阅操作不依赖于主题上是否有消息流动,客户端可以预先订阅它们关心的主题来等待未来的消息。这是MQTT设计中灵活和高效的一个方面,特别适用于物联网(IoT)环境,其中设备可能会不规律地上线并发送数据。