Android fernsteuern per USB

Hallo zusammen,
da ich in den nächsten Wochen recht viel Zeit habe, wollte ich mich mal wieder mit etwas beschäftigen was für mich neu ist. Mein Ziel ist es ein Programm (vorerst nur) für Windows und für Android zu schreiben, sodass ich mein Android Smartphone über USB (vllt auch später noch über LAN) fernsteuern kann. Jetzt stehe ich nur gerade da und hab überhaupt keine Ahnung wo ich genau anfangen soll.
Kann mir da jemand helfen und mir sagen, was ich überhaupt alles brauche bzw. verwenden sollte?
Wie drück ich es aus...also Android spezifische Sachen, wie den ganzen "Intent" Kram usw. brauch mir keiner erklären, der ist mir bekannt, aber was kann ich unter Android dafür überhaupt verwenden?
VNC basiert auf RFB, aber wenn das Ganze über USB laufen soll, habe ich keine derartigen Netzwerkschichten. Man könnte sicherlich die Pakete trotzdem so "einpacken", aber macht das überhaupt Sinn oder funktioniert das unter Android überhaupt? Wie gesagt, ist ein völlig neues Themengebiet für mich ;)

Alles mal kurz und knapp:
- Hauptintention ist es viel neues zu lernen, deswegen etwas wodrin ich so gut wie keine Ahnung habe
- Was steht mir zur Verfügung für die Systeme und was muss ich selber schreiben?
- Programmiersprache für die Windows Anwendung sollte Java(würde sich wohl anbieten wegen Android) oder C++ sein. Zur Not würde sich auch Ruby anbieten, falls es da zufällig etwas ganz tolles gibt was mir direkt weiterhilft :D
 
Ich nehme an, dass du die GUI fernsteuern möchtest[...]

Jap, genau ;).

Der Nachteil ist, dass du dafür root-Rechte brauchst und alles in Nativecode schreiben musst. Vorteil ist, dass es relativ simple ist und du wirklich das Handy fernsteuern kannst, als ob du es in der Hand hättest. Wenn du eine normale App schreiben würdest, könntest du halt nicht an andere Apps Input schicken.

root-Rechte brauchen aber alle Programme, die sowas implementieren oder? Webkey braucht das auch und nutzt laut Hilfe auch einen C++ Server dafür.

Nach deiner Hilfe und ein wenig googlen, sieht der Aufbau bis jetzt wie folgt aus und meine Frage ist, ob das alles so überhaupt funktioniert und wie zeitkritisch das alles ist:
Ich schreibe eine Android Java App die hauptsächlich die GUI dargestellt und einen Dienst starten kann. Der Dienst verbindet sich über die UsbManager und UsbAccessory mit dem PC. Der Dienst ruft dann nativen Code auf, der einen Screenshot erstellt und diesen dann an den Java Dienst zwecks USB Kommunikationen weiterleitet(*). Der Screenshot wird gesendet und sollte auf dem Screenshot gedrückt werden am PC, dann werden die Eingaben per USB gesendet und dort mithilfe von nativen Code, der am Android Gerät dann wieder aufgerufen wird, verarbeitet.

* Ist das so überhaupt möglich oder muss ich im nativen Code das Bild irgendwo zwischenspeichern, also auf dem Telefonspeicher?
 
Nach ein wenig rumexperimentieren und gegoogle:
Erste Problem ist/war, dass ich die API Funktionen für USB nicht nutzen kann, weil mein Smartphone schon sehr alt ist und dort offiziell nur Android 2.2 gibt. Mit einem Mod bin ich zwar auf 2.3.7, aber die Klassen dafür wurden erst ab 3.x eingeführt und nur rückwirkend bis 2.3 in den Google Add-Ons, die bei mir aber nicht vorhanden sind. Workaround ist jetzt wohl das hier: Android USB connection to PC | Seconds & pixels
Also über Sockets mithilfe von ADB.

Als nächstes frage ich mich wie ich am besten den Framebuffer aus /dev/graphics/fb0 umwandel. PNG Format zieht wahrscheinlich wieder langes lesen im RFC Standard nach sich, aber unter folgendem Link hab ich einen RGB zu PPM Code gefunden ffmpeg - how to convert 16-bit RGB Frame Buffer to a viewable format? - Stack Overflow
Der Framebuffer scheint bei mir im Format RGBX vorzuliegen, d.h. ich hab den Code einfach entsprechend geändert, dass er immer 4 Bytes ausliest und die ersten 3 Bytes für RGB benutzt und das letzte Byte einfach wegwirft. Natürlich auch noch Höhe und Breite angepasst ;). Kleine Frage am Rande, wenn ich jetzt 4 Bytes einlese, also 32 Bit, dann sollte
Code:
unsigned short pixel;
doch lieber ein unsigned int sein, weil ich sonst einen Überlauf in
Code:
fread(&pixel, 4, 1, infile);
habe oder?

Was mich zu dem nächsten Problem führt: In welcher Sprache schreibe ich am besten die Windows Anwendung? Die PPM Datei ist noch größer als der Framebuffer selbst, d.h. es wäre besser den Framebuffer an den PC zu schicken und dort umzuwandeln, vorallem da dort auch mehr Rechenleistung zur Verfügung steht, daher würde die Übertragung und die Berechnung des Bildes schneller gehen. Den Code für die Umwandlung ist aber in C geschrieben, aber die GUI würde für mich wesentlich einfacher in Java zu schreiben sein und die Verbindung zu dem Socket, dessen Code auch in Java ist, von Android auch. C Code mit "unsigned" in Java zu übertragen ist einfach eine riesen Qual, die ich mir nur ungern antun würde oder gibt es eine Möglichkeit den Framebuffer direkt mit Java Code anzeigen zu lassen ohne eine Umwandlung vorzunehmen? Zur Not würde es hier wieder ein Mix tun mit Java und nativen Code.
 
Meine zur Verfügung stehende Zeit schwankt irgendwie immer sehr, daher habe ich mich erst heute Nacht weiter drangesetzt.

Mein Problem ist zur Zeit, dass dieser Teil des Codes einfach zu lange braucht:
Code:
					before = System.currentTimeMillis();
					//Öffne den Framebuffer
					is = new FileInputStream(copiedFb0Path + "/fb0");
					os = client.getOutputStream();
					//Hole den OutputStream und lege einen Buffer an
					byte[] buffer = new byte[2048];
					int len = 0;
					//Lese Bytes in den Buffer und schreibe in den Output
					while ((len = is.read(buffer)) > 0)
						os.write(buffer, 0, len);
					is.close();
					os.close();
					client.close();
					Log.e("WRITEANDCLOSE", (System.currentTimeMillis() - before) + "");
Mit ca. 1 sec als Minimum und 3 sec als Maximum, dauert die Übertragung einfach viel zu lange. Jetzt würde ich gerne Wissen wie ich das optimieren kann, weil ich da wirklich nicht weiß, was man da tun kann
.
In nativen Code wirds sicherlich auch nicht schneller laufen oder? Daher fallen mir nur 2 Möglichkeiten ein:
a) Ich übertrage immer nur den Teil, der sich tatsächlich geandert hat. Könnte wohl kompliziert werden.

und/oder

b) Ich wandle den Framebuffer tatsächlich schon auf dem Android-Gerät in eine PNG o.ä. Datei um. Der Code wird wesentlich schneller sein als die Übertragung und die zu übertragende Datenmenge schrumpft von ca. 3-4MB auf 300-400 KB.

Sonst noch Ideen?

Vielen Dank
 
Hallo Tsjuder,

ich habe per zufall euer Gespräch gefunden.
Und benötige dringend das Programm das ihr entworfen habt.
Da mein Bildschirm heute kaputt gegangen ist und ich auf die schnelle
ein neues geholt habe und mich schon auf dem neuen Angemeldet habe
ich nicht mehr auf mein handy zurgreifen kann weil sich der Code zum
entsperren nicht eingeben lässt.
Per Samsungkonto geht es leider auch nicht und ich wahr so schlau die Kontakte auf dem Handy zu speicher die ich dringen brauche.

Würde mich über ein Feeback / Hilfe sehr freuen

Feundlichen Gruß
 
Hallo Dreamworker,
das ganze habe ich damals auf meinem alten Android Smartphone entwickelt und da mich dann doch wieder relativ schnell die Arbeit und Uni eingenommen hat, blieb für Freizeitcoden nicht mehr viel Zeit, sondern nur für andere Hobbies.
Daher ist da leider nix draus geworden, außer eben die Übertragung des Framebuffers.

Selbst wenn: Da du dein Smartphone nicht entsperrt bekommst, müsstest du irgendwie die App installieren und starten können. Wenn du die APK direkt über die USB Verbindung installierst, startet eine App direkt. Problem wird aber sein, dass ich nicht weiß, ob das auch geht wenn der Bildschirm gesperrt ist. Außerdem müsstest du das ADB Debugging schon angestellt haben, sonst musst du erst ins Menü und das aktivieren was dann irgendwie auf das Henne und Ei Problem hinausläuft :D.

Ohne ADB Debugging kann ich dir nur empfehlen mal da reinzugucken: http://www.android-hilfe.de/samsung-galaxy-s2-i9100-forum/151471-display-defekt-datensicherung.html
Gilt sicherlich auch für andere Samsung Smartphones mit Android ;)
 
Zurück
Oben