Micropython环境M5Stack ATOM Lite发送HTTPS请求后后续请求失败排查
根因分析
你遇到的是Micropython TLS会话内存泄漏问题,错误中的MBEDTLS_ERR_MPI_ALLOC_FAILED明确指向mbedtls加密库申请大数运算内存失败。
你的代码未显式释放请求返回的响应对象,导致第一次HTTPS请求占用的TLS上下文、加密缓冲区、RSA运算内存没有被回收。M5Stack Atom Lite本身RAM资源非常有限,第二次请求发起时没有足够内存完成TLS握手的RSA校验步骤,因此触发报错。
HTTP请求不需要TLS加密运算,内存占用极低,所以不会触发该问题。
修复方案
1. 核心修复:每次请求后显式关闭响应对象
不管请求成功还是异常,都要调用req.close()释放连接占用的所有资源,修改后代码如下:
import gc # 内存紧张时可添加 if (pin1.value()) == True: if uart1.any(): req = None try: # gc.collect() # 内存紧张时可在请求前手动触发垃圾回收 req = urequests.request(method='POST', url='https://my-server.com/my-endpoint', json={'requestCode':'yadayada'}) if req.status_code == 200: rgb.setColorAll(0x00ff00) rgb.setBrightness(100) wait_ms(1500) rgb.setBrightness(0) else: rgb.setColorAll(0xff0000) rgb.setBrightness(100) wait_ms(1500) rgb.setBrightness(0) except Exception as e: print("请求错误:", e) # 可保留用于排查问题 finally: # 无论请求成功失败都释放资源 if req is not None: req.close() wait_ms(2)
2. 可选优化(内存不足时可启用)
- 请求前调用
gc.collect()手动清理闲置内存 - 公网可信任域名可添加参数
verify=False关闭证书校验,减少校验环节内存开销(不建议不可信环境使用) - 升级到最新版Micropython固件:部分旧版本mbedtls绑定存在已知内存泄漏问题,新版本已修复
验证方法
修改完成后连续发起10次以上HTTPS请求,若不再报错说明资源释放逻辑生效。
内容的提问来源于stack exchange,提问作者astriffe
相关产品推荐
相关产品推荐

