我制作了stm32 + rtos + lwip / mqtt解决方案,并且效果很好。现在,我想将其与tls安全连接一起使用。我没有找到任何范例。
lwip mqtt api支持tls通讯。但是没有这样的示例,只是使用代码LWIP MQTT Client的简单mqtt客户端。
我试图在cubemx,LWIP_ALTCP和LWIP_ALTCP_TLS中启用embedtls和某些选项,将LWIP_ALTCP_TLS_MBEDTLS添加到Path。它编译了。如何初始化mbedtls并添加tls证书。此链接需要一些信息altcp tls
有人在stm32 lwip堆栈中使用stm32 lwip / mqtt + tls(mbedtls)有任何经验或工作示例吗?
UPD。这是我的mqtt客户端设置代码:
struct mqtt_connect_client_info_t ci;
memset(&ci, 0, sizeof(ci));
ci.client_id = "lwip_test";
ci.client_user = "";
ci.client_pass = "";
ci.keep_alive = 0;
ci.tls_config = altcp_tls_create_config_client((const u8_t*)test_cert, sizeof(test_cert));
// create client
client = mqtt_client_new();
// connect client
mqtt_client_connect(client, &resolved, port, mqtt_on_connect, (void *)0, &ci);
我给mqtt客户端ca证书和长度。我有一个错误altcp_tls_create_config_client_common函数(altcp_tls_mbedtls.c),代码为-4480(分配内存失败)。
ret = mbedtls_x509_crt_parse(conf->ca, ca, ca_len);
if (ret != 0) {
LWIP_DEBUGF(ALTCP_MBEDTLS_DEBUG, ("mbedtls_x509_crt_parse ca failed: %d 0x%x", ret, -1*ret));
altcp_mbedtls_free_config(conf);
return NULL;
}
我做错了,我应该在mbedtls模块中设置哪些选项?我使用默认是由CubeMX生成的
我具有相同的配置,所以我可以告诉您,如果调试代码,您会发现尝试调用calloc会崩溃,如果您的环境等于我的环境,那么您将没有该系统功能。
我所做的是使用在lwip中实现的calloc,尤其是在altcp模块中。我通过cubemx MBEDTLS_PLATFORM_MEMORY进行了定义,以便在altcp_tls_mbedtls_mem.c中激活定义ALTCP_MBEDTLS_PLATFORM_ALLOC,然后就可以使用altcp_mbedtls_mem_init()函数,用于指定mbedtls使用altcp calloc和free。
此函数在altcp_tls_create_config_client中被调用,因此,如果要使用它,则不必两次调用altcp_mbedtls_mem_init()。
通过这种方式,您应该能够为mbedtls正确分配内存。