编辑
我遇到过这个堆栈溢出帖子。万一链接失效:简而言之,这篇文章描述了一种使用 JWT 向后端和 mqtt 代理验证前端用户的方法。
虽然它并没有真正涵盖您的问题,但我认为它仍然很有用。具体来说,它解决了验证客户端和控制对主题的访问的问题。使用 mosquitto-go-auth 编译的 mosquitto 代理将是您如何实现帖子中描述的架构的一个示例。
在此架构上进一步构建,为了支持多个客户端,您可以开发某种从 mqtt 到其他协议的网关。例如,连接到您的 mqtt 代理并侦听有关主题newprotocol 的消息的后端服务。当它收到这样的消息时,它会将消息内容转换为您想要的协议。您的前端客户端那时只需要说 http 和 mqtt。
我也在尝试构建一个 DIY 家庭自动化系统,如果您能将这个问题与您的进度保持同步,我将不胜感激。
话虽如此,我发现了一些有用的链接,您可能也会发现它们很有用:
文章的要点是:
本质上,您从一个普通的 REST API 开始,然后为 REST 端点添加 MQTT 消息,从而导致状态更改 (POST/PUT/PATCH/DELETE)。
然后添加到这种方法中,每当 IOT 设备更改状态时,将新状态发布到 REST 端点。
我试过的
我希望你能让我分享我对如何构建这样一个系统的想法,我也希望这对某人有用。我考虑构建这个系统的一种方法是拥有 3 个组件:客户端、REST-API 和 MQTT-Broker。
就我而言,我在浏览器中运行了一个 React 应用程序。它对 REST 后端进行 API 调用(即获取所有 IOT 设备、向 IOT 设备发布新消息等)。后端处理身份验证、与代理的 PUB/SUB 消息传递(即处理 IOT 设备状态更改、找出存在哪些 IOT 设备等)以及来自 react 应用程序的任何消息。
但是,我遇到了这种方法的问题。在使用无状态协议(在本例中为 HTTP)时,您如何让 React 应用程序知道 IOT 设备的状态发生变化?我想过使用 websockets 将更改传输到 react 应用程序,但我最终没有实现它并回到绘图板。这就是我现在的样子。另一个问题是我会限制自己对每个 IOT 设备使用 MQTT。但是如果设备不使用 MQTT 呢?
Redis
Kalyanswaroop 的回答非常有见地。我对redis了解不多,但听起来很有趣。我们可以使用 redis 的消息传递系统,而不是使用 MQTT 作为唯一协议。IOT 设备将消息发布到 redis 的消息队列中,而不是直接发布到 REST-API。来自各种协议的所有消息都存储在数据库中。然后 API 只需要与数据库和任何客户端对话,例如反应应用程序。
要将数据库中的更改实时传输到客户端,您可以使用 websockets。