我需要系统安全。
我厌倦了使用base64对图像进行编码并将字符串通过MQTT发送到Iot Core。然后使用云函数解码字符串,最后将解码后的图像存储在Google Cloud Storage中。问题在于MQTT中消息的大小有限。
使用云功能然后在Google Cloud Storage中存储并不十分安全,任何人都可以访问该URL,并且我失去了对所有ESP32CAM通信的控制权。
我错过了什么吗?有没有一种真正安全的方法将文件从IoT Core发送到Google Cloud Storage?
谢谢
答案 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将其拼接回视频。