Steuern Sie Ihren Laptop mit einem Android-Telefon mit Python, Twisted und Django

Veröffentlicht: 2022-03-11

Einführung

Es macht immer Spaß, Ihre Android- oder Python-Programmierkenntnisse unter Beweis zu stellen. Vor einiger Zeit dachte ich, es wäre cool, meinen Laptop über mein Android-Mobilgerät zu steuern. Denken Sie darüber nach: Remote-Laptop-Zugriff, einschließlich der Möglichkeit, Musik abzuspielen und anzuhalten, Programmieraufträge oder Downloads zu starten und zu stoppen usw., alles durch das Senden von Nachrichten von Ihrem Telefon. Ordentlich, oder?

Bevor Sie weiterlesen, bedenken Sie bitte, dass dies ein Lieblingsprojekt ist, das sich noch in einem frühen Stadium befindet – aber die grundlegende Plattform ist vorhanden. Durch das Zusammenkleben einiger Mainstream-Tools konnte ich mein Android-Telefon so einrichten, dass es meinen Laptop über einen Python-Interpreter steuert.

Übrigens: Das Projekt ist Open Source. Sie können den Client-Code hier und den Server-Code hier überprüfen.

Der Werkzeuggürtel für den Remote-Laptop-Zugriff: Python, Twisted, Django und Amarok

Dieses Projekt umfasst die folgenden Technologien, von denen einige Ihnen vielleicht vertraut sind, von denen einige sehr spezifisch für die anstehende Aufgabe sind:

  • Python 2.7+
  • Twisted: Ein hervorragendes ereignisgesteuertes Framework, das speziell für Netzwerk-Hacker entwickelt wurde.
  • Django: Ich habe v1.4 verwendet, daher müssen Sie den Speicherort einiger Dateien anpassen, wenn Sie eine niedrigere Version ausführen möchten.
  • Amarok: ein D-BUS (mehr dazu weiter unten) handhabbarer Mediaplayer. Dies könnte für andere solche Mediaplayer (Clementine, VLC oder alles, was MPRIS unterstützt) ausgeblendet werden, wenn Sie deren Messaging-Strukturen kennen. Ich habe mich für Amarok entschieden, weil es standardmäßig in meiner KDE-Distribution enthalten ist. Außerdem ist es schnell und einfach konfigurierbar.
  • Ein Android-Telefon, auf dem Python für Android installiert ist (mehr dazu weiter unten). Der Prozess ist ziemlich einfach – sogar für Py3k!
  • Remote Amarok und Remote Amarok Web.

Auf hohem Niveau

Auf hoher Ebene betrachten wir unser Android-Telefon als den Client und unseren Laptop als den Server. Ich werde diese Fernzugriffsarchitektur weiter unten ausführlich durchgehen, aber der grundlegende Ablauf des Projekts ist wie folgt:

  1. Der Benutzer gibt einen Befehl in den Python-Interpreter ein.
  2. Der Befehl wird an die Django-Instanz gesendet.
  3. Django gibt den Befehl dann an Twisted weiter.
  4. Twisted analysiert dann den Befehl und sendet einen neuen Befehl über D-Bus an Amarok.
  5. Amarok interagiert mit dem eigentlichen Laptop und steuert das Abspielen/Pausieren von Musik.

Erfahren Sie mit diesem Toolbelt, wie Sie einen Laptop mit Python, Twisted und Django steuern.

Lassen Sie uns jetzt einsteigen.

Python auf Android

Also fing ich eines guten Tages an, mir Python-Interpreter anzusehen, die ich auf meinem Android-Handy (damals Droid 2) ausführen konnte. Bald darauf entdeckte ich das hervorragende SL4A-Paket, das Python für Android zum Leben erweckte. Es ist ein wirklich raffiniertes Paket: Sie klicken auf ein paar Schaltflächen und plötzlich haben Sie eine fast voll funktionsfähige Python-Umgebung auf Ihrem Mobil- oder Tablet-Gerät, die sowohl Ihren guten alten Python-Code ausführen als auch auf die Android-API zugreifen kann (ich sage fast , weil einige Dinge wahrscheinlich fehlt und die Android-API ist nicht 100 % zugänglich, aber für die meisten Anwendungsfälle ausreichend).

Wenn Sie möchten, können Sie auch Ihre eigene Python-Distribution für die Ausführung auf Ihrem Android-Gerät erstellen, was den Vorteil hat, dass Sie dann jede gewünschte Version des Interpreters ausführen können. Der Prozess beinhaltet das Cross-Compiling von Python zur Ausführung auf ARM (der Architektur, die auf Android-Geräten und anderen Tablets verwendet wird). Es ist nicht einfach, aber sicherlich machbar. Wenn Sie bereit für die Herausforderung sind, schauen Sie hier oder hier nach.

Sobald Sie Ihren Interpreter eingerichtet haben, können Sie im Grunde alles tun, was Sie möchten, indem Sie Python mit der Android-API kombinieren, einschließlich der Fernsteuerung Ihres Laptops. Sie können beispielsweise:

  • SMS senden und lesen.
  • Interagieren Sie über urllib und andere Bibliotheken mit APIs von Drittanbietern im Internet.
  • Zeigen Sie native Look-and-Feel-Eingabeaufforderungen, sich drehende Dialoge und dergleichen an.
  • Ändern Sie Ihren Klingelton.
  • Spielen Sie Musik oder Videos ab.
  • Interagieren Sie mit Bluetooth – insbesondere dieses ebnet den Weg für viele Möglichkeiten. Zum Beispiel habe ich einmal damit herumgespielt, mein Telefon als Locker-Unlocker-Anwendung für meinen Laptop zu verwenden (z. B. meinen Laptop über Bluetooth zu entsperren, wenn mein Telefon in der Nähe war).

So funktioniert die Verwendung Ihres Telefons zur Steuerung Ihres Laptops

Die Architektur

Unsere Projektzusammensetzung ist wie folgt:

  • Eine clientseitige Anwendung, die auf Twisted basiert, wenn Sie den Servercode (unten) testen möchten, ohne die Django-Anwendung überhaupt ausführen zu müssen.

  • Eine serverseitige Django-Anwendung, die Befehle vom Android-Gerät einliest und an Twisted weiterleitet. So wie es aussieht, ist Amarok die einzige Laptop-Anwendung, mit der der Server interagieren kann (dh um Musik zu steuern), aber das ist ein ausreichender Proof-of-Concept, da die Plattform leicht erweiterbar ist.

  • Eine serverseitige Twisted-'Instanz', die mit dem Mediaplayer des Laptops über D-Bus kommuniziert und Befehle mitsendet, wenn sie von Django kommen (derzeit unterstütze ich 'nächste', 'vorherige', 'play', 'pause', „Stop“ und „Stumm“). Warum übergeben Sie die Befehle nicht einfach direkt von Django an Amarok? Die ereignisgesteuerten, nicht blockierenden Attribute von Twisted nehmen Ihnen die ganze harte Arbeit des Threadings ab (mehr unten). Wenn Sie daran interessiert sind, die beiden zu heiraten, sehen Sie hier.

Twisted ist exzellent, ereignisgesteuert und vielseitig. Es arbeitet mit einem Callback-System, zurückgestellten Objekten und einigen anderen Techniken. Ich würde Ihnen auf jeden Fall empfehlen, es auszuprobieren: Die Menge an Arbeit, die Sie durch die Verwendung von Twisted vermeiden, ist wirklich beeindruckend. Beispielsweise stellt es Boilerplate-Code für viele Protokolle bereit, einschließlich IRC, HTTP, SSH usw., ohne sich mit nicht blockierenden Mechanismen (Threads, Select usw.) befassen zu müssen.
  • Der clientseitige Android-Code, der mit einer benutzerdefinierten URL auf Ihr Gerät hochgeladen wird, um Ihre Django-Anwendung zu erreichen. Es ist erwähnenswert, dass dieser spezielle Codeabschnitt auf Python 2.7+ ausgeführt wird, einschließlich Py3k.

Was ist D-Bus?

Ich habe D-Bus mehrfach erwähnt, daher lohnt es sich wahrscheinlich, es ausführlicher zu diskutieren. Im Großen und Ganzen ist D-Bus ein Messaging-Bussystem für die einfache Kommunikation zwischen Anwendungen (z. B. auf einem Laptop-Computer und einem Android-Telefon) durch speziell gestaltete Nachrichten.

Es besteht hauptsächlich aus zwei Bussen: dem Systembus für systemweite Dinge; und der Sitzungsbus für Userland-Sachen. Typische Nachrichten an den Systembus wären „Hey, ich habe einen neuen Drucker hinzugefügt, benachrichtige meine D-Bus-fähigen Anwendungen, dass ein neuer Drucker online ist“, während eine typische Interprozesskommunikation (IPC) zwischen Anwendungen zur Sitzung gehen würde Bus.

Wir verwenden den Sitzungsbus, um mit Amarok zu kommunizieren. Es ist sehr wahrscheinlich, dass die meisten modernen Anwendungen (zumindest in Linux-Umgebungen) diese Art von Nachrichten unterstützen, und im Allgemeinen sind alle Befehle/Funktionen, die sie verarbeiten können, gut dokumentiert. Da jede Anwendung mit D-Bus-Unterstützung unter dieser Architektur gesteuert werden kann, sind die Möglichkeiten nahezu unbegrenzt.

Weitere Informationen finden Sie hier.

Hinter den Kulissen:

Nachdem Sie die gesamte Infrastruktur eingerichtet haben, können Sie die Android-Anwendung starten und sie wird in eine Endlosschleife eintreten, um eingehende Nachrichten zu lesen, sie mit einigen Plausibilitätsprüfungen zu verarbeiten und sie, falls gültig, an eine vordefinierte URL (dh die URL Ihrer Django-App), die wiederum die Eingabe verarbeitet und entsprechend handelt. Der Android-Client markiert die Nachricht dann als gelesen und die Schleife wird fortgesetzt, bis eine Nachricht mit dem genauen Inhalt „exitclient“ (clever, huh?) verarbeitet wird, in welchem ​​​​Fall der Client beendet wird.

Auf dem Server nimmt die Django-Anwendung einen zu verarbeitenden Befehl auf und prüft, ob er mit einer gültigen Anweisung beginnt. Wenn dies der Fall ist, verbindet es sich mit dem Twisted-Server (unter Verwendung von Telnetlib, um sich über Telnet zu verbinden) und sendet den Befehl weiter. Schließlich analysiert Twisted die Eingabe, wandelt sie in etwas um, das für Amarok geeignet ist, und lässt Amarok zaubern! Schließlich reagiert Ihr Laptop, indem er Songs abspielt, pausiert, überspringt usw.

Bezüglich der „vordefinierten URL“: Wenn Sie Ihren Computer aus der Ferne steuern möchten, muss dies eine öffentliche URL sein (erreichbar über das Internet). Beachten Sie, dass der Code derzeit keine Sicherheitsebene (SSL usw.) implementiert – solche Verbesserungen sind im Moment Übungen für den Leser.

Was kann ich sonst noch damit machen?

Bis jetzt sieht alles ganz einfach aus, oder? Sie fragen sich vielleicht: „Kann dies erweitert werden, um die raffinierte Funktion [X] zu unterstützen?“ Die Antwort lautet: Ja (wahrscheinlich)! Da Sie wissen, wie Sie mit Ihrem Telefon richtig mit Ihrem Computer interagieren, können Sie den serverseitigen Code nach Belieben ergänzen. Bevor Sie es wissen, werden Sie langwierige Prozesse auf Ihrem Computer aus der Ferne abschießen. Oder, wenn Sie mit der Elektronik zurechtkommen, könnten Sie eine Schnittstelle zwischen Ihrem Computer und Ihrem Lieblingsgerät bauen und dies über SMS-Anweisungen steuern („Mach mir Kaffee!“ kommt mir in den Sinn).

Was kommt als nächstes

Ich werde noch eine Weile mit meinem Android-Laptop-Steuerungsspielzeug spielen, seine Funktionen verbessern, Fehler beheben usw. Aber wenn Sie interessiert sind, würde ich mich freuen, wenn Sie helfen! Verzweigen Sie einfach das Repository und senden Sie alle Pull-Anforderungen.

Wenn Sie Fragen haben, senden Sie mir bitte eine E-Mail an [email protected] und ich helfe Ihnen gerne weiter.