# Miracast-Sender für Linux

Spiegelt den Bildschirm auf einen Fernseher, der im Screen-Mirroring-Modus auf
eine Verbindung wartet. Am Fernseher muss nichts eingetippt werden.

```bash
sudo ./miracast-cast check     # Voraussetzungen prüfen
sudo ./miracast-cast scan      # Fernseher suchen
sudo ./miracast-cast cast      # verbinden und spiegeln
```

## Warum das hier bessere Chancen hat als die Android-App

Damit ein Fernseher eine Miracast-Sitzung annimmt, muss sich der Sender als
*Wi-Fi-Display-Quelle* ausweisen – ein besonderes Kennzeichen in den
WLAN-Suchpaketen. Auf Android ist das `CONFIGURE_WIFI_DISPLAY` und bleibt
Systemapps vorbehalten; genau daran scheitert die App dort.

Unter Linux lässt sich dasselbe über `wpa_supplicant` setzen:

```
SET wifi_display 1
WFD_SUBELEM_SET 0 0006 0010 1c44 0032
                       │    │    └── 50 Mbit/s Durchsatz
                       │    └─────── Port 7236 für die Steuerverbindung
                       └──────────── Typ „Quelle“, Sitzung verfügbar
```

Deshalb sollte der Fernseher uns hier als das erkennen, was wir sind.

## Voraussetzungen

* WLAN-Karte, die Wi-Fi Direct beherrscht (`iw list` muss `P2P-GO` und
  `P2P-client` aufführen)
* `wpa_supplicant` mit erreichbarem Control-Socket
* `ffmpeg`
* Rootrechte (der Control-Socket gehört root)
* Ein DHCP-Client (`dhclient`, `udhcpc` oder `dhcpcd`) – in der
  Wi-Fi-Direct-Gruppe holt sich der Rechner darüber seine Adresse

Verwaltet NetworkManager die WLAN-Karte, muss er sie loslassen:

```bash
nmcli device set wlan0 managed no
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant/wpa_supplicant.conf -C /run/wpa_supplicant
```

## Nützliche Schalter

| Schalter | Wirkung |
|---|---|
| `--source test` | schickt ein Testbild statt des Bildschirms – gut zum Ausprobieren |
| `--source x11` / `--display :0` | bestimmter X11-Bildschirm |
| `--source kms` | für Wayland-Sitzungen (braucht erweiterte Rechte) |
| `--bitrate 12` | Bitrate in Mbit/s |
| `--max-height 720` | begrenzt die Auflösung, spart Funkbandbreite |
| `--peer AA:BB:…` | direkt eine bekannte MAC ansprechen, ohne Suche |
| `-v` | ausführliche Ausgabe samt RTSP-Verkehr |

## Wie es abläuft

1. `wpa_supplicant` meldet uns als Wi-Fi-Display-Quelle an
2. Wi-Fi Direct sucht Geräte; Fernseher melden sich als „Bildschirm“
3. **Zuerst** öffnet sich der Steuerkanal auf Port 7236 – der Fernseher meldet
   sich nämlich von sich aus, sobald die Gruppe steht
4. `P2P_CONNECT` baut die Direktverbindung auf, DHCP liefert die Adresse
5. Der Fernseher ruft an; es folgt der Handshake M1–M7 mit Formatabsprache
6. `ffmpeg` nimmt auf, wandelt in H.264, verpackt in MPEG-TS und schickt es
   als RTP hinüber

## Tests

```bash
python3 -m unittest discover -s tests -v
```

Der Durchlauf in `tests/test_end_to_end.py` baut einen Fernseher nach, der sich
wie ein echtes Gerät verhält: Er ruft an, führt den kompletten Handshake und
empfängt anschließend echtes Video, das mit `ffprobe` geprüft wird. Nicht
abgedeckt ist die Wi-Fi-Direct-Verbindung selbst – dafür braucht es
WLAN-Hardware.
