gpt4 book ai didi

ssl - ESP32-CAM 如何将大型二进制负载发布到 AWS IOT ssl mqtt 主题,测试了许多库但没有成功 :-(

转载 作者:行者123 更新时间:2023-12-04 22:36:14 24 4
gpt4 key购买 nike

我目前正在开发一个 ESP32CAM 项目,以便在 AWS IOT 主题上发布一些高分辨率 (UXGA) 摄像头捕获的图像。我已经成功发布了一些简短的 json 负载,这些负载具有不同 AWS IOT 证书保护主题的属性,但我遇到了一个恼人的问题,即对大负载执行与捕获二进制文件相同的操作。

我浏览了许多网站、论坛,测试了不同的库,例如 MQTT、PubSubClient、AsyncMQTTClient...但是我还没有找到适用于大负载的真正可行的解决方案> 大约 100KB 大小。

例如,使用 PubSubClient 库,我尝试使用 BeginPublish、write、endPublish 方案对二进制负载进行分段,如下所示:

bool publishBinary(const uint8_t *buffer,size_t len, const char *topicPubName)
{
Serial.print("publishing binary ["+(String)len+"] ...");
if (len == 0) {
// Empty file
Serial.println("Error : binary payload is empty!");
return(false);
}

if (!client.beginPublish(topicPubName,len,false)) {
Serial.println("MQTT beginPublish failed.");
return(false);
}
size_t max_transfer_size=80;
size_t n=0;
size_t size_send;
size_t offset=0;

while ((len-offset)>0) {
n=(len-offset);
if (n > max_transfer_size)
n=max_transfer_size;

size_send=client.write((const uint8_t *)(buffer+offset),n);
Serial.printf("%d/%d : %.02f %%\n",offset,len,(double)((100*offset)/len));
//Serial.println("n: "+(String)n+" - send: "+(String)size_send);
if(size_send != n) {
// error handling. this is triggered on write fail.
Serial.println("Error during publishing..."+(String)size_send+" instead of "+(String)n);
client.endPublish();
return(false);
} else {
offset+=size_send;
}
}
client.endPublish();
Serial.println("ok");

return(true);
}

客户端定义为PubSubClient客户端(net),其中net是带有经过验证的CA_cert、证书和私钥的WiFiClientSecure对象。

MQTT 连接运行良好,但当我尝试发布大型二进制有效负载时,函数片段会缓冲成 block 直到最后,但总是出现诸如 未知错误代码 (0050) 之类的错误或者当它成功发布时,只有一小部分有效负载被发布到目的地。在这种情况下,我的 jpeg 文件在负载所在的 S3 存储桶上被截断。

我不得不说,有时,我成功地发布了 65K 的有效负载,但就像运气一样......:-)

我在网上寻找了一些示例,但通常都是针对较小的有效负载。正如帖子中提到的,我已经测试了 PubSubClient 中的 Publish_P(...)...但结果相同,它在传输过程中中止。

我开始问自己这是否真的可以通过 mqtt 主题实现,或者我是否必须使用 lambda 创建一个 API 网关来处理如此大的负载。告诉我我错了:-)

如果您知道真正有效的大负载发布的良好解决方案,我将很高兴与您讨论:-)

谢谢!

最佳答案

#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");
...
}

我正在使用 50kB 缓冲区,它工作得很好,没有尝试过超出这个范围,但它应该也可以使用 100kB。

调整缓冲区大小后,像平常一样发布。

顺便说一句,setBufferSize 函数最近才添加到 IIRC。

关于ssl - ESP32-CAM 如何将大型二进制负载发布到 AWS IOT ssl mqtt 主题,测试了许多库但没有成功 :-(,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63891908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com