# ESP32 SIP Client mit Headset-Unterstützung Ein SIP-Telefon basierend auf ESP32 mit Headset-Unterstützung. Entwickelt für Thin-Client-Umgebungen ohne nativen CTI-Support. ## Zwei Hardware-Varianten Aufgrund der Hardware-Unterschiede zwischen ESP32-Chips gibt es zwei Versionen: | Variante | Chip | Headset-Typ | USB OTG | Bluetooth Classic | |----------|------|-------------|---------|-------------------| | **USB-Version** | ESP32-S3 | USB Headsets | Ja | Nein | | **Bluetooth-Version** | ESP32 (WROOM) | BT Headsets | Nein | Ja (HFP) | **Wichtig:** - ESP32-S3 hat **kein** Bluetooth Classic (nur BLE) → nur USB-Headsets - ESP32 WROOM hat **kein** USB OTG → nur Bluetooth-Headsets ## Features - **WiFi-Konfiguration** - Automatischer Hotspot-Modus wenn keine WLAN-Daten konfiguriert - Web-basierte Konfiguration (SSID: `ESP32-SIP-Phone`, IP: `192.168.4.1`) - DHCP oder statische IP-Konfiguration - Automatischer Fallback zu Hotspot bei Verbindungsproblemen - **USB Headsets** (nur ESP32-S3) - USB Audio Class Unterstützung - USB-C direkter Anschluss oder USB-A mit Adapter - Automatische Erkennung - **Bluetooth Headsets** (nur ESP32 WROOM) - HFP (Hands-Free Profile) Unterstützung - Mehrere Geräte pairen (>5 möglich) - Auto-Connect für bekannte Geräte - Headset-Tasten: Annehmen, Auflegen, Lautstärke - **SIP/VoIP** - SIP-Registrierung an TK-Anlage - Eingehende und ausgehende Anrufe - G.711 µ-law und A-law Codec - Digest Authentication - **Weboberfläche** - Status-Übersicht - WLAN-Konfiguration mit Scan - SIP-Einstellungen - Bluetooth-Geräte-Management (nur WROOM) - System-Einstellungen (Neustart, Werksreset) ## Hardware ### USB-Version (ESP32-S3) **Board:** - ESP32-S3-DevKitC-1 (oder ähnlich mit USB OTG) - Mindestens 4MB Flash - Optional: PSRAM für bessere Audio-Pufferung **Anschlüsse:** - USB-C (USB OTG): Für USB-Headsets - WLAN: 2.4GHz WiFi ### Bluetooth-Version (ESP32 WROOM) **Board:** - ESP32-DevKitC oder ESP32-WROOM-32 - Mindestens 4MB Flash **Anschlüsse:** - WLAN: 2.4GHz WiFi - Bluetooth: Integriert (Classic + BLE) ## Installation ### ESP-IDF 5 installieren #### Linux (Ubuntu/Debian) ```bash # Abhängigkeiten installieren sudo apt-get update sudo apt-get install git wget flex bison gperf python3 python3-pip python3-venv \ cmake ninja-build ccache libffi-dev libssl-dev dfu-util libusb-1.0-0 # ESP-IDF klonen mkdir -p ~/esp cd ~/esp git clone -b v5.2.2 --recursive https://github.com/espressif/esp-idf.git # Tools installieren (für beide Targets) cd ~/esp/esp-idf ./install.sh esp32,esp32s3 # Umgebung aktivieren (in jeder neuen Shell) . ~/esp/esp-idf/export.sh ``` #### Arch Linux ```bash # Abhängigkeiten sudo pacman -S --needed gcc git make flex bison gperf python cmake ninja ccache dfu-util libusb # Rest wie oben mkdir -p ~/esp && cd ~/esp git clone -b v5.2.2 --recursive https://github.com/espressif/esp-idf.git cd esp-idf && ./install.sh esp32,esp32s3 . ~/esp/esp-idf/export.sh ``` #### Windows 1. [ESP-IDF Tools Installer](https://dl.espressif.com/dl/esp-idf/) herunterladen 2. Installer ausführen, ESP-IDF v5.2.x auswählen 3. "ESP-IDF PowerShell" oder "ESP-IDF CMD" aus Startmenü öffnen #### macOS ```bash # Xcode Command Line Tools xcode-select --install # Homebrew Abhängigkeiten brew install cmake ninja dfu-util python3 # ESP-IDF klonen und installieren mkdir -p ~/esp && cd ~/esp git clone -b v5.2.2 --recursive https://github.com/espressif/esp-idf.git cd esp-idf && ./install.sh esp32,esp32s3 . ~/esp/esp-idf/export.sh ``` ### Umgebung dauerhaft aktivieren (optional) ```bash # In ~/.bashrc oder ~/.zshrc einfügen: alias get_idf='. ~/esp/esp-idf/export.sh' ``` Dann mit `get_idf` aktivieren. ### Build für ESP32-S3 (USB-Version) ```bash # ESP-IDF Umgebung aktivieren . ~/esp/esp-idf/export.sh # In Projektverzeichnis wechseln cd /pfad/zu/bluetooth-sip-client # Target setzen und bauen idf.py set-target esp32s3 idf.py build flash monitor ``` ### Build für ESP32 WROOM (Bluetooth-Version) ```bash # ESP-IDF Umgebung aktivieren . ~/esp/esp-idf/export.sh # In Projektverzeichnis wechseln cd /pfad/zu/bluetooth-sip-client # sdkconfig.defaults für ESP32 kopieren cp sdkconfig.defaults.esp32 sdkconfig.defaults # Target setzen und bauen idf.py set-target esp32 idf.py build flash monitor ``` **Tastenkürzel im Monitor:** - `Ctrl+]` - Monitor beenden - `Ctrl+T` dann `Ctrl+R` - Reset ### Clean Rebuild Bei Problemen oder nach Änderungen an Dependencies: ```bash rm -rf build managed_components dependencies.lock sdkconfig # Dann nochmal set-target und build ``` ## Ersteinrichtung 1. **ESP32 mit Strom versorgen** - LED sollte nach Boot leuchten 2. **Mit Hotspot verbinden** - SSID: `ESP32-SIP-Phone` - Passwort: `sip-phone-setup` 3. **Weboberfläche öffnen** - Browser: `http://192.168.4.1` 4. **WLAN konfigurieren** - Tab "WLAN" → Netzwerk auswählen → Verbinden 5. **SIP konfigurieren** - Tab "SIP" → Server, Benutzername, Passwort eingeben 6. **Headset verbinden** - USB-Version: USB-Headset einstecken - Bluetooth-Version: Headset in Pairing-Modus → Tab "Bluetooth" → Gerät pairen ## API Endpoints | Endpoint | Methode | Beschreibung | |----------|---------|--------------| | `/api/status` | GET | Gesamtstatus | | `/api/wifi/config` | GET/POST | WLAN-Konfiguration | | `/api/wifi/scan` | GET | WLAN scannen | | `/api/sip/config` | GET/POST | SIP-Konfiguration | | `/api/bluetooth/devices` | GET | Gepaarte BT-Geräte | | `/api/bluetooth/scan` | POST | BT-Scan starten | | `/api/bluetooth/pair` | POST | Gerät pairen | | `/api/call/answer` | POST | Anruf annehmen | | `/api/call/hangup` | POST | Anruf beenden | | `/api/system/reboot` | POST | Neustart | | `/api/system/factory-reset` | POST | Werksreset | ## Projektstruktur ``` bluetooth-sip-client/ ├── CMakeLists.txt ├── sdkconfig.defaults # ESP32-S3 (USB) ├── sdkconfig.defaults.esp32 # ESP32 WROOM (Bluetooth) ├── partitions.csv └── main/ ├── main.c # Hauptprogramm ├── config/ │ ├── config_manager.h # Konfiguration Header │ └── config_manager.c # NVS-basierte Config ├── wifi/ │ ├── wifi_manager.h # WiFi Header │ └── wifi_manager.c # WiFi AP/STA Manager ├── web/ │ ├── web_server.h # Webserver Header │ ├── web_server.c # HTTP Server │ ├── web_api.h # API Header │ ├── web_api.c # REST API │ └── static/ # Web UI │ ├── index.html │ ├── style.css │ └── app.js ├── bluetooth/ # Nur aktiv auf ESP32 WROOM │ ├── bt_manager.h # BT Manager Header │ ├── bt_manager.c # BT Geräteverwaltung │ ├── bt_hfp.h # HFP Header │ └── bt_hfp.c # HFP Audio Gateway ├── usb_audio/ # Nur aktiv auf ESP32-S3 │ ├── usb_audio_host.h # USB Audio Header │ └── usb_audio_host.c # USB Audio Class Host ├── audio/ │ ├── audio_router.h # Audio Router Header │ └── audio_router.c # Audio Routing └── sip/ ├── sip_client.h # SIP Client Header ├── sip_client.c # SIP UA Implementation ├── sip_parser.h # SIP Parser Header └── sip_parser.c # SIP Message Parser ``` ## Einschränkungen - **ESP32-S3**: Kein Bluetooth Classic - nur USB-Headsets möglich - **ESP32 WROOM**: Kein USB OTG - nur Bluetooth-Headsets möglich - **Bluetooth**: Maximal 3-4 gleichzeitig aktive Verbindungen - **USB Audio**: Grundlegende UAC1 Unterstützung - **Codecs**: Aktuell nur G.711 (PCMU/PCMA) - **SRTP**: Nicht unterstützt (nur unverschlüsseltes RTP) ## Troubleshooting ### Kein WLAN nach Konfiguration - Gerät neu starten - Hotspot sollte nach 30 Sekunden automatisch starten ### Bluetooth Headset verbindet nicht (nur WROOM) - Headset zurücksetzen und erneut pairen - Andere Bluetooth-Verbindungen am Headset trennen ### USB Headset wird nicht erkannt (nur S3) - USB-Kabel prüfen (muss Datenkabel sein, nicht nur Ladekabel) - Anderes USB-Headset testen ### Kein Audio bei Anruf - Audio-Routing prüfen im Status-Tab - Headset-Verbindung prüfen ## Lizenz MIT License