me-no-dev / ESPAsyncWebServer

Async Web Server for ESP8266 and ESP32
3.58k stars 1.17k forks source link

Compiling issues #1410

Open c0debreaker opened 3 weeks ago

c0debreaker commented 3 weeks ago

I'm getting the errors below. If I remove #include <ESPAsyncWebServer.h> and other related code, the compile becomes successful. What did I do someting wrong?

/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/WebAuthentication.cpp: In function 'bool getMD5(uint8_t*, uint16_t, char*)':
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/WebAuthentication.cpp:74:3: error: 'mbedtls_md5_starts_ret' was not declared in this scope; did you mean 'mbedtls_md5_starts'?
   74 |   mbedtls_md5_starts_ret(&_ctx);
      |   ^~~~~~~~~~~~~~~~~~~~~~
      |   mbedtls_md5_starts
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/WebAuthentication.cpp:75:3: error: 'mbedtls_md5_update_ret' was not declared in this scope; did you mean 'mbedtls_md5_update'?
   75 |   mbedtls_md5_update_ret(&_ctx, data, len);
      |   ^~~~~~~~~~~~~~~~~~~~~~
      |   mbedtls_md5_update
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/WebAuthentication.cpp:76:3: error: 'mbedtls_md5_finish_ret' was not declared in this scope; did you mean 'mbedtls_md5_finish'?
   76 |   mbedtls_md5_finish_ret(&_ctx, _buf);
      |   ^~~~~~~~~~~~~~~~~~~~~~
      |   mbedtls_md5_finish
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/AsyncEventSource.cpp: In member function 'void AsyncEventSourceClient::_queueMessage(AsyncEventSourceMessage*)':
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/AsyncEventSource.cpp:188:7: error: 'ets_printf' was not declared in this scope; did you mean 'vswprintf'?
  188 |       ets_printf("ERROR: Too many messages queued\n");
      |       ^~~~~~~~~~
      |       vswprintf
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/AsyncWebSocket.cpp: In member function 'void AsyncWebSocketClient::_queueMessage(AsyncWebSocketMessage*)':
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/AsyncWebSocket.cpp:551:7: error: 'ets_printf' was not declared in this scope; did you mean 'vswprintf'?
  551 |       ets_printf("ERROR: Too many messages queued\n");
      |       ^~~~~~~~~~
      |       vswprintf
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/AsyncWebSocket.cpp: In member function 'IPAddress AsyncWebSocketClient::remoteIP()':
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/AsyncWebSocket.cpp:832:28: error: call of overloaded 'IPAddress(unsigned int)' is ambiguous
  832 |         return IPAddress(0U);
      |                            ^
In file included from /home/rcamara/.arduino15/packages/esp32/hardware/esp32/3.0.0/cores/esp32/Arduino.h:196,
                 from /home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/AsyncWebSocket.cpp:21:
/home/rcamara/.arduino15/packages/esp32/hardware/esp32/3.0.0/cores/esp32/IPAddress.h:115:3: note: candidate: 'IPAddress::IPAddress(const ip_addr_t*)'
  115 |   IPAddress(const ip_addr_t *addr);
      |   ^~~~~~~~~
/home/rcamara/.arduino15/packages/esp32/hardware/esp32/3.0.0/cores/esp32/IPAddress.h:73:3: note: candidate: 'IPAddress::IPAddress(const IPAddress&)'
   73 |   IPAddress(const IPAddress &address);
      |   ^~~~~~~~~
/home/rcamara/.arduino15/packages/esp32/hardware/esp32/3.0.0/cores/esp32/IPAddress.h:72:3: note: candidate: 'IPAddress::IPAddress(const char*)'
   72 |   IPAddress(const char *address);
      |   ^~~~~~~~~
/home/rcamara/.arduino15/packages/esp32/hardware/esp32/3.0.0/cores/esp32/IPAddress.h:69:3: note: candidate: 'IPAddress::IPAddress(const uint8_t*)'
   69 |   IPAddress(const uint8_t *address);
      |   ^~~~~~~~~
/home/rcamara/.arduino15/packages/esp32/hardware/esp32/3.0.0/cores/esp32/IPAddress.h:67:3: note: candidate: 'IPAddress::IPAddress(uint32_t)'
   67 |   IPAddress(uint32_t address);
      |   ^~~~~~~~~
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/AsyncWebSocket.cpp: In constructor 'AsyncWebSocketResponse::AsyncWebSocketResponse(const String&, AsyncWebSocket*)':
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/AsyncWebSocket.cpp:1262:3: error: 'mbedtls_sha1_starts_ret' was not declared in this scope; did you mean 'mbedtls_sha1_starts'?
 1262 |   mbedtls_sha1_starts_ret(&ctx);
      |   ^~~~~~~~~~~~~~~~~~~~~~~
      |   mbedtls_sha1_starts
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/AsyncWebSocket.cpp:1263:3: error: 'mbedtls_sha1_update_ret' was not declared in this scope; did you mean 'mbedtls_sha1_update'?
 1263 |   mbedtls_sha1_update_ret(&ctx, (const unsigned char*)key.c_str(), key.length());
      |   ^~~~~~~~~~~~~~~~~~~~~~~
      |   mbedtls_sha1_update
/home/rcamara/Arduino/libraries/ESP_Async_WebServer/src/AsyncWebSocket.cpp:1264:3: error: 'mbedtls_sha1_finish_ret' was not declared in this scope; did you mean 'mbedtls_sha1_finish'?
 1264 |   mbedtls_sha1_finish_ret(&ctx, hash);
      |   ^~~~~~~~~~~~~~~~~~~~~~~
      |   mbedtls_sha1_finish
Multiple libraries were found for "WiFi.h"
  Used: /home/rcamara/.arduino15/packages/esp32/hardware/esp32/3.0.0/libraries/WiFi
  Not used: /home/rcamara/Arduino/libraries/WiFiNINA
exit status 1

Compilation error: exit status 1

and my source code is

#include <Arduino.h>
#include <WiFi.h>
#include <LittleFS.h>
#include <ESPAsyncWebServer.h>

// Replace with your network credentials
const char* ssid = "******";
const char* password = "******";

AsyncWebServer server(80);

void setup() {
  // Start Serial for debug output
  Serial.begin(115200);

  // Initialize LittleFS
  if (!LittleFS.begin()) {
    Serial.println("An Error has occurred while mounting LittleFS");
    return;
  }

  // Connect to Wi-Fi
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }
  Serial.println("Connected to WiFi");

  // Serve static files from LittleFS
  server.serveStatic("/", LittleFS, "/").setDefaultFile("index.html");

  // Handle 404 (Not Found)
  server.onNotFound([](AsyncWebServerRequest *request) {
    request->send(404, "text/plain", "Not found");
  });

  // Start server
  server.begin();
}

void loop() {
  // Nothing needed here
}
lbernstone commented 3 weeks ago

This needs guardrails for when to include, but here are the necessary includes

diff --git a/src/AsyncEventSource.cpp b/src/AsyncEventSource.cpp
index f2914df..230e3f6 100644
--- a/src/AsyncEventSource.cpp
+++ b/src/AsyncEventSource.cpp
@@ -19,6 +19,7 @@
 */
 #include "Arduino.h"
 #include "AsyncEventSource.h"
+#include "rom/ets_sys.h"

 static String generateEventMessage(const char *message, const char *event, uint32_t id, uint32_t reconnect){
   String ev = "";
diff --git a/src/AsyncWebSocket.cpp b/src/AsyncWebSocket.cpp
index f76f2fc..ef94775 100644
--- a/src/AsyncWebSocket.cpp
+++ b/src/AsyncWebSocket.cpp
@@ -28,6 +28,7 @@
 #else
 #include <Hash.h>
 #endif
+#include "mbedtls/compat-2.x.h"

 #define MAX_PRINTF_LEN 64

@@ -829,7 +830,7 @@ void AsyncWebSocketClient::binary(AsyncWebSocketMessageBuffer * buffer)

 IPAddress AsyncWebSocketClient::remoteIP() {
     if(!_client) {
-        return IPAddress(0U);
+        return IPAddress(0,0,0,0);
     }
     return _client->remoteIP();
 }
diff --git a/src/WebAuthentication.cpp b/src/WebAuthentication.cpp
index 45246a1..01fb567 100644
--- a/src/WebAuthentication.cpp
+++ b/src/WebAuthentication.cpp
@@ -22,6 +22,7 @@
 #include <libb64/cencode.h>
 #ifdef ESP32
 #include "mbedtls/md5.h"
+#include "mbedtls/compat-2.x.h"
 #else
 #include "md5.h"
 #endif
c0debreaker commented 3 weeks ago

This needs guardrails for when to include, but here are the necessary includes

diff --git a/src/AsyncEventSource.cpp b/src/AsyncEventSource.cpp
index f2914df..230e3f6 100644
--- a/src/AsyncEventSource.cpp
+++ b/src/AsyncEventSource.cpp
@@ -19,6 +19,7 @@
 */
 #include "Arduino.h"
 #include "AsyncEventSource.h"
+#include "rom/ets_sys.h"

 static String generateEventMessage(const char *message, const char *event, uint32_t id, uint32_t reconnect){
   String ev = "";
diff --git a/src/AsyncWebSocket.cpp b/src/AsyncWebSocket.cpp
index f76f2fc..ef94775 100644
--- a/src/AsyncWebSocket.cpp
+++ b/src/AsyncWebSocket.cpp
@@ -28,6 +28,7 @@
 #else
 #include <Hash.h>
 #endif
+#include "mbedtls/compat-2.x.h"

 #define MAX_PRINTF_LEN 64

@@ -829,7 +830,7 @@ void AsyncWebSocketClient::binary(AsyncWebSocketMessageBuffer * buffer)

 IPAddress AsyncWebSocketClient::remoteIP() {
     if(!_client) {
-        return IPAddress(0U);
+        return IPAddress(0,0,0,0);
     }
     return _client->remoteIP();
 }
diff --git a/src/WebAuthentication.cpp b/src/WebAuthentication.cpp
index 45246a1..01fb567 100644
--- a/src/WebAuthentication.cpp
+++ b/src/WebAuthentication.cpp
@@ -22,6 +22,7 @@
 #include <libb64/cencode.h>
 #ifdef ESP32
 #include "mbedtls/md5.h"
+#include "mbedtls/compat-2.x.h"
 #else
 #include "md5.h"
 #endif

Hi lbernstone,

I see there are 3 files that needs to be updated. I can update it manually. However, I like to learn how to update it from your given code. What tool should I use for that? It looks similar to some diffs I've seen very long time ago using patch command. Thanks a lot!

lbernstone commented 3 weeks ago

That was a git diff. It was updated with my own 2 hands :) I just looked at what was missing, grep'd for those functions in the arduino-esp32/tools/esp32-arduino-libs/esp32/include folder, and included those files in the correct locations. To make a PR, I need to figure out a way to only include those headers if the version is >3.0.0.

c0debreaker commented 3 weeks ago

Oh got it. I knew I will have issues when Arduino popped up something on the lower right corner. Do you want to update to 3.0.0? I said yes. Few hours later, I encountered the issues above.

Alrighty, I'll make changes to my local. Thank you.

jimdgit commented 3 weeks ago

I add the lines above with the + on them I got this: /Users/jcdonelson/Documents/Arduino/libraries/ESPAsyncWebServer/src/AsyncWebSocket.cpp: In member function 'void AsyncWebSocketClient::_queueMessage(AsyncWebSocketMessage*)': /Users/jcdonelson/Documents/Arduino/libraries/ESPAsyncWebServer/src/AsyncWebSocket.cpp:551:7: error: 'ets_printf' was not declared in this scope; did you mean 'vswprintf'? 551 | ets_printf("ERROR: Too many messages queued\n"); | ^~~~~~ | vswprintf If I comment out line 551 then it all compiles.

capc0307 commented 2 weeks ago

That was a git diff. It was updated with my own 2 hands :) I just looked at what was missing, grep'd for those functions in the arduino-esp32/tools/esp32-arduino-libs/esp32/include folder, and included those files in the correct locations. To make a PR, I need to figure out a way to only include those headers if the version is >3.0.0.

I found this:

#ifdef ESP_ARDUINO_VERSION_MAJOR
            #if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 0)
                                                  // Code for version 3.x

                   #else
                                                 // Code for version 2.x
                   #ifdef ESP32

                   #else

                    #endif
                 #endif
                #endif

on https://github.com/h2zero/NimBLE-Arduino/issues/676#issuecomment-2160799917, from a comment made by ednieuw. ednieuw says they got this piece of code from the Espressif migration 2.x -> 3.x document. Supposedly, this piece of code makes a library compatible for both ESP32 versions. I hope this helps.

Update: I found a file with a piece a code explaining the manipulation of the ESP32 versions better in the Espressif's official repository for Arduino core for the ESP32. A little bit more information can be found in Espressif's Compatibility Guide for ESP32 Arduino Core page

joyfullservice commented 2 weeks ago

If I comment out line 551 then it all compiles.

Just an observation, but in AsyncWebSocket.cpp the ets_printf() function is used 7 times, but 6 of these are commented out. The one that triggers the compile error is the only one that is not commented out. Perhaps that one got missed when the debug lines were added and commented out six years ago.

I can confirm that after making the changes above and commenting out this line, it compiles and seems to work fine on an ESP32 dev board.