如何将图像从 ESP32 CAM 发送到 IoT Core?
How to send images from ESP32 CAM to IoT Core?
我需要系统安全。
我厌倦了使用 base64 对图像进行编码并通过 MQTT 将字符串发送到 Iot Core。然后用云函数解码字符串,最后将解码后的图像存储在 Google Cloud Storage 中。问题是 MQTT 中的消息大小有限。
使用 Cloud Function 然后存储在 Google Cloud Storage 中并不真正安全,任何人都可以点击它 url 我失去了对所有 ESP32CAM 通信的控制。
我错过了什么吗?是否有真正安全的方式将文件发送到 Google Cloud Storage 从 IoT Core?
谢谢
不应该使用 IoT Core 来传输大 blob。
但是,您可以利用 IoT Core 和设备之间的安全连接将凭据发送到设备以安全地访问 GCS。
创建一个对您的 GCS 存储桶具有只写访问权限的服务帐户。
通过 IoT Core 将该服务帐户的密钥传递给设备(例如,通过配置更改)
然后设备可以使用该密钥安全地连接到 GCS 并上传图像。
根据您的偏好和特定用例,您可以随时轮换密钥以访问 GCS,或者根据需要使用权限(所有设备一个密钥,每个设备一个密钥,. ..)
我这样做的方法是将图像分成 256K 个包(好吧,255K-ish,带有一个 header 8 个字节,这是一个 int,代表它应该在另一端,因为 Pub/Sub 不能保证顺序)。
@rbarbero 的回答是另一个很好的答案,您可以在其中发送信用以直接与 GCS 对话。
另一种方法是让设备与更强大的本地设备通信,该设备直接向 GCS 提供服务凭证,并完全绕过 IoT Core。
无需 base64 编码,发布订阅 MQTT 缓冲区大小可调整。
我使用:
#include <PubSubClient.h>
...
void setup() {
...
boolean res = mqttClient.setBufferSize(50*1024); // ok for 640*480
if (res) Serial.println("Buffer resized."); else Serial.println("Buffer resizing failed");
...
}
void sendPic() {
...
if (fb->len) // send only images with size >0
if (mqttClient.beginPublish("test_loc/esp32-cam/pic_ms", fb->len + sizeof(long), false))
{
// send image data + millis()
unsigned long m = millis();
int noBytes;
noBytes = mqttClient.write(fb->buf, fb->len);
noBytes = mqttClient.write((byte *) &m, sizeof(long));
if (!mqttClient.endPublish())
{
// error!
Serial.println("\nError sending data.");
}
}
...
}
这里我发送 640*480 的图像,并在末尾附加当前的 millis() 值,以便通过 ffmpeg 将其拼接回视频。
我需要系统安全。
我厌倦了使用 base64 对图像进行编码并通过 MQTT 将字符串发送到 Iot Core。然后用云函数解码字符串,最后将解码后的图像存储在 Google Cloud Storage 中。问题是 MQTT 中的消息大小有限。
使用 Cloud Function 然后存储在 Google Cloud Storage 中并不真正安全,任何人都可以点击它 url 我失去了对所有 ESP32CAM 通信的控制。
我错过了什么吗?是否有真正安全的方式将文件发送到 Google Cloud Storage 从 IoT Core?
谢谢
不应该使用 IoT Core 来传输大 blob。
但是,您可以利用 IoT Core 和设备之间的安全连接将凭据发送到设备以安全地访问 GCS。
创建一个对您的 GCS 存储桶具有只写访问权限的服务帐户。 通过 IoT Core 将该服务帐户的密钥传递给设备(例如,通过配置更改) 然后设备可以使用该密钥安全地连接到 GCS 并上传图像。
根据您的偏好和特定用例,您可以随时轮换密钥以访问 GCS,或者根据需要使用权限(所有设备一个密钥,每个设备一个密钥,. ..)
我这样做的方法是将图像分成 256K 个包(好吧,255K-ish,带有一个 header 8 个字节,这是一个 int,代表它应该在另一端,因为 Pub/Sub 不能保证顺序)。
@rbarbero 的回答是另一个很好的答案,您可以在其中发送信用以直接与 GCS 对话。
另一种方法是让设备与更强大的本地设备通信,该设备直接向 GCS 提供服务凭证,并完全绕过 IoT Core。
无需 base64 编码,发布订阅 MQTT 缓冲区大小可调整。
我使用:
#include <PubSubClient.h>
...
void setup() {
...
boolean res = mqttClient.setBufferSize(50*1024); // ok for 640*480
if (res) Serial.println("Buffer resized."); else Serial.println("Buffer resizing failed");
...
}
void sendPic() {
...
if (fb->len) // send only images with size >0
if (mqttClient.beginPublish("test_loc/esp32-cam/pic_ms", fb->len + sizeof(long), false))
{
// send image data + millis()
unsigned long m = millis();
int noBytes;
noBytes = mqttClient.write(fb->buf, fb->len);
noBytes = mqttClient.write((byte *) &m, sizeof(long));
if (!mqttClient.endPublish())
{
// error!
Serial.println("\nError sending data.");
}
}
...
}
这里我发送 640*480 的图像,并在末尾附加当前的 millis() 值,以便通过 ffmpeg 将其拼接回视频。