WifiRemote

WifiRemote

WifiRemote ist ein Plugin für die Media Center Open Source Software MediaPortal, welches einen Socket Server öffnet und Clients erlaubt MediaPortal fernzusteuern aber gleichzeitig auch Informationen über das aktuelle Geschehen im Media Center zu erhalten.

MediaPortal selbst ist ein Fork des bekannten XBMC (inzwischen in „Kodi“ umbenannt). Es wurde vor allem durch den TV Server bekannt, eine Komponente, die das ansehen und verteilen von Live TV im Netzwerk erlaubt. MediaPortal läuft auf Windows und ist in C# geschrieben. Bei meiner damaligen Recherche habe ich viele Media Center Programme durch probiert und bin bei MediaPortal hängen geblieben, da es gut funktionierte, durch ein ausgeklügeltes Plugin System sehr erweiterbar ist und es eine extrem aktive und hilfsbereite Community gab. MediaPortal ist auch der Grund, warum noch größere Teile meines Heimnetzes auf Windows laufen.

Warum WifiRemote?

Ich wollte mir mit einem privaten Projekt die Programmierung von iOS Apps näher bringen. Dieses Projekt sollte eine Fernbedienungsapp für MediaPortal werden. Diese App musste sich aber zu irgendetwas verbinden und da MediaPortal dies von Haus aus nicht unterstützte habe ich mit der Entwicklung von WifiRemote angefangen. Es war dabei von vornerein klar, dass es, ganz im Stil von MediaPortal selbst, ein Open Source Projekt werden sollte. Der Name leitete sich dann aus dem her, was das Plugin ermöglichen sollte: Dass sich eine Fernbedienung per WLAN zu MediaPortal verbinden.

Was kann WifiRemote?

WifiRemote wartet nach dem Start von MediaPortal auf einem definierten Port auf Socket Verbindungen. Hat sich ein Client verbunden und authentifiziert wird der aktuelle Status von MediaPortal an alle Clients geschickt (welches Menü wird angezeigt, wird gerade etwas abgespielt, wie ist die Lautstärke, …) und von den einzelnen Clients empfangene Kommandos werden an MediaPortal weiter geleitet oder in Aktionen in MediaPortal umgesetzt. Die Bandbreite der Kommandos ist dabei sehr groß, hier nur einige Beispiele:

  • Navigation in Menüs (hoch, runter, links, rechts, Ok, zurück, …)
  • Anzeige und Kontrolle von Menüs, Listen und Dialogen in den Clients
  • Steuerung des Players (Play, Pause, Vollbild, Menü, Untertitel, Lautstärke, …)
  • Starten der Wiedergabe von bestimmten Medien
  • Kontrolle der MediaPortal Playlisten
  • Öffnen von anderen Plugins
  • Übertragung eines aktuellen Screenshots von MediaPortal an den Client
  • Anzeige eines vom Client gesendeten Textes auf MediaPortal, mit einfachem Rückkanal

Was ist die technische Basis?

WifiRemote ist ein MediaPortal Process Plugin (d.h. es läuft direkt nach Programmstart im Hintergrund mit und hat keine eigene UI). Es öffnet einen SocketServer, der viele Verbindungen annehmen kann.

Ich habe mich hierbei für Sockets entschieden, da ich einen permanent geöffneten Hin- und Rückkanal zwischen Clients und MediaPortal erreichen wollte. Das wäre mit einem normalen HTTP REST Service nicht so einfach möglich gewesen. Diese Socket Verbindung ist auch das größte Hindernis für neue Client Entwickler, hier wird oft mit einem normalen Webservice gerechnet.

Server und Client unterhalten sich über kleine JSON Nachrichten. Die vom Client an den Server geschickten Nachrichten nenne ich dabei „Commands„, die vom Server an die Clients geschickten Nachrichten sind „Messages„. Ich hatte hier zunächst andere Technologien, wie zum Beispiel Google Protocol Buffers, untersucht. Damit wollte ich die zu übertragende Datenmenge möglichst gering halten. Die verfügbaren Libraries waren damals aber alle noch nicht wirklich ausgereift, weshalb ich dann auf das bekannte und gut unterstützte JSON zurück gegriffen habe.

Ein wichtiges Ziel bei der WifiRemote Entwicklung war es, die Einrichtung und Verbindung für den Nutzer so einfach wie möglich zu machen. Aus diesem Grund (und weil ich die Technologie cool fand) beinhaltet WifiRemote einen Apple Bonjour Server, durch den die Präsenz von WifiRemote im lokalen Netzwerk verbreitet wird. Clients wie CouchPotato können sich so ohne Eingabe von IP Adressen oder ähnlichen mit WifiRemote verbinden. Falls Bonjour noch nicht auf dem Windows Rechner installiert ist kann man dies leicht über einen Button im WifiRemote Setup nachholen.

Ist WifiRemote ein Erfolg?

Ich habe eine ganze Menge bei der Entwicklung gelernt und auch jede Menge Spass dabei gehabt. Das Plugin wird nicht nur von Nutzern meiner eigenen App genutzt, es gibt inzwischen auch einige andere Clients dafür. Auch für MediaPortal 2 hat sich jemand dem Projekt angenommen und arbeitet an einem Nachfolger.

Auch das opensources des Codes war eine gute Entscheidung. So habe ich einige Unterstützung durch andere MediaPortal Plugin Entwickler erhalten (vor allem zu erwähnen sind dabei DieBagger und johanj). Die Frage aus der Überschrift ist damit, entgegen Betteridge’s law of headlines mit „Ja“ zu beantworten.

Eingesetzte Technologien

  • C#
  • Sockets
  • XML
  • JSON
  • Bonjour
  • MediaPortal Plugins
  • Windows Forms