本文共 2375 字,大约阅读时间需要 7 分钟。
2020年5月11日
网络层接口优化及SSL支持实现
在之前的网络层优化工作基础上,我修复了HTTP/HTTPS请求处理中的EOF问题,导致请求超时时间过长。现将SSL支持添加到MicroPython项目中,基于mbedtls实现了USSL模块。
USSL模块的工作原理
USSL模块建立在MicroPython网络架构的socket模块上,通过继承抽象Stream接口,提供了socket功能的扩展,支持HTTPS访问。使用mbedtls实现SSL协议,核心流程如下:
实现细节
在MaixPy项目中,针对k210芯片进行了如下配置:
if(1 OR CONFIG_MICROPY_SSL_MBEDTLS) list(APPEND ADD_INCLUDE "${mpy_core_dir}/lib/mbedtls/include") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DMBEDTLS_CONFIG_FILE='\"${mpy_port_dir}/src/mbedtls/include/mbedtls_config.h\"'") append_srcs_dir(ADD_SRCS "port/src/mbedtls") append_srcs_dir(ADD_SRCS "core/lib/mbedtls/library") list(REMOVE_ITEM ADD_SRCS "${mpy_core_dir}/lib/mbedtls/library/net_sockets.c")endif() 解释:
解决方案
针对mbedtls熵源问题,实现了硬件随机数生成器:
#include#include #include "rng.h"int os_get_random(unsigned char *buf, size_t len) { int i, j; unsigned long tmp; for (i = 0; i < ((len + 3) & ~3) / 4; i++) { tmp = rng_get() + systick_current_millis(); for (j = 0; j < 4; j++) { if ((i * 4 + j) < len) { buf[i * 4 + j] = (uint8_t)(tmp >> (j * 8)); } else { break; } } } return 0;}int mbedtls_hardware_poll(void *data, unsigned char *output, size_t len, size_t *olen) { int res = os_get_random(output, len); *olen = len; return 0;}
针对SSL连接EOF问题,通过延迟调整解决:
void mbedtls_ssl_set_bio(mbedtls_ssl_context *ssl, void *p_bio, mbedtls_ssl_send_t *f_send, mbedtls_ssl_recv_t *f_recv, mbedtls_ssl_recv_timeout_t *f_recv_timeout) { ssl->p_bio = p_bio; ssl->f_send = f_send; ssl->f_recv = f_recv; ssl->f_recv_timeout = f_recv_timeout;} 测试与优化
测试使用以下代码:
from ussl import SSLContextimport socketdef main(): ctx = SSLContext() with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: ai = socket.getaddrinfo('google.com', 443) s.connect(ai[0][-1]) s = ctx.wrap_socket(s) s.send(b'GET / HTTP/1.1\r\n\r\n') print(s.recv(4096))if __name__ == '__main__': main() 问题与解决
-0x0034错误:
-0x7280错误:
最终优化
针对ESP32和K210芯片进行了性能测试,HTTPS访问速度已优化至预期范围。建议在实际应用中根据网络环境调整延迟参数。
总结
通过对网络层接口优化和SSL模块实现,成功支持了HTTPS访问。未来将进一步优化mbedtls配置和增加更多SSL功能,以提升性能和稳定性。
转载地址:http://xnbyz.baihongyu.com/