ESP32-WROOM-32UE运行Toit代码连接MQTT Broker失败求助
问题根因
ESP32-WROOM-32UE的可用SRAM远小于PC端模拟器,带双向认证的TLS握手默认需要申请较大的缓冲区,内存不足时就会抛出MALLOC_FAILED错误。
解决方案
- 缩小TLS套接字的收发缓冲区大小,默认缓冲区为16KB,可下调到2-4KB适配ESP32内存,创建tls_socket时新增
--rx_buffer_size和--tx_buffer_size参数即可,修改后代码示例:
tls_socket := tls.Socket.client socket --server_name=HOST --root_certificates=[SERVER_CERT] --certificate=tls_cert --rx_buffer_size=4096 --tx_buffer_size=4096
- 优化证书体积降低内存占用:
- 根证书仅保留当前MQTT broker对应的必要根CA,不要传入全量CA证书链
- 优先使用ECDSA类型的客户端证书和密钥,相比RSA2048证书可减少近一半的内存占用
- 调整代码执行顺序,TLS握手完成前不要初始化大内存对象、不要启动额外任务,当前代码的任务启动逻辑在握手完成之后,无需调整
- 若调整后仍报错,可进一步下调缓冲区到2048字节,也可在项目
package.yaml中上调应用堆内存配额:
entrypoint: tls_connect.toit name: mqtt_tls version: 1.0.0 platforms: esp32: memory: heap_size: 65536
内容的提问来源于stack exchange,提问作者Frederik Rasmussen
相关产品推荐
相关产品推荐

