使用 AWS IoT 将 100MB 以上的文件从 AWS 云流式传输到物体
Stream 100MB+ file from AWS Cloud to the Thing using AWS IoT
场景是这样的。我们有一个 IoT device/thing,在设置时需要一些驱动程序和固件。有些文件很大,比如 100MB 以上,在这些情况下,我们不想一次性发送数据,而是希望将数据从 AWS 云流式传输到 THING。
我一直在寻找实现它的方法,并且有一个像 IoT Streaming 服务这样的选项,但是没有关于如何在 Nodejs 中实现它的基本代码文档。我是 nodejs 和 IoT 方面的新手,所以如果有人可以向我指出一些帮助文档或网站以了解如何操作,那就太好了!
使用下面的代码,我不能传输超过 10MB。
iot.createStream(params, function (err, data) {
if (err) return err;
return data;
})
我们得到的错误:
流中流文件0的文件大小221413376超过文件大小限制
createStream 的参数:
files: [ /* required */
{
fileId: 0,
s3Location: {
bucket: bucket, /* required */
key: params.s3key
}
}
],
roleArn: config.jobRoleARN, /* required */
streamId: uuidv1(), /* required */
description: 'Get file as Stream'
}```
This documentation from AWS 建议流式传输的最大文件大小为 24MB。如果是这种情况,您可能需要尝试将文件分解成更小的部分,或者看看是否可以将其压缩到合理的大小(或两者)。
仅补充说明:根据您对返回数据的处理方式,您可能希望利用管道和 transform/writable 流来利用 node's backpressure handling mechanisms,如下所示:
const request = iot.createStream(params);
const out = fs.createWriteStream('/path/to/outfile.jpg');
request.createReadStream().pipe(out);
单独处理文件 I/O 时,这可能没什么大不了的,因为文件输出 应该 比通过网络传入的数据更快,但它尽可能使用管道并避免直接监听传入流的 'data' 事件的情况仍然是一个好习惯。
场景是这样的。我们有一个 IoT device/thing,在设置时需要一些驱动程序和固件。有些文件很大,比如 100MB 以上,在这些情况下,我们不想一次性发送数据,而是希望将数据从 AWS 云流式传输到 THING。
我一直在寻找实现它的方法,并且有一个像 IoT Streaming 服务这样的选项,但是没有关于如何在 Nodejs 中实现它的基本代码文档。我是 nodejs 和 IoT 方面的新手,所以如果有人可以向我指出一些帮助文档或网站以了解如何操作,那就太好了!
使用下面的代码,我不能传输超过 10MB。
iot.createStream(params, function (err, data) {
if (err) return err;
return data;
})
我们得到的错误:
流中流文件0的文件大小221413376超过文件大小限制
createStream 的参数:
files: [ /* required */
{
fileId: 0,
s3Location: {
bucket: bucket, /* required */
key: params.s3key
}
}
],
roleArn: config.jobRoleARN, /* required */
streamId: uuidv1(), /* required */
description: 'Get file as Stream'
}```
This documentation from AWS 建议流式传输的最大文件大小为 24MB。如果是这种情况,您可能需要尝试将文件分解成更小的部分,或者看看是否可以将其压缩到合理的大小(或两者)。
仅补充说明:根据您对返回数据的处理方式,您可能希望利用管道和 transform/writable 流来利用 node's backpressure handling mechanisms,如下所示:
const request = iot.createStream(params);
const out = fs.createWriteStream('/path/to/outfile.jpg');
request.createReadStream().pipe(out);
单独处理文件 I/O 时,这可能没什么大不了的,因为文件输出 应该 比通过网络传入的数据更快,但它尽可能使用管道并避免直接监听传入流的 'data' 事件的情况仍然是一个好习惯。