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

标签 ssl mqtt esp32 aws-iot platformio

我目前正在开发一个 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/

相关文章:

micropython - ESP32 - 使用 MicroPython : How to update clock after reboot?

python - 如何在 flask 中使用 HTTPS 运行本地主机?

azure - 如何使azure应用程序服务信任OnPrem CA颁发的证书?

mysql - MQTT esp8266 client.subscribe() 不起作用

ssl - nodeMCU TLS 证书错误

c - 将字符串映射到枚举值

arduino - ESP32 服务中断例程的速度有多快?

ssl - 无法使用 Wireshark 解密 HTTPS 流量

python - 如何在第三方 python 库中禁用 SSL 验证?

node.js - 将消息从 AWS Lambda 发布到 AWS IoT