Neues VSC Problem mit WebSocketsServer.h

Hallo Zusammen,

der nachfolgende Code, der in dieser, zwecks Fehlereingrenzung eingedampften Form nichts Sinnvolles mehr tut, übersetzt in der Arduino IDE fehlerfrei.

In VSC erhalte ich folgende Fehlermeldungen, über die ich nichts im Netz finden konnte, was mich weitergebracht hat:

Compiling .pio\build\esp-wrover-kit\libbf6\WebSockets\WebSockets.cpp.o
In file included from .pio\libdeps\esp-wrover-kit\WebSockets\src\SocketIOclient.cpp:9:0:
.pio\libdeps\esp-wrover-kit\WebSockets\src\WebSocketsClient.h:59:51: error: missing binary operator before token "("
 #if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 4)
                                                   ^
.pio\libdeps\esp-wrover-kit\WebSockets\src\WebSocketsClient.h:126:51: error: missing binary operator before token "("
 #if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 4)
                                                   ^
Compiling .pio\build\esp-wrover-kit\libbf6\WebSockets\WebSocketsClient.cpp.o
*** [.pio\build\esp-wrover-kit\libbf6\WebSockets\SocketIOclient.cpp.o] Error 1
In file included from .pio\libdeps\esp-wrover-kit\WebSockets\src\WebSocketsClient.cpp:26:0:
.pio\libdeps\esp-wrover-kit\WebSockets\src\WebSocketsClient.h:59:51: error: missing binary operator before token "("
 #if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(3, 0, 4)

Das sah für mich erstmal so aus, als gäbe es Fehler in den Funktionen der WebSocketsServer.h Bibliothek. Allerdings kann ich mir das nicht vorstellen (ich habe nichts geändert), außerdem scheint es in der Arduino IDE ja zu laufen. Ich habe die aktuelle Version 2.6.1 der Bibliothek für dieses Projekt in VSC installiert. In der Arduino IDE ebenfalls 2.6.1.
Nach mehrstündigem trial and error bin ich am Ende meiner Möglichkeiten. Wisst ihr woran es liegen könnte?

#include <Arduino.h>

#include <WiFi.h>
#include <WebSocketsServer.h> 
#include <WebServer.h>

const char* ssid = "xxxx";
const char* password = "xxxx"; 

const char* ntpServer = "pool.ntp.org";
const long  gmtOffset_sec = 3600;
const int   daylightOffset_sec = 3600;

WebServer server(80); // Deklariert ein Objekt der WebServer Bibliothek dass auf HTTP Anfragen auf Port 80 hört
WebSocketsServer webSocket = WebSocketsServer(81); // Deklariert ein Objekt der WebSocketServer Bibliothek auf Port 81

void webSocketEvent (byte num, WStype_t type, uint8_t * payload, size_t length) {
  Serial.println("What's happening?");
  int typ = type;
  switch(typ) {
    case WStype_DISCONNECTED: // enum that reads status, this is used for debugging
      Serial.println("Websocket: Client Disconnected");
      break; 
    case WStype_CONNECTED: // Check if a WebSocket Client is connected or not
      Serial.println("Websocket: Client Connected");
      //add code here what to do when connected
      break;
    case WStype_TEXT: // check response from client
      Serial.println("Response received");
      break;
    default: 
      Serial.println("Gemsen?");
  }
}

void setup()
{
  Serial.begin(115200); 
  //-----------------------------------------------
  WiFi.begin(ssid, password);
  while(WiFi.status() != WL_CONNECTED){Serial.print("."); delay(500);}
  WiFi.mode(WIFI_STA); // Connecting to an existing WiFi network in Station mode
  Serial.println();
  Serial.print("Local IP: ");
  Serial.println(WiFi.localIP());
  //-----------------------------------------------
  //init and get the time
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

  
  // server.on("/", serverRouting); // War deaktiviert und funktioniert - warum auch immer - trotzdem. 
  //-----------------------------------------------
  server.begin(); // Startet den Webserver, der hier aber noch gar nichts tut
 
  webSocket.begin(); // Startet den Websocket Server
  webSocket.onEvent(webSocketEvent); // Bei einer hereinkommenden websocket Nachricht gehe zu Funktion 'WebSocketEvent'
  Serial.println(F("HTTP server and Websocket server started"));
}

void loop() {
  
}

Die Zeile "int typ = type; switch(typ)" war ein Versuch, ist aber unnötig und ändert am Fehlerbild nichts gegenüber einem einfachen switch (type).

Im Voraus Danke und Grüße
Werner

Warum willst Du einen Arduinocode unbedingt in der Krücke compilieren?
Du hast doch beim letzten Mal schon gezeigt bekommen, dass der VSC-Compiler anders reagiert.

Bedenke: Arduino ist C++ , C++ ist nicht Arduino.

Zum Beispiel, weil die Krücke zum übersetzen 1/5 bis 1/10 der Zeit braucht, die die Arduino IDE braucht.

Ist die Compilationszeit für Dich wichtiger, als die fehlerfreie Compilierung?
Wenn ja, musst Du die Probleme wohl selbst lösen, wenn nein, nimm die IDE.

Gruß Tommy

Offensichtlich, weil der Linker etwas anders macht.
Nun kann man drüber nachsinnen, wer falsch liegt.
Die Lebenszeit spare ich mir.
Ich habe eine funktionierende Laufzeitumgebung. Und Du auch.
(Und ich habe schon einige sehr große Projekte kompiliert.)

Schneller, dafür funktioniert's nicht. Pick your poision.

Also, nur um das mal etwas gerade zu rücken. Der VSC ist nur ein Editor in den man jede Menge Plugins einbinden kann. Der kompiliert nichts. Mit den entsprechenden Plugins wird eine IDE draus.

Falls Du VSC mit dem PlatformIO Plugin nutzt, kann ich sagen, dass sich der Code einwandfrei kompilieren lässt.

[platformio]
description = Testsketch
default_envs = esp-wrover-kit

[common]
compile_flags = 
  -Os -Wall -Wextra
	;I $PROJECT_DIR/include
mybuild_flags =

[env]
platform = espressif32
framework = arduino
platform_packages = 
lib_deps = 
  links2004/WebSockets @ ^2.6.1

build_type = release
build_flags = 
	${common.compile_flags}
	${common.mybuild_flags}
board_build.mcu = esp32
board_build.filesystem = littlefs
monitor_speed = 115200
monitor_eol = LF
monitor_echo = YES
monitor_filters =
  default   ; Remove typical terminal control codes from input
  time      ; Add timestamp with milliseconds for each new line
  esp32_exception_decoder
upload_speed = 921600
upload_flags = 

[env:esp32dev]
board = az-delivery-devkit-v4
  
[env:esp-wrover-kit]
board =  esp-wrover-kit
Processing esp-wrover-kit (board: esp-wrover-kit; platform: espressif32; framework: arduino)
----------------------------------------------------------------------------------------------------------------------------------------------Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/espressif32/esp-wrover-kit.html
PLATFORM: Espressif 32 (6.10.0) > Espressif ESP-WROVER-KIT
HARDWARE: ESP32 240MHz, 320KB RAM, 4MB Flash
DEBUG: Current (ftdi) On-board (ftdi) External (cmsis-dap, esp-bridge, esp-prog, iot-bus-jtag, jlink, minimodule, olimex-arm-usb-ocd, olimex-arm-usb-ocd-h, olimex-arm-usb-tiny-h, olimex-jtag-tiny, tumpa)
PACKAGES:
 - framework-arduinoespressif32 @ 3.20017.241212+sha.dcc1105b
 - tool-esptoolpy @ 1.40501.0 (4.5.1)
 - toolchain-xtensa-esp32 @ 8.4.0+2021r2-patch5
LDF: Library Dependency Finder -> https://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft

[...]

Linking .pio\build\esp-wrover-kit\firmware.elf
Retrieving maximum program size .pio\build\esp-wrover-kit\firmware.elf
Checking size .pio\build\esp-wrover-kit\firmware.elf
Advanced Memory Usage is available via "PlatformIO Home > Project Inspect"
RAM:   [==        ]  16.4% (used 53756 bytes from 327680 bytes)
Flash: [========  ]  79.0% (used 1035529 bytes from 1310720 bytes)
Building .pio\build\esp-wrover-kit\firmware.bin
esptool.py v4.5.1
Creating esp32 image...
Merged 27 ELF sections
Successfully created esp32 image.
======================================================== [SUCCESS] Took 27.72 seconds ========================================================
Environment     Status    Duration
--------------  --------  ------------
esp-wrover-kit  SUCCESS   00:00:27.715
======================================================== 1 succeeded in 00:00:27.715 ======================================================== 

@Kai-R
Ja, richtig, nicht VSC sondern Platformio ist hier beteiligt.
Ich habe durch hilfsbereite Nutzer im Platformio Forum inzwischen herausgefunden, dass ich mit einer sehr alten espressif32 Plattform von 2021 gearbeitet habe. Die WebSocketsServer Bibliothek 2.6.1 war deutlich neuer (2024) und war damit nicht mehr kompatibel.
Um die neueste Plattform Arduino 3.x zu nutzen muss man in platformio.ini folgendes eintragen:

platform = https://github.com/pioarduino/platform-espressif32/releases/download/stable/platform-espressif32.zip

Danach war das Problem mit WebSocketsServer.h beseitigt, aber es gab ein neues mit OneWire.h.
Hier stellte sich heraus, dass es für die OneWire Bibliothek für Arduino 3.x noch keinen kompatiblen Release gibt (2.3.8 reicht nicht) und man deshalb direkt das github Repo in die platformio.ini eintragen muß:

lib_deps =
GitHub - PaulStoffregen/OneWire: Library for Dallas/Maxim 1-Wire Chips

Danach funktionierte das übersetzen dann in VSC/PIO.

Da habe ich jetzt zwar einiges gelernt und vermutlich werden mir ähnliche Probleme zukünftig schneller von der Hand gehen aber die Beseitigung dieser, aus Unwissenheit selbst erzeugten Probleme hat den eigentlichen Programmierfortschritt an meinem ESP32 Projekt um 3 Tage verzögert.

Obwohl mir PIO aus verschiedenen Gründen deutlich besser gefällt als die Arduino IDE verstehe ich nach dieser Erfahrung ganz gut, warum PIO für Anfänger wie mich eher nix ist. Die Arduino IDE ist vergleichsweise idiotensicher.

Grüße
Werner

Du kannst auch über PlatformIO einfach mal unter Platforms nachschauen und dort ein Update machen.

Man kann auch in der ini Datei die gewünschte Version angeben, falls man eine andere als nur die aktuellste verwenden möchte:

platform = espressif32 @ 6.6.0 ; Arduino core V2.0.14

Das kann notwendig sein, wenn man beispielsweise bestimmte Bibliotheken mit dem ESP32C3 verwenden möchte die nicht mit dem 3.x.x Framework klar kommen. Die tft_eSPI Bibliothek wäre z.Zt. noch so ein Fall.

Das was Du im Eröffnungsposting geschildert hast, ist jedenfalls kein VSC Problem / PlatformIO Problem. Es ist ein Layer 8 Problem.

Was macht eigentlich die "espressif32 Plattform"? Sind darin die APIs enthalten, über die auf die HW Funktionen zugegriffen werden kann? Entspricht das dann dem "Arduino Core"?

Gerne auch Referenz auf eine Stelle, wo das für Nicht-Informatiker erklärt ist.

Im Voraus vielen Dank!
Werner

Durch die Definition der "Platform" wird festgelegt, welche Compiler und Tools verwendet werden, um den Programmcode passend für den jeweiligen Microcontroller erstellen zu können.

Bei der Arduino IDE müssen ja auch für die ESP32 Controller die Tools über den Bordverwalter eingestellt werden. Dazu werden in den Voreinstellungen ebenfalls
URLs angegeben, wo sich die IDE die Frameworks, Tools herholen kann.

Bei PlatformIO erfolgt das halt über "Platform" beim PlatformIO Plugin. Über die platformIO.ini Datei kann das noch feingranularer eingestellt werden.

Wenn Du eine Referenz möchtest dann ist das wohl diese hier:
https://docs.platformio.org/en/latest/

Hallo,

das Arduino Core Package (aktuell 2.0.18) für den Arduino Nano ESP32 basiert auf dem Espressif Core Package (letzte 2er Version 2.0.17). Das Espressif Core Package ist nur aktuell auf 3.1.1. weiterentwickelt wurden mit an manchen Stellen geänderter API. Wann Arduino nachzieht weiß ich nicht.
Man muss sich also entscheiden welche Core Version man verwendet. Ich weiß das die Situation nicht schön ist, nur man muss damit leben.
Zudem solltest du immer angeben welchen ESP Controller/Board du hast. Es gibt gefühlt Millionen verschiedene Dinger davon.