如何将图像从ESP32 CAM发送到IoT核心版?

时间:2020-09-29 17:06:19

标签: google-cloud-platform iot esp32

我需要系统安全。

我厌倦了使用base64对图像进行编码并将字符串通过MQTT发送到Iot Core。然后使用云函数解码字符串,最后将解码后的图像存储在Google Cloud Storage中。问题在于MQTT中消息的大小有限。

使用云功能然后在Google Cloud Storage中存储并不十分安全,任何人都可以访问该URL,并且我失去了对所有ESP32CAM通信的控制权。

我错过了什么吗?有没有一种真正安全的方法将文件从IoT Core发送到Google Cloud Storage?

谢谢

3 个答案:

答案 0 :(得分:2)

IoT Core不应该用于传输大斑点。

但是,您可以利用IoT Core与设备之间的安全连接将凭证发送到设备以安全地访问GCS。

创建一个对GCS存储桶具有仅写访问权限的服务帐户。 通过IoT核心将该服务帐户的密钥传递给设备(例如,通过配置更改) 然后,设备可以使用该密钥安全地连接到GCS并上传图像。

根据您的首选项和特定用例,您可以随时旋转密钥以访问GCS,也可以根据需要进行细粒度的设置(所有设备一个密钥,每个设备一个密钥,... )

答案 1 :(得分:1)

我完成此操作的方法是将图像分解为256K包(好吧,255K大小,带有8个字节的标头,这是一个整数,表示从Pub / Sub开始应在另一端重新组装的顺序)不保证可以订购)。

@rbarbero的答案是另一个不错的答案,您可以在此发送证书直接与GCS对话。

另一种实现方法是让设备与功能更强大的本地设备通信,该本地设备将服务凭证直接发送到GCS,而完全绕过IoT Core。

答案 2 :(得分:0)

无需对base64进行编码,并且可以调整pubsub 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将其拼接回视频。