Velxio emula WiFi y Bluetooth (BLE) en el ESP32 usando el fork de QEMU de lcgamboa con soporte de red slirp. Cada instancia de emulación obtiene su propia red NAT aislada — ideal para múltiples usuarios simultáneos.
## Tabla de Contenidos
- [Arquitectura General](#arquitectura-general)
- [Cómo Funciona](#cómo-funciona)
- [Red WiFi Virtual](#red-wifi-virtual)
- [Detección Automática de WiFi](#detección-automática-de-wifi)
Cada instancia de QEMU ejecuta su propia red WiFi emulada usando **slirp** (user-mode networking):
- **Sin configuración de red del host** — no requiere TAP, bridge, ni permisos de administrador
- **Aislamiento por usuario** — cada sesión de emulación tiene su propia red `192.168.4.0/24`
- **Acceso a internet** — el ESP32 emulado puede hacer peticiones HTTP, DNS, etc. vía NAT del host
- **SSID principal**: `Velxio-GUEST` (canal 6, abierto, sin contraseña)
QEMU emula la capa MAC 802.11 completa: beacons, scan, asociación y DHCP. El firmware ESP-IDF del ESP32 interactúa con el hardware WiFi emulado exactamente como lo haría con hardware real.
### Detección Automática de WiFi
Cuando presionas "Run" en el editor, Velxio escanea automáticamente tu código buscando patrones WiFi:
```typescript
// Patrones detectados:
'#include <WiFi.h>'
'#include <esp_wifi.h>'
'#include "WiFi.h"'
'WiFi.begin('
```
Si se detecta cualquiera de estos, se activa `wifi_enabled=true` automáticamente — no necesitas configurar nada.
Velxio detecta el uso de BLE en tu sketch y muestra el estado de inicialización:
```typescript
// Patrones BLE detectados:
'#include <BLEDevice.h>'
'#include <esp_bt.h>'
'BLEDevice::init('
```
El estado BLE se muestra en el canvas del simulador (ícono Bluetooth azul).
> **Nota**: BLE es solo detección — el firmware inicializa BLE correctamente pero la comunicación BLE real (scan, connect, notify) no está emulada. Esto se debe a que el fork de QEMU de lcgamboa no implementa VHCI (Virtual HCI controller).
---
## Cómo Usar
### WiFi Básico
1.**Escribe tu sketch** usando `#include <WiFi.h>`
2.**Usa el SSID `Velxio-GUEST`** (sin contraseña)
3.**Presiona Run** — WiFi se activa automáticamente
4.**Observa el Serial Monitor** — verás los logs de conexión ESP-IDF
5.**Mira el ícono WiFi** en el canvas del simulador
```cpp
#include <WiFi.h>
void setup() {
Serial.begin(115200);
WiFi.begin("Velxio-GUEST", "");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConectado!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
void loop() {
delay(1000);
}
```
**Salida esperada en Serial Monitor:**
```
I (432) wifi:wifi sta start
I (500) wifi:new:Velxio-GUEST, old: , ASSOC
I (800) wifi:connected with Velxio-GUEST, aid = 1, channel 6
I (1200) esp_netif_handlers: sta ip: 192.168.4.15, mask: 255.255.255.0
...
Conectado!
IP: 192.168.4.15
```
### Servidor HTTP
```cpp
#include <WiFi.h>
#include <WebServer.h>
const char* ssid = "Velxio-GUEST";
const char* password = "";
WebServer server(80);
void handleRoot() {
server.send(200, "text/html", "<h1>Hola desde ESP32 🚀</h1>");
}
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
Serial.print("Conectando");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConectado!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.begin();
Serial.println("Servidor HTTP iniciado");
}
void loop() {
server.handleClient();
}
```
Una vez que el Serial Monitor muestre "Servidor HTTP iniciado", puedes acceder al servidor del ESP32 a través del IoT Gateway.
| **SSID fijo** | Debes usar `"Velxio-GUEST"` (sin contraseña). No puedes crear tu propio AP ni usar otro SSID para conectar. |
| **Sin WPA/WPA2** | La red es abierta. El firmware puede intentar cifrado pero no se verificará. |
| **Sin ICMP (ping)** | `ping` no funciona — es una limitación de slirp. Usa TCP/HTTP para verificar conectividad. |
| **MAC fija** | Todas las instancias usan `24:0a:c4:00:01:10` por defecto. Configurable vía eFuse emulado pero no expuesto en UI. |
| **Sin modo AP** | El ESP32 no puede crear su propio Access Point — solo modo Station (STA). |
| **Sin ESP-NOW** | Comunicación peer-to-peer entre ESP32s no soportada. |
| **Sin mDNS funcional** | `mDNS.begin("esp32")` puede compilar pero no resuelve nombres en la red emulada. |
| **Puerto HTTP 80 solamente** | El hostfwd solo mapea al puerto 80 del ESP32. Servidores en otros puertos no son accesibles vía IoT Gateway. |
### Bluetooth / BLE
| Limitación | Detalle |
|------------|---------|
| **Solo detección** | BLE se inicializa correctamente (el firmware ejecuta `BLEDevice::init()`, crea servicios y characteristics) pero no hay comunicación real. |
| **Sin VHCI** | El fork de QEMU de lcgamboa no implementa Virtual HCI. No hay transporte BLE real entre host y emulador. |
| **Sin scan BLE** | `BLEScan` no encontrará dispositivos. |
| **Sin notify/indicate** | Las characteristics se crean pero los callbacks de notify/indicate no se disparan. |
| **Sin Classic Bluetooth** | Solo BLE es detectado. Bluetooth Classic (SPP, A2DP, etc.) no está soportado. |
### Generales
| Limitación | Detalle |
|------------|---------|
| **Requiere rebuild QEMU** | Para cambiar los APs disponibles o la configuración de red, necesitas recompilar `libqemu-xtensa` con `build_libqemu-esp32.sh`. |
| **Un servidor HTTP por instancia** | Cada sesión de emulación soporta un solo servidor HTTP (puerto 80). |
| **Latencia de red** | Las peticiones HTTP a través del IoT Gateway tienen latencia adicional por el doble proxy (browser → backend → QEMU → ESP32). |
---
## Archivos Modificados / Creados
### QEMU (C)
| Archivo | Cambio |
|---------|--------|
| `wokwi-libs/qemu-lcgamboa/hw/misc/esp32_wifi_ap.c` | Añadido SSID "Velxio-GUEST" al array de access points |
### Backend (Python)
| Archivo | Cambio |
|---------|--------|
| `backend/app/services/espidf_compiler.py` | **NUEVO** — Compilador ESP-IDF: traduce sketches Arduino WiFi/WebServer a ESP-IDF C nativo, compila con cmake+ninja, merge flash image |
- Verifica que tu board sea ESP32, ESP32-S3 o ESP32-C3
- Asegúrate de que tu sketch incluya `#include <WiFi.h>` o use `WiFi.begin(`
### WiFi se queda en "initializing"
- El firmware debe usar el SSID `"Velxio-GUEST"` — otros SSIDs no funcionarán
- No uses contraseña: `WiFi.begin("Velxio-GUEST", "")`
- Verifica en el Serial Monitor que QEMU muestra los logs ESP-IDF de WiFi
### No puedo acceder al servidor HTTP del ESP32
- Espera a que el Serial Monitor muestre "Server at:" o similar
- El IoT Gateway solo funciona con servidores en puerto 80
- Accede vía `/api/gateway/{client_id}/` no directamente al IP 192.168.4.15
### BLE no funciona completamente
- BLE solo es detección — la inicialización funciona pero no hay comunicación real
- El ícono BLE se pondrá azul cuando `BLEDevice::init()` se ejecute
- Para BLE real necesitarías un QEMU con soporte VHCI (no disponible en lcgamboa fork)
### ping no funciona
- Es una limitación de slirp — usa `HTTPClient` o `WiFiClient` para verificar conectividad
- Ejemplo: `http.begin("http://httpbin.org/get")` funciona, `ping google.com` no
### La compilación falla
- **ESP-IDF (producción)**: Los sketches ESP32 se compilan ahora con ESP-IDF 4.4.7 en lugar de arduino-cli. El backend traduce automáticamente Arduino WiFi/WebServer a ESP-IDF C nativo. Verifica que `IDF_PATH` esté configurado.
- **Fallback arduino-cli**: Si ESP-IDF no está disponible, se usa arduino-cli. Instala el core:
```bash
arduino-cli core install esp32:esp32@2.0.17
```
- El FQBN correcto es `esp32:esp32:esp32` (no `esp32:esp32:esp32dev`)