SteamAutoStarter: Steam automatisch über den SteamLink starten

Seit einiger Zeit bin ich der stolze Besitzer eines (gebrauchten) SteamLinks. Das ist ein kleine Hardware-Box (oder alternativ eine Software für den Raspberry Pi o.ä.), mit der sich Steam-Spiele über Netzwerk an einen Fernseher streamen lassen. Das funktioniert erstaunlich gut (vor allem für eher „langsame“ Spiele, bei mir aktuell vor allem „The Witness„). Logischerweise funktioniert das ganze aber natürlich nur, wenn Steam auf dem Computer schon läuft. Wenn man sich also nicht erst an den Computer setzen will, um Steam zu starten, muss Steam also im Autostart sein. Für reine Gaming-PCs dürfte das kein großes Problem sein, da ich meinen Rechner auf vor allem für die Arbeit benutze, kam das für mich eigentlich nicht in Frage.

Auftritt: SteamAutoStarter! Ich habe daher ein kleines Tool gebaut, was erkennt wenn der SteamLink versucht sich mit Steam zu verbinden. Wenn ein solcher Verbindungsversuch erkannt wird, startet das Tool Steam und beendet sich selbst. Einfach aber effektiv 🙂 Natürlich muss das Tool dafür selbst im Autostart liegen, aber es verbraucht deutlich weniger Ressourcen als der komplette Steam-Client.

Alle weiteren Informationen zu dem Tool sind auf GitHub zu finden.

Implementierung

Für die Interessierten ein paar Hinweise zur Implementierung: Der SteamLink verwendet das Steam In-House Streaming Discovery Protocol um laufende Installation von Steam zu erkennen. Das Protokoll ist relativ überschaubar aufgebaut, und wurde in diesem Blog-Post reverse-engineered. Kurze Übersicht:

  • Die Kommunikation erfolgt per UDP/IPv4 auf Port 27036
  • Alles Angaben sind in Little-Endian
  • Jede Nachricht beginnt mit 0xA05F4C21FFFFFFFF
  • Nun folgenden Header und Body, jeweils mit einen 4-Byte-Präfix mit der Länge
  • Der Header ist eine CMsgRemoteClientBroadcastHeader ProtoBuf-Message
  • Der Body ist eine ProtoBuf-Message, je nach Angabe im Header
  • Für das Client-Discovery dient die Message CMsgRemoteClientBroadcastDiscovery mit dem Header-Typ k_ERemoteClientBroadcastMsgDiscovery

Die nötigen ProtoBuf-Dateien gibt es auf GitHub. Schlussendlich würde es vermutlich locker reichen, einfach auf Port 27036 zu lauschen, und optional noch zu prüfen, ob die ersten acht Bytes eines Pakets 0xA05F4C21FFFFFFFF sind. Ich habe es etwas umständlicher gemacht, und die Nachrichten über protbuf-net wirklich komplett deserialisiert, und überprüft, dass es sich wirklich um eine Discovery-Nachricht handelt.

Wenn eine korrekte Nachricht erkannt wurde, wird Steam gestartet. Das geht am einfachsten und unabhängig von dem Installationsort über das Steam Browser Protcol, genau genommen über die URL steam:.

Sobald Steam gestartet wurde, beendet sich das Programm selbst. Das ist nötig, damit der Port 27036 wieder freigegeben wird, und Steam sich selbst an diesen Port binden kann. Leider ist es nicht so trivial, zu erkennen, wann Steam beendet wurde, daher diese einfache, aber effektive Lösung 🙂 Das führt natürlich dazu, dass der Autostart nicht mehr funktioniert, bis der Rechner neu gestartet wurde, das war für mich aber kein Problem, da ich den Rechner über den SteamLink eigentlich immer komplett ausschalte.

Zwei kleine Tipps noch: Für das Steam In-Home Streaming Discovery Protocol gibt es einen kompletten Wireshark Dissector, nützlich beim Debugging. Ebenfalls über Wireshark festgestellt: Wenn der SteamLink über Ethernet verbunden ist, sendet er automatisch Wake-on-LAN Pakete, wenn er den Ziel-Rechner nicht erreichen kann. Theoretisch müsste man den Rechner also vorher nicht mal einschalten. Leider macht die Ethernetverbindung bei mir Probleme, über Wifi läuft es stabiler…

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.