I'm trying to make an HTTPS GET request using Ethernet on an ESP32 with a W5500 Ethernet module. My HTTP request (non-secure) works fine, but when I switch to HTTPS using mbedTLS, I get the following error:
assert failed: tcpip_send_msg_wait_sem IDF/components/lwip/lwip/src/api/tcpip.c:455 (Invalid mbox)
Here is the part of my code:
#include <SPI.h>#include <Ethernet.h>#include "mbedtls/net_sockets.h"#include "mbedtls/ssl.h"#include "mbedtls/x509.h"#include "mbedtls/entropy.h"#include "mbedtls/ctr_drbg.h"#define W5500_CS 5 // Chip Select for W5500byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };IPAddress ip(192, 168, 1, 100);const char *SERVER_HOST = "api.example.com";const char *SERVER_PORT = "443";mbedtls_ssl_context ssl;mbedtls_ssl_config conf;mbedtls_net_context server_fd;mbedtls_entropy_context entropy;mbedtls_ctr_drbg_context ctr_drbg;mbedtls_x509_crt cacert;void setup() { Serial.begin(115200); SPI.begin(); Ethernet.init(W5500_CS); if (Ethernet.begin(mac) == 0) { Serial.println("Ethernet init failed!"); return; } // Initialize mbedTLS mbedtls_net_init(&server_fd); mbedtls_ssl_init(&ssl); mbedtls_ssl_config_init(&conf); mbedtls_entropy_init(&entropy); mbedtls_ctr_drbg_init(&ctr_drbg); mbedtls_x509_crt_init(&cacert); mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, NULL, 0); mbedtls_ssl_config_defaults(&conf, MBEDTLS_SSL_IS_CLIENT, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT); mbedtls_ssl_conf_rng(&conf, mbedtls_ctr_drbg_random, &ctr_drbg); mbedtls_ssl_setup(&ssl, &conf); mbedtls_ssl_set_hostname(&ssl, SERVER_HOST); // Connect to server if (mbedtls_net_connect(&server_fd, SERVER_HOST, SERVER_PORT, MBEDTLS_NET_PROTO_TCP) != 0) { Serial.println("Failed to connect to server"); return; } mbedtls_ssl_set_bio(&ssl, &server_fd, mbedtls_net_send, mbedtls_net_recv, NULL); // Perform SSL Handshake int handshake_status = mbedtls_ssl_handshake(&ssl); if (handshake_status != 0) { Serial.printf("TLS Handshake failed! Error code: %d\n", handshake_status); return; } // Send HTTPS GET Request const char *GET_REQUEST = "GET /data HTTP/1.1\r\nHost: api.example.com\r\nConnection: close\r\n\r\n"; if (mbedtls_ssl_write(&ssl, (const unsigned char *)GET_REQUEST, strlen(GET_REQUEST)) < 0) { Serial.println("Failed to send request"); return; } // Read Response char buffer[1024]; int len = mbedtls_ssl_read(&ssl, (unsigned char *)buffer, sizeof(buffer) - 1); if (len > 0) { buffer[len] = '\0'; Serial.println(buffer); } else { Serial.println("No response received"); } mbedtls_ssl_close_notify(&ssl); mbedtls_net_free(&server_fd);}void loop() {}```