General informations :
- M5Stack Core 2
- LAN Module 13.2
- Using PlatformIO with platform=platformio/espressif32@^6.9.0 & board=m5stack-core2
- M5Stack powered by USB-C
Problem :
I need to make requests to a secure HTTPS server. They work perfectly on WiFi with the âWiFiClientSecureâ client and the âWiFiClientâ + âSSLClientESP32â client, but not with âEthernetClientâ of âM5Module_LANâ or âEthernetâ + âSSLClientESP32â.
I've tried many modules and libraries without getting HTTPS to work, HTTP works in ethernet but is completely useless and outdated. Do you know a way to solve this problem? It shouldn't be so complicated to connect to a site using TLS in 2024.
Here are some sample codes I've tried :
#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <HTTPClientGeneric.h>
#include <SPI.h>
char ssid[] = "ssid";
char pass[] = "password";
WiFiClientSecure wifi;
void setup()
{
Serial.begin(115200);
WiFi.begin(ssid, pass);
uint16_t timeout = 0;
while (WiFi.status() != WL_CONNECTED)
{
if (timeout > 600)
{
Serial.println(" Timeout reached, aborting");
}
delay(100);
Serial.print(".");
timeout++;
}
Serial.println(" Connection established!");
Serial.println("Network::connectWifi(): IP address : " + WiFi.localIP().toString());
Serial.println("Network::connectWifi(): Subnet mask : " + WiFi.subnetMask().toString());
Serial.println("Network::connectWifi(): Gateway IP : " + WiFi.gatewayIP().toString());
Serial.println("Network::connectWifi(): DNS : " + WiFi.dnsIP().toString());
Serial.println("Network::connectWifi(): SSID : " + WiFi.SSID());
Serial.println("Network::connectWifi(): Signal : " + String(WiFi.RSSI()) + " dBm");
wifi.setInsecure(); // Just trying to connect, will use certificate later
}
void loop()
{
HTTPClientGeneric https;
https.begin(wifi, " [URL of my HTTPS endpoint] ");
int httpCode = https.GET();
Serial.print("GET Status code: ");
Serial.println(httpCode);
String response = https.getString();
Serial.println("Response:");
Serial.println(response);
delay(5000);
}
This one works perfectly, the local IP and the response are displayed in the serial port.
#include <WiFi.h>
#include <WiFiClient.h>
#include <HTTPClientGeneric.h>
#include <SSLClientESP32.h>
#include <SPI.h>
char ssid[] = "ssid";
char pass[] = "password";
const char *isrg_root_ca = "-----BEGIN CERTIFICATE-----\n"
"...\n"
"-----END CERTIFICATE-----\n";
WiFiClient wifi;
SSLClientESP32 ssl_client(&wifi);
void setup()
{
Serial.begin(115200);
WiFi.begin(ssid, pass);
uint16_t timeout = 0;
while (WiFi.status() != WL_CONNECTED)
{
if (timeout > 600)
{
Serial.println(" Timeout reached, aborting");
}
delay(100);
Serial.print(".");
timeout++;
}
Serial.println(" Connection established!");
Serial.println("Network::connectWifi(): IP address : " + WiFi.localIP().toString());
Serial.println("Network::connectWifi(): Subnet mask : " + WiFi.subnetMask().toString());
Serial.println("Network::connectWifi(): Gateway IP : " + WiFi.gatewayIP().toString());
Serial.println("Network::connectWifi(): DNS : " + WiFi.dnsIP().toString());
Serial.println("Network::connectWifi(): SSID : " + WiFi.SSID());
Serial.println("Network::connectWifi(): Signal : " + String(WiFi.RSSI()) + " dBm");
ssl_client.setCACert(isrg_root_ca);
ssl_client.setInsecure(); // Same
}
void loop()
{
HTTPClientGeneric https;
https.begin(ssl_client, " [URL of my HTTPS endpoint] ");
int httpCode = https.GET();
Serial.print("GET Status code: ");
Serial.println(httpCode);
String response = https.getString();
Serial.println("Response:");
Serial.println(response);
delay(5000);
}
This one works perfectly, the local IP and the response are displayed in the serial port.
#include <M5Unified.h>
#include <M5Module_LAN.h>
#include <WifiClient.h>
#include <HTTPClientGeneric.h>
#include <SSLClientESP32.h>
#include <SPI.h>
byte mac[] = (mac);
Client *client;
EthernetClient ethClient;
SSLClientESP32 ssl_client(ðClient);
void setup()
{
M5.begin();
Serial.begin(115200);
M5Module_LAN LAN;
uint8_t cs_pin;
uint8_t rst_pin;
uint8_t int_pin;
m5::board_t board = M5.getBoard();
switch (board)
{
case m5::board_t::board_M5Stack:
{
cs_pin = 5;
rst_pin = 0;
int_pin = 35;
}
break;
case m5::board_t::board_M5StackCore2:
{
cs_pin = 33;
rst_pin = 0;
int_pin = 35;
}
break;
case m5::board_t::board_M5StackCoreS3:
{
cs_pin = 1;
rst_pin = 0;
int_pin = 10;
}
break;
}
SPI.begin(SCK, MISO, MOSI, -1);
LAN.setResetPin(rst_pin);
LAN.reset();
LAN.init(cs_pin);
while (LAN.begin(mac) != 1)
{
Serial.println("Error getting IP address via DHCP, trying again...");
delay(2000);
}
Serial.println(" Connection established!");
Serial.println("Network::connectWifi(): IP address : " + LAN.localIP().toString());
Serial.println("Network::connectWifi(): Subnet mask : " + LAN.subnetMask().toString());
Serial.println("Network::connectWifi(): Gateway IP : " + LAN.gatewayIP().toString());
Serial.println("Network::connectWifi(): DNS : " + LAN.dnsServerIP().toString());
ssl_client.setCACert(isrg_root_ca);
}
void loop()
{
HTTPClientGeneric https;
https.begin(ssl_client, " [URL of my HTTPS endpoint] ");
int httpCode = https.GET();
Serial.print("GET Status code: ");
Serial.println(httpCode);
String response = https.getString();
Serial.println("Response:");
Serial.println(response);
delay(5000);
}
It does not work with the following error:
[ 20591][E][ssl_lib_client.cpp:35] _handle_error(): [start_ssl_client():300]: (-1) ERROR - Generic error
[ 20601][E][SSLClientESP32.cpp:123] connect(): start_ssl_client: -1
[ 21775][E][ssl_lib_client.cpp:35] _handle_error(): [start_ssl_client():300]: (-1) ERROR - Generic error
[ 21784][E][SSLClientESP32.cpp:123] connect(): start_ssl_client: -1
Note that the IP is displayed correctly. It works with the EthernetClient but the request is HTTP only, so not what I want.