ESP32/Arduino 从 Cloud Firestore 检索数据的最"Firestore-native"方法?



我正在制作一个物联网设备的原型,该设备使用ESP32开发模块(Arduino框架(和Google Cloud Firestore作为其数据库。当你可以使用谷歌提供的SDK时(例如,在设计手机或网络应用程序时(,Firestore非常有效,但我发现要想找到一种将Firestore连接到ESP32的优雅方式要困难得多。

我目前的实现涉及一个谷歌云功能,其代码如下。它创建了一个REST API,我的ESP32可以每10秒左右调用一次。当ESP32命中API时,Cloud Function执行Firestore查询,并以JSON格式将结果返回给ESP32。

对于无法使用Firestore SDK的资源受限设备,有没有更好的方法可以做到这一点?每10秒盲目调用一次cloud函数的想法似乎很古怪。有人知道一个更";Firestore native";怎么做?有没有办法在ESP32上打开一个网络套接字/流,每当Firestore上更新数据时就会更新?

const admin = require('firebase-admin');
const express = require("express");
const cors = require("cors");
admin.initializeApp();
const db = admin.firestore();
const userApp = express();
userApp.use(cors({origin: true}));
userApp.get('/:id/updates', async (req, res) => {
const userDoc = await db.collection('users').doc(req.params.id).get();
const userSettingsData = userDoc.data().userSettings;

res.status(200).send(JSON.stringify({"userSettings": {...userSettingsData}}));
});
exports.user = functions.https.onRequest(userApp);

您可以使用Realtimedatabase REST API的流功能来解决每10秒重复调用一次的问题。只需创建一个云函数,更新实时数据库中的单个值(例如上次更新的时间戳(,并通过流在设备上侦听该更改。当发生变化时,调用cour cloud函数。这样,只有当事情发生时,它才会被称为。

谷歌规定的将嵌入式设备与云连接的方法是物联网核心和(在嵌入式方面(用于嵌入式C的谷歌云物联网设备SDK,它在它们之间提供了资源高效的MQTT管道。请注意,Espressif有一个用于ESP32的SDK端口,但它本身是用于ESP-IDF框架的,而不是Arduino。我有在ESP-IDF上使用它的第一手经验,我怀疑它也会很好地融入Arduino。

使用物联网核心与嵌入式设备对话需要在云端做一些额外的工作,即您需要在Firestore和物联网核心之间垂直查看您想要的数据。不过,这应该相当简单,例如使用pubsub。云端的文档和API集成通常都很好,所以我不会害怕这项工作。

如果您使用ESP-IDF框架进行开发,则可以使用此ESP-IDF组件通过HTTPS直接与Firestore REST API通信,而不需要云功能:

  • https://github.com/kaizoku-oh/firestore.git

最新更新