first commit
This commit is contained in:
@@ -0,0 +1,81 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user