You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

STM32F4无RTOS环境下LWIP AltCP+MbedTLS改造ModbusTCP初始化函数问题

改造方案

你现有代码的核心问题如下:

  1. altcp_new(NULL) 创建的是无加密的普通TCP altcp连接,没有关联MbedTLS层,无法实现TLS加密
  2. 你当前用的altcp_tls_create_config_client是客户端专用的TLS配置创建函数,从代码中的listen逻辑判断你做的是Modbus TCP服务端,应该使用服务端对应接口
  3. TLS配置需要提前创建并作为参数传入altcp_tls_new,才能生成带TLS能力的altcp pcb

步骤1:定义全局TLS配置变量

TLS配置需要在连接生命周期内保持有效,不能定义为函数内部临时变量:

// 全局TLS配置指针
static struct altcp_tls_config *tls_config = NULL;
// 替换为实际的服务端证书、私钥内容和长度
extern const unsigned char server_cert[];
extern const unsigned int server_cert_len;
extern const unsigned char server_key[];
extern const unsigned int server_key_len;

步骤2:重写xMBTCPPortInit函数

调整初始化流程,先初始化TLS配置,再创建带TLS的监听pcb:

BOOL
xMBTCPPortInit( USHORT usTCPPort )
{
    struct altcp_pcb *pxPCBListenNew, *pxPCBListenOld;
    BOOL            bOkay = (BOOL)FALSE;
    USHORT          usPort;

    if( usTCPPort == 0 )
    {
        usPort = MB_TCP_DEFAULT_PORT;
    }
    else
    {
        usPort = ( USHORT ) usTCPPort;
    }

    // 初始化TLS服务端配置,传入服务端证书和私钥
    tls_config = altcp_tls_create_config_server(server_cert, server_cert_len, server_key, server_key_len);
    if (tls_config == NULL) {
        // TLS配置创建失败,检查证书格式、系统内存是否足够
        return FALSE;
    }

    // 用TLS配置创建带加密的altcp pcb,IP类型根据实际需求选IPADDR_TYPE_V4/IPADDR_TYPE_V6
    if( ( pxPCBListenNew = pxPCBListenOld = altcp_tls_new(tls_config, IPADDR_TYPE_V4) ) == NULL )
    {
        altcp_tls_free_config(tls_config);
        tls_config = NULL;
        return FALSE;
    }
    else if( altcp_bind( pxPCBListenNew, IP_ADDR_ANY, ( u16_t ) usPort ) != ERR_OK )
    {
        ( void )altcp_close( pxPCBListenOld );
        altcp_tls_free_config(tls_config);
        tls_config = NULL;
        return FALSE;
    }
    else if( ( pxPCBListenNew = altcp_listen( pxPCBListenNew ) ) == NULL )
    {
        ( void )altcp_close( pxPCBListenOld );
        altcp_tls_free_config(tls_config);
        tls_config = NULL;
        return FALSE;
    }
    else
    {
        altcp_accept( pxPCBListenNew, prvxMBTCPPortAccept );
        pxPCBListen = pxPCBListenNew;

#ifdef MB_TCP_DEBUG
        vMBPortLog( MB_LOG_DEBUG, "MBTCP-ACCEPT", "Protocol stack ready.\r\n" );
#endif
        SerialPrint("MBTCTP-ACCEPT");
        bOkay = TRUE;
    }
    return bOkay;
}

步骤3:修改连接接收回调

适配altcp接口修改prvxMBTCPPortAccept回调函数,后续所有数据收发操作全部使用altcp_recv、altcp_write等altcp通用接口,不要调用原生lwip tcp接口,TLS层会自动处理加解密逻辑。


注意事项

  • 如果你开发的是Modbus TLS客户端,替换TLS配置创建逻辑为altcp_tls_create_config_client,传入CA根证书即可
  • 无RTOS环境下需要确保LWIP_HEAP_SIZE和MbedTLS的内存池配置足够,单路TLS握手阶段需要约20~30KB的内存
  • 如果不需要加密的普通TCP连接,才可以使用altcp_new(NULL)创建pcb
  • 服务退出时可以调用altcp_tls_free_config释放TLS配置占用的内存

内容的提问来源于stack exchange,提问作者gogogo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:30:01