Serial terminal web remoto con cronologia persistente e streaming non-bloccante via SSE β Ottimizzato per ESP32 (Arduino).
WebSerialSim fornisce un terminale seriale remoto tramite browser web (SSE), supporto alla cronologia circolare (buffer in SRAM/PSRAM/SD), echo su Serial, integrazione BLE e callback per la gestione remota di comandi. Perfetto per debug e monitoraggio remoto di dispositivi embedded.
| Feature | WebSerialSim | SerialMonitor.js | altre lib WebSocket |
|---|---|---|---|
| Supporto output 1MB+ | β | β (crash ~100KB) | β (crash ~100KB) |
| Non-bloccante | β | ||
| Buffer circolare | β (SRAM/PSRAM/SD) | β (solo RAM) | β (solo RAM) |
| Storage persistente | β (SD/LittleFS) | β | β |
| API nativa (Print) | β | β (custom) | β (custom) |
| Tecnologia | SSE (leggera) | WebSocket | WebSocket |
| Timeout intelligente | β (50ms) | β | β |
| Fallback Serial | β | β | β |
| Callback e parsing comandi | β | ||
| Supporto BLE | β | β | β |
- Trasmissione dati verso browser via Server-Sent Events (
/events/serial) - Non-bloccante: il loop principale non aspetta mai il client
- Timeout intelligente (50ms): accumula caratteri fino a newline o timeout
- Fallback su Serial se il client Γ¨ lento o disconnesso
βββββββββββββββββββββββββββββββββββββββ
β SRAM (limitato) / PSRAM (8MB) / SD β β Scegli il tuo storage
β Buffer circolare che wrappa β
β Automaticamente salva su SD al wrapβ
βββββββββββββββββββββββββββββββββββββββ
- Circular buffer configurabile (default 4KB, scalabile fino a GB con SD)
- Allocazione in SRAM (64KB), PSRAM (4-8MB), o SD/LittleFS (illimitato)
- Wrap automatico: quando il buffer Γ¨ pieno, i dati vecchi vengono sovrascritti
- Flush intelligente su SD prima di sovrascrivere dati importanti
GET /serial β Terminale web interattivo
GET /view-buffer β Visualizza la cronologia completa
GET /get-clientcount β Numero di client connessi
POST /parsingCmd β Invia comandi remoti
webSerial.print("Messaggio");
webSerial.printf("Valore: %d\n", 42);
webSerial.println("Test");
// Funziona come Serial! Niente API custom.- Chunking automatico per evitare MTU e buffer overflow
- Chunking non-bloccante con
delay(2)fra i chunk - Supporta output di 1MB+ senza crash
HISTORY ON β Attiva registrazione
HISTORY OFF β Disattiva registrazione
HISTORY VIEW β Visualizza buffer
HISTORY CLEAR β Svuota buffer
HISTORY FLUSH β Salva su SD
HISTORY INFO β Statistiche spazio
- Web: via SSE con fallback automΓ‘tico
- Serial: locale sul dispositivo
- BLE: callback configurabile
- Storage: buffer RAM + SD persistente
void onCommand(char* cmd, char* param) {
webSerial.printfWeb("Comando: %s\n", cmd);
// Elabora il comando remoto
}
webSerial.setCallback(onCommand);Per un monitor seriale, SSE Γ¨ la scelta corretta:
| Aspetto | SSE | WebSocket |
|---|---|---|
| Direzione | ServerβClient (monodirezionale) | ClientβServer (bidirezionale) |
| Overhead | Minimo (text-based) | Medio (binary framing) |
| Connessione | HTTP/1.1 standard | Upgrade HTTP β WS |
| Robustezza | Alta (fallback HTTP) | Media (richiede WS support) |
| Caso d'uso | Streaming dati | Chat, gaming, real-time bidirectional |
| Perf per 1MB | β OK | β Crash |
La tua app: mandare dati dal device β browser (monodirezionale) β SSE perfetto β
- ESP32 (consigliato) o compatibile
- β PSRAM opzionale (4-8MB su ESP32-S3, S2, WROVER)
- β SD card opzionale (per storage illimitato)
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include "WebSerialSim.h"- AsyncTCP (PlatformIO:
asynctcp) - ESPAsyncWebServer (PlatformIO:
espassyncwebserver)
- LittleFS/SPIFFS β per storage su filesystem
- SD β per storage su SD card
[env:esp32]
build_flags =
-D BUFFER_PSRAM # Abilita PSRAM
-D HISTORY_SD # Scrive su SD (non RAM)
-D OUTBLE # Abilita callback BLEgit clone https://github.com/copida/WebSerialSim.git
cp -r WebSerialSim/src/* <tuoProgetto>/lib/WebSerialSim/lib_deps =
copida/WebSerialSim- Scarica il
.zipda GitHub - Sketch β Includi libreria β Aggiungi libreria .ZIP
- Seleziona il file scaricato
#include <AsyncTCP.h>
#include <ESPAsyncWebServer.h>
#include "WebSerialSim.h"
AsyncWebServer server(80);
WebSerialSim webSerial;
void onCommand(char* cmd, char* param) {
webSerial.printfWeb("Comando ricevuto: %s\n", cmd);
}
void setup() {
Serial.begin(115200);
// Connetti a WiFi (non mostrato)
WiFi.mode(WIFI_STA);
WiFi.begin("SSID", "PASSWORD");
while (WiFi.status() != WL_CONNECTED) delay(100);
// Avvia server web
server.begin();
// Inizializza WebSerialSim
webSerial.begin(&server);
webSerial.setCallback(onCommand);
webSerial.modestory(true); // Attiva history
webSerial.setbuffer(4096); // Buffer 4KB
webSerial.echoOnOff(true); // Echo su Serial
webSerial.println("WebSerialSim avviato!");
webSerial.printf("WiFi: %s\n", WiFi.localIP().toString().c_str());
}
void loop() {
webSerial.taskList(); // Non bloccante
// Tuoi task...
delay(10);
}http://<IP_ESP32>/serial
void begin(AsyncWebServer* mainServer);Registra le rotte web e avvia SSE.
void print(const char*);
void println(const char*);
void printf(const char* format, ...);
void printfWeb(const char* format, ...); // Diretto a webvoid modestory(bool action); // Attiva/disattiva history
void setbuffer(size_t _dimbuffer); // Imposta dimensione buffer (byte)
void fViewHistory(); // Visualizza contenuto buffer
void fHistoryClear(); // Svuota buffer
void fHistoryFlush(); // Salva buffer su SD
void infoSerBuf(); // Mostra statistichebool inputEXT(char* inExt, int lenb); // Input esterno (Bluetooth)
void setCallback(CallbackFunzione cb); // Callback per comandi
void echoOnOff(bool onoff); // Echo su Serial
void taskList(); // Main task (non bloccante)bool checkClientSSE(); // Ci sono client connessi?
bool canSendSSE(size_t requiredSpace); // Spazio disponibile?| Endpoint | Metodo | Descrizione |
|---|---|---|
/serial |
GET | Pagina HTML del terminale |
/view-buffer |
GET | Scarica la cronologia completa |
/get-clientcount |
GET | Numero di client SSE connessi |
/parsingCmd |
POST | Invia comandi remoti |
/events/serial |
SSE | Stream dati (evento: serial_print, client_count) |
curl -X POST http://192.168.1.100/parsingCmd \
-H "Content-Type: text/plain" \
-d "1070340744:HISTORY INFO"
# Format: <clientID>:<comando>#define MAXSIZEBUFFER_HISTORY 4000 // Piccolo (SRAM)
// oppure
#define MAXSIZEBUFFER_HISTORY 65536 // Grande (PSRAM)
// oppure
#define MAXSIZEBUFFER_HISTORY 0 // Scrittura diretta su SD (senza RAM buffer)# platformio.ini
build_flags =
-D HISTORY_SD # Scrive su SD (/history.txt)
# -D HISTORY_SDMMC # Scrive su SD_MMC
# -D HISTORY_LittleFS # Scrive su LittleFSbuild_flags = -D BUFFER_PSRAMRichiede psramFound() e ps_malloc() (built-in su Arduino ESP32).
void bleOutput(char* data) {
// Invia data al modulo BLE
}
#define OUTBLE
webSerial.setCallBLE(bleOutput);β οΈ Attenzione buffer too small ..almeno 1500
Soluzione: aumenta MAXSIZEBUFFER_HISTORY a >= 1500 byte.
Controlla:
- ESP32 e browser sulla stessa rete WiFi
- Firewall blocca porta 80
server.begin()Γ¨ stato chiamato prima diwebSerial.begin(&server)- Browser supporta SSE (edge, firefox, chrome OK; IE 11 NO)
Cause comuni:
- Buffer troppo piccolo β aumenta
MAXSIZEBUFFER_HISTORY - PSRAM non rilevata β disabilita
BUFFER_PSRAMse non disponibile - Stack overflow β riduci altre allocazioni
Soluzione:
webSerial.setbuffer(8192); // Aumenta buffer
webSerial.modestory(true); // Attiva history
// o usa SD:
#define MAXSIZEBUFFER_HISTORY 0 // Scrittura diretta su SDAssicurati di chiamare taskList() regolarmente nel loop:
void loop() {
webSerial.taskList(); // β OBBLIGATORIO
// altri task
}- Timestamp automatico per ogni linea di log
- Regex/filter real-time nel frontend (search)
- Color coding (ANSI escape codes per ERROR/WARN/DEBUG)
- Export CSV della history
- Statistiche in tempo reale (bytes/sec, uptime)
- Dark/Light mode nell'interfaccia web
- Mobile-responsive UI
MIT License β Vedi LICENSE per dettagli.
Feedback, bug report e PR sono benvenuti!
- Apri una Issue per bug o feature request
- Fai un fork e crea un branch:
git checkout -b feature/nome-feature - Commit:
git commit -am 'Add feature: ...' - Push:
git push origin feature/nome-feature - Apri una Pull Request
- π Vedi la sezione API Reference sopra
- π Apri un'issue su GitHub
- π¬ Discussioni: GitHub Discussions (coming soon)
Sviluppato per ESP32 debugging e monitoraggio remoto di dispositivi embedded.
Made with β€οΈ for makers & embedded engineers