博客
关于我
关于 k210 的 micropython 添加 ussl 模块,实现 https 访问支持的那些事。
阅读量:441 次
发布时间:2019-03-06

本文共 2375 字,大约阅读时间需要 7 分钟。

2020年5月11日

网络层接口优化及SSL支持实现

在之前的网络层优化工作基础上,我修复了HTTP/HTTPS请求处理中的EOF问题,导致请求超时时间过长。现将SSL支持添加到MicroPython项目中,基于mbedtls实现了USSL模块。

USSL模块的工作原理

USSL模块建立在MicroPython网络架构的socket模块上,通过继承抽象Stream接口,提供了socket功能的扩展,支持HTTPS访问。使用mbedtls实现SSL协议,核心流程如下:

  • 通过socket获取网络信息,建立连接
  • 使用ssl.wrap_socket将普通socket转换为SSLsocket
  • 执行HTTPS请求
  • 实现细节

    在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头文件和库文件
    • 设置mbedtls配置文件
    • 排除net_sockets.c以避免重复实现

    解决方案

    针对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错误:

    • 熵源混乱导致mbedtls ctr_drbg_seed失败
    • 解决:使用硬件随机数生成器
  • -0x7280错误:

    • 延迟问题导致EOF异常
    • 解决:在socket.send后添加适当延迟
  • 最终优化

    针对ESP32和K210芯片进行了性能测试,HTTPS访问速度已优化至预期范围。建议在实际应用中根据网络环境调整延迟参数。

    总结

    通过对网络层接口优化和SSL模块实现,成功支持了HTTPS访问。未来将进一步优化mbedtls配置和增加更多SSL功能,以提升性能和稳定性。

    转载地址:http://xnbyz.baihongyu.com/

    你可能感兴趣的文章
    OpenCV与AI深度学习 | 基于YOLOv8的停车对齐检测
    查看>>
    OpenCV与AI深度学习 | 基于机器视觉的磁瓦表面缺陷检测方案
    查看>>
    Opencv中KNN背景分割器
    查看>>
    OpenCV中基于已知相机方向的透视变形
    查看>>
    opencv保存图片路径包含中文乱码解决方案
    查看>>
    opencv图像分割2-GMM
    查看>>
    OpenCV(1)读写图像
    查看>>
    OpenCV:概念、历史、应用场景示例、核心模块、安装配置
    查看>>
    Openlayers高级交互(10/20):绘制矩形,截取对应部分的地图并保存
    查看>>
    Openlayers高级交互(19/20): 地图上点击某处,列表中显示对应位置
    查看>>
    openlayers:圆孔相机根据卫星经度、纬度、高度、半径比例推算绘制地面的拍摄的区域
    查看>>
    OpenMCU(一):STM32F407 FreeRTOS移植
    查看>>
    OpenMMLab | 【全网首发】Llama 3 微调项目实践与教程(XTuner 版)
    查看>>
    OpenMMLab | 面向多样应用需求,书生·浦语2.5开源超轻量、高性能多种参数版本
    查看>>
    OpenPPL PPQ量化(4):计算图的切分和调度 源码剖析
    查看>>
    OpenPPL PPQ量化(5):执行引擎 源码剖析
    查看>>
    Openresty框架入门详解
    查看>>
    OpenResty(2):OpenResty开发环境搭建
    查看>>
    openshift搭建Istio企业级实战
    查看>>
    Openstack 之 网络设置静态IP地址
    查看>>