STM32F4无RTOS环境下LWIP AltCP+MbedTLS改造ModbusTCP初始化函数问题
改造方案
你现有代码的核心问题如下:
altcp_new(NULL)创建的是无加密的普通TCP altcp连接,没有关联MbedTLS层,无法实现TLS加密- 你当前用的
altcp_tls_create_config_client是客户端专用的TLS配置创建函数,从代码中的listen逻辑判断你做的是Modbus TCP服务端,应该使用服务端对应接口 - 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
相关产品推荐
相关产品推荐

