我们将了解ESP8266模块如何通过消息队列遥测传输(MQTT)相互通信。
MQTT术语
已经使用了诸如中央代理,主题,发布,订阅之类的术语,因此现在该用类似于邮局的方式来解释它们了,消息是报纸或杂志:
- 代理:这是一个接收客户端消息的软件应用程序,并根据订阅者的请求路由消息。
- 客户端:它是一种可以发布消息或可以接收消息的设备,或两者兼而有之。
- 主题:这是一个字符串,代理使用该字符串来过滤每个连接的客户端的消息。 它由客户端在订阅请求中发送给代理,以表达接收其他客户端发布的消息的愿望。 由客户端在将消息发布到订阅了同一主题的任何其他客户端时发送。
- 发布:在特定主题上向另一个客户端发送消息(杂志)的操作。
- 订阅:通知代理有兴趣接收其他客户在该主题上发布的将来消息的操作。 客户可以订阅多个主题。
- 退订:客户端告诉代理不要将消息发送到指定主题的操作。
由于MQTT的一个特点是灵活的订阅主题,因此让我们看一下主题的形成方式。主题由使用/作为主题级别分隔符的层次结构级别组成。
例如
- 62/livingroom/temperature
- 456733-a55h56-667743/battery
注意:主题区分大小写。
主题通配符
如果通过代理将数据发布到另一个客户端,则必须指定完整的主题名称:要接收消息,客户端可以使用通配符级别订阅主题。通配符为单级+和多级#:
- 单级+
- 在主题的订阅级别中使用+表示代替+可以是任何值。
- 如果要构建显示面板来显示房屋的温度,则可以构建模块来读取每个房间的温度,并将其发布到以下主题中:
myHouse/groundFloor/livingroom/temperature
myHouse/groundFloor/kitchen/temperature
- myHouse/firstFloor/bedroom/temperature和显示模块将订阅:myHouse/groundFloor/+/temperature
- 每次位于底层的温度模块发布有关其主题的消息时,显示模块都会收到该消息,因此无需订阅每个主题,但它不会接收来自以下主题的数据:
myHouse/groundFloor/livingroom/humidity
myHouse/groundFloor/kitchen/light
- 多级#
- 在订阅的主题级别的客户端中使用#将接收该级别以下的所有消息
- 如果显示面板正在订阅主题
- myHouse/groundFloor/#表示它将接收以myHouse / groundFloor开头的主题上发布的所有消息。
- 如果客户订阅#,则该主题将接收该代理中发布的所有消息。
- 特殊主题$
- 如果要监视代理的内部统计信息,则需要订阅$ SYS主题。
- 以下是你获得的示例
Mosquitto代理
Eclipse Mosquitto TM是一个开源MQTT代理,它实现了MQTT v3.1和MQTT v.3.1.1标准,并提供了一种轻量级的方法来传输消息,从而允许发布和订阅低功耗传感器,移动设备,嵌入式计算机和微型计算机和控制器。
您可以直接从Linux存储库发行版中,在Raspberry Pi上,AWS实例上或VirtualBox Linux实例上安装Mosquitto。 或者,如果您需要websockets的支持,则可以获取源代码并自己进行编译。
从Linux发行版本库安装:
- 首先升级到最新版本
sudo apt update && sudo apt upgrade
- 然后安装 Mosquitto
sudo apt install mosquitto
你将看到如下截屏
- 安装Mosquitto代理后,验证代理是否已启动,并按如下所示安装mosquitto-clients:
- 输入如下命令
sudo apt install mosquitto-clients
你将看到如下截屏
Mosquitto客户端带有三个非常重要的实用程序:
- mosquitto_sub:一个简单的mqtt客户端,它将订阅一个主题并打印接收到的所有消息
- mosquitto_pub:一个简单的mqtt客户端,它将在单个主题上发布消息并退出
- mosquitto_passwd:一种用于管理Mosquitto密码文件的工具
将它们中的任何一个与–help选项一起使用,例如mosquitto_sub --help将提供包含可用于测试代理的所有选项的完整列表。
安装后,Mosquitto作为服务启动,并侦听端口1883。要测试此初始安装,让我们订阅一个主题并在该主题上发布一条消息。
以下命令显示使用-t选项订阅主题:
mosquitto_sub-t livingroom/temperature
如下运行命令
订阅主题,观察:此命令假定代理在本地服务器上运行。 当您将Mosquitto部署到Internet虚拟专用服务器(VPS)进行订阅时,请添加-h以指定服务器实例的IP地址(使用ifconfig进行查找),以及端口-p 1884(如果您未使用默认的1883) 端口。在这种情况下,命令将是:
mosquitto_sub -h 46.102.34.87 -t livingroom/temperature
在另一个终端中,让我们发布关于同一主题livingroom/temperature的一些JSON格式的消息。 使用数次以下命令,然后查看消息:
mosquitto_pub -t livingroom/temperature -m {"t":27.4}
你将看到结果:
发送消息后,mosquitto_pub将退出。 如果要每秒发送一次值,请使用watch实用程序,其中-n 1是命令之间的秒数:
watch -n 1 mosquitto_pub -t livingroom/temperature -m {"t":27.4}
现在,您可以尝试在订阅主题上使用+,#,mosquitto_sub -t livingroom /#将为您提供命令发送的所有数据:
mosquitto_pub -t livingroom/temperature -m {"t":27.4}
mosquitto_pub -t livingroom/humidity -m {"h":68}
你将看到
并在主题中使用+,订阅所有温度主题:
mosquitto_sub - t myhouse/+/temperature
并从其他终端发送消息,例如:
mosquitto_pub -t myhouse/living/temperature -m {"t":25.6}
mosquitto_pub -t myhouse/kitchen/temperature -m {"t":27.1}
在您订阅的终端中,您将看到以下所有消息:
ESP8266使用MQTT
发布数据
接收数据
保护Mosquitto安全
详情参阅 - 亚图跨际