82 lines
3.1 KiB
Markdown
82 lines
3.1 KiB
Markdown
# 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.
|