如何让 MQTT Broker 和 REST API 通信?

物联网 MQTT https 休息 API
2021-06-13 07:16:39

我对物联网和物联网协议还是很陌生,所以请原谅我的无知。

我正在尝试创建一个家庭自动化系统来控制灯光、读取室温等。

用户应该能够通过使用 React Native 开发的移动客户端与物联网设备进行交互。我可以在该平台上实现 MQTT 客户端吗?是的,但我认为在移动客户端和 IoT 设备之间使用 REST API 会更方便。通过这种方式,我可以轻松管理用户创建的例程,添加身份验证以控制某些设备并实现许多其他功能。此外,某些设备可能使用不同的协议,所以我会让我的 API 来处理这个问题,而不是在前端实现多个客户端。

我已经找到了“桥接”MQTT 和 HTTP 的方法,将 HTTP 帖子转换为 MQTT 发布,但这并不是一个完美的解决方案。我想使用我的服务器作为 MQTT 主题的订阅者,并通过 HTTP 向移动客户端提供信息,以及在请求到达或预定例程被触发时发布主题。我怎样才能做到这一点?

我最好在连接到本地网络的同一设备(RaspberryPi)上运行 MQTT 代理和 REST API。

2个回答

这是一种方法:
您系统的实际业务逻辑将具有特定的 API。该 API 需要有一些 doXYZ 方法、一些 getXYZ 方法和一些 onXYZ 事件。
我假设您要问的是“我如何通过 MQTT 和基于 HTTP 的传输使其可用?”
如果你在云中做一些事情,我会说看看一些技术,比如AWS AppSync 添加了实时增强功能,纯 WebSockets 支持 GraphQL 订阅

然而,你想要做到这一切!我建议仍然考虑在云上执行此操作。但是如果你想在没有互联网的洞穴中开发一些东西,我会建议使用像 Redis 这样的 pubsub 系统,它可以处理状态和 HTTP 方面,然后构建 MQTT 发布。将消息格式设为 JSON 以使其更容易。
在你做这一切之前,我会请你认真考虑一些可能性:

  1. 查看基于云的系统,例如我上面提到的系统。
  2. 看看你是否可以用一个界面做所有事情(比如 MQTT),看看你是否可以为你的前端找到一些好的库。
  3. 除了 MQTT,您可以使用 Redis 公开的发布订阅机制来做事吗?
  4. 看看 NodeRed 是否满足您的需求。

编辑

我遇到过这个堆栈溢出帖子。万一链接失效:简而言之,这篇文章描述了一种使用 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。