App-Funktionen vom PC aufrufen

  • Antworten:8
  • Bentwortet
android tester
  • Forum-Beiträge: 29

19.04.2013, 08:13:39 via Website

Hallo wir brauchen mal wieder eure Hilfe,

hoffe wir haben nichts überlesen... Also bei meiner suchanfrage bin ich nur auf komplette fernsteuerung mit displayübertragung usw. gestoßen, unser Ziel ist jedoch ein anderes. Wir wollen gezielt einige Funktionen aus unserer App vom PC aus aufrufen, wahrscheinlich vereinfacht aus einem java-Programm, ansonsten auch gern C. Das ganze stelle ich mir halt vereinfacht am PC irgendwie so vor:
1meineApp.Appfunktion();

und dann wird auf dem Androiden halt einfach die Appfunktion(){} aufgerufen.
ist sowas prinzipiell möglich?
Die Schnittstelle ist dabei noch offen. Je nach dem, was sich am besten eignet, haben ein S3 als Testgerät also ist einiges möglich:
NFC, Bluetooth, USB, WiFi
Für die PC seite dürfte das dann ja kein problem sein, da entsprechende Schnittstellen einzurichten. USB wäre uns natürlich am liebsten, falls das geht.

Also was meint ihr ist es möglich und welche Schnittstelle eignet sich am besten?

Vielen dank schon mal, ist eine echt tolle Community

Antworten
android tester
  • Forum-Beiträge: 29

26.04.2013, 10:03:15 via Website

Hallo,

wir haben uns auch noch etwas weiter belesen und heraus gefunden, dass das ganze wohl mittels socket programmen gehen würde jedoch finden wir dazu keine guten erläuterungen und verstehen da irgendwie nicht wie das ganze funktionieren soll... man muss wohl einen Server einrichten aber den kann man auf dem PC oder auf dem Smartphone laufen lassen... was ist da sinnvoller?
Das ganze soll auch über USB möglich sein, der server muss dann eben auf ein Serial signal warten...

ALso ich tippe ja, dass es sinnvoller ist wenn das Smartphone als Server fungiert da es dann auf die befehle vom Client(PC) wartet und dann entsprechend ausführt. Kann das jemand so bestätigen?

Hat jemand schon mal damit gearbeitet und kann uns den Code für einen Groben Server / Clienten zeigen?

Danke schon mal ;)

Antworten
LitteM
  • Forum-Beiträge: 141

26.04.2013, 17:31:50 via Website

Das hier sollte als Echo-TCP-server funktionieren. Habe diesen zum Testen für TCP-Wifi Signalübertragung verwendet.
Vielleicht hilft es dir ja weiter ;)


1public class Server {
2
3 public static void main(String[] args){
4 ServerSocket serverSocket = null;
5 Socket socket = null;
6 DataInputStream dataInputStream = null;
7 DataOutputStream dataOutputStream = null;
8 String nachricht = "TCP packet received";
9
10 try {
11 serverSocket = new ServerSocket(8888);
12 System.out.println("Listening :8888");
13 } catch (IOException e) {
14 // TODO Auto-generated catch block
15 e.printStackTrace();
16 }
17
18 while(true){
19 try {
20 socket = serverSocket.accept();
21 dataInputStream = new DataInputStream(socket.getInputStream());
22 dataOutputStream = new DataOutputStream(socket.getOutputStream());
23 System.out.println("ip: " + socket.getInetAddress());
24 System.out.println("message: " + dataInputStream.readUTF());
25 dataOutputStream.writeUTF(nachricht); //Echo an Client
26 } catch (IOException e) {
27 // TODO Auto-generated catch block
28 e.printStackTrace();
29 }
30 finally{
31 if( socket!= null){
32 try {
33 socket.close();
34 } catch (IOException e) {
35 // TODO Auto-generated catch block
36 e.printStackTrace();
37 }
38 }
39
40 if( dataInputStream!= null){
41 try {
42 dataInputStream.close();
43 } catch (IOException e) {
44 // TODO Auto-generated catch block
45 e.printStackTrace();
46 }
47 }
48
49 if( dataOutputStream!= null){
50 try {
51 dataOutputStream.close();
52 } catch (IOException e) {
53 // TODO Auto-generated catch block
54 e.printStackTrace();
55 }
56 }
57 }
58 }
59 }
60}

Antworten
android tester
  • Forum-Beiträge: 29

29.04.2013, 10:26:54 via Website

Hi, vielen Dank für dein Beispiel, habe es schon mal zum laufen gebracht jedoch empfängt mein server im moment noch keine nachricht vom Client (adb hab ich eingerichtet) aber da schaue ich erstmal selbst noch woran es liegt

— geändert am 29.04.2013, 12:31:47

Antworten
LitteM
  • Forum-Beiträge: 141

30.04.2013, 08:54:04 via Website

Falls du nicht mehr weiter kommst gibt es ein Beispiel zu TCP auch im Web. Einfach ein bisschen googeln :)

Antworten
android tester
  • Forum-Beiträge: 29

30.04.2013, 11:46:17 via Website

Hi, ich habe mittelerweile den Server noch etwas umgeschrieben habe jedoch das Problem, dass ich ledigdlich Botschaften verschicken von meiner App verschicken kann, jedoch nicht empfangen. Ich finde leider meinen Fehler nicht. Ich habe im Moment die readMessage() Funktion mit einer try-catch anweisung ausgeschlossen. Ab er wie gesagt, die Nachricht "Bin da" von der App wird Problemlos vom Clienten empfangen...
Ich hoffe es kann jmd nochmal drüber schauen und findet vielleicht meinen Fehler.

Vielen Dank schon mal Leute ;)

hier mein Server:
1public class Server extends Thread{
2
3 static ServerSocket server = null;
4 static Socket client = null;
5 static MyApp inst;
6 static BufferedReader input;
7 static PrintWriter output;
8
9 public void run(){
10
11 try {
12 server = new ServerSocket(38300);
13 while(true){
14 try{
15 //Server is waiting for client here, if needed
16 client = server.accept();
17 input = new BufferedReader(new InputStreamReader(client.getInputStream()));
18 output = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
19 try{
20 readMessage();
21 } catch (IOException e) {
22 meldeFehler();
23 e.printStackTrace();
24 }
25 writeMessage();
26 client.close();
27
28 } catch (IOException e) {
29 meldeFehler();
30 e.printStackTrace();
31 }
32
33 }
34
35 } catch (UnknownHostException e) {
36 meldeFehler();
37 e.printStackTrace();
38 } catch (IOException e) {
39 meldeFehler();
40 e.printStackTrace();
41 }
42 }
43
44 private static void writeMessage() {
45 String nachricht = "Bin da";
46 output.print(nachricht);
47 output.flush();
48 }
49
50 private static void readMessage() throws IOException {
51 char[] buffer = new char[200];
52 int anzahlZeichen = input.read(buffer, 0, 200); // blockiert bis Nachricht empfangen
53 String nachricht = new String(buffer, 0, anzahlZeichen);
54 inst = MyApp.instance();
55 if(inst != null){
56 TextView article = (TextView) inst.findViewById(R.id.article);
57 article.setText(nachricht);
58 }
59 }
60
61 private static void meldeFehler(){
62 inst = MyApp.instance();
63 if(inst != null){
64 TextView article = (TextView) inst.findViewById(R.id.article);
65 article.setText("Error");
66 }
67 }
68}

und hier mein Client:
1public class Client {
2
3 static Socket client = null;
4 static PrintWriter output;
5 static BufferedReader input;
6
7 public static void main(String[] args) {
8
9 execAdb();
10
11 try {
12 client = new Socket("localhost",38300);
13
14 output = new PrintWriter(new OutputStreamWriter(client.getOutputStream()));
15 input = new BufferedReader(new InputStreamReader(client.getInputStream()));
16
17 writeMessage();
18 readMessage();
19
20 //Close connection
21 client.close();
22
23 } catch (UnknownHostException e) {
24 System.out.println("UnknownHost");
25 e.printStackTrace();
26 } catch (IOException e) {
27 System.out.println("IOException");
28 e.printStackTrace();
29 }
30 }
31
32 private static void writeMessage() {
33 String nachricht = "Hallo";
34 output.print(nachricht);
35 output.flush();
36 System.out.println("gesendet");
37 }
38
39 private static void readMessage() throws IOException {
40 char[] buffer = new char[200];
41 int anzahlZeichen = input.read(buffer, 0, 200); // blockiert bis Nachricht empfangen
42 String eingang = new String(buffer, 0, anzahlZeichen);
43 System.out.println(eingang);
44
45 }
46
47 private static void execAdb() {
48 // run the adb bridge
49 try {
50 @SuppressWarnings("unused")
51 Process p=Runtime.getRuntime().exec("D:\\Program Files (x86)\\eclipse\\sdk\\platform-tools\\adb.exe forward tcp:38300 tcp:38300");
52 } catch (Exception e) {
53 e.printStackTrace();
54 }
55 }
56}

Antworten
LitteM
  • Forum-Beiträge: 141

01.05.2013, 23:30:25 via Website

Auch wenn ich nicht so ganz verstanden habe welche Richtung bei dir jetzt nicht funktioniert: Ich habe das ganze damals über DataOutputStream / DataInputStream gelöst und vom Client aus über readUTF und writeUTF empfangen/gesendet.

Du kannst dir auch Wireshark runterladen und kontrollieren ob überhaupt was gesendet wird. Einfach zur Kontrolle für dich selbst. Mir hats damals geholfen.

— geändert am 01.05.2013, 23:32:35

Antworten
android tester
  • Forum-Beiträge: 29

06.05.2013, 09:45:00 via Website

Habe den Fehler gefunden, lag an der Ausgebe, ich kann aus meinem Thread Server nicht auf das TextView aus meiner Main-Activity zugreifen, daher crasht er dort...
weiß jmd auf anhieb wie ich das umsetzten kann?

Also die Main-Activity ruft einen parallelen Thread "Server" auf.
Wenn mein Server eine Nachricht vom Client erhält, soll diese im TextView meiner Main-Activity dargestellt werden.

Ist sicher recht einfach aber ich komm nicht drauf... mein ansatz war eben:

1MainActivity inst = MainActivity.instance();
2 if (inst != null) {
3 TextView article = (TextView) inst.findViewById(R.id.article);
4 article.setText(eingang);
5 }

und in der MainActivity folgender Code:
1public static MainActivity mInst;
2
3 public static MainActivity instance() {
4 return mInst;
5 }
6
7
8 public void onStart() {
9 super.onStart();
10 mInst = this;
11 }
12
13 public void onStop() {
14 super.onStop();
15 mInst = null;
16 }

Bin dankbar für jede Lösung ;)

— geändert am 06.05.2013, 12:44:10

Antworten
android tester
  • Forum-Beiträge: 29

06.05.2013, 13:18:41 via Website

Habs schon selbst gelöst, für alle die es interessiert, ich habe einen Handler geschrieben, so kann ich auf die Nachrichten reagieren.

Antworten