通过 MQTT 控制 arduino

物联网 MQTT 树莓派 阿杜伊诺
2021-06-02 02:49:17

我使用了几个 arduino 板,现在我需要通过 Web 界面控制它们。

通过网络界面,我想激活 GPIO。

我有两个想法:

  1. 每个 arduino 都充当 Web 服务器,我可以通过 Arduino 网页控制 GPIO。基本上每个 arduino 有一个浏览器选项卡。
  2. 使用 MQTT 协议与 arduino 板交换消息。此外,我认为使用树莓作为 Web 服务器和 MQTT 代理。每个 arduino 板都订阅了一个特定的主题,通过一个网页,托管在 raspberry 上,我可以控制 Arduino GPIO。

第一个解决方案我非常快速和简单。

关于第二个选项,我不知道如何通过网页发送 MQTT 消息。我读到我需要使用 Websocket。这样对吗?我需要用 Javascript 编写代码还是什么?

我的第二个问题是:MQTT 代理能否同时通过 Websocket 管理 MQTT 和 MQTT?否则我还需要在 Arduino 上使用 Websocket。

另一种选择是构建一个带有 GUI 的 Python 脚本,允许将 MQTT 消息发送到 Arduino。

有没有最好的办法?

谢谢您的帮助!

1个回答

你写的一切在我看来都是合理的。

MQTT 传统上通过 TCP 1运行,但您的浏览器不允许网页打开原始 TCP 套接字。有一些提议允许这样做,但我怀疑它们是否会很快实施。因此,您的浏览器无法连接到仅支持 TCP 连接的 MQTT 代理。

正如您所确定的,解决方案是使用WebSocket — 这些受浏览器支持,因此可以使用一些 JavaScript 代码通过网页连接到 MQTT 代理。HiveMQ 有一个您可以使用的示例,或者您可以尝试使用诸如MQTT.js 之类的库,它支持与 MQTT 代理进行 WebSocket 通信。

大多数代理——以及我所知道的——不会关心客户端是 WebSocket 客户端还是 TCP 客户端。您可以愉快地将两者都连接到一个代理,并且您可以在 Stack Overflow 2找到有关如何配置 Mosquitto 代理的说明

至于最好的方法……这取决于你。如果您对 JavaScript 感到满意,那么使用它就没有问题。如果 Python 更简单,那么就这样做(您不需要以这种方式设置 WebSockets 支持)。如果您不太关心 UI,您甚至可以只使用预先构建的客户端软件。


1 MQTT 3.1.1 也允许 TLS 或 WebSocket 连接;参见规范的 4.2 节有一个变体MQTT-SN,它放宽了对 TCP 的要求。无论哪种方式,您可能都不会为您的用例担心 MQTT-SN。

2 请注意,在 Windows 上,Mosquitto 构建没有启用 WebSocket 支持如果你想在 Windows 上使用它,你需要自己构建 Mosquitto。或者,您可以尝试不同的经纪人,该经纪人不会以这种方式限制您。