Android zdalne sterowanie PC

Ostatnio napisałam prostą aplikację na Androida, która steruje głośnością komputera PC z Linuxem (w moim przypadku jest to dystrybucja Mageia).

Serwer w php

Najpierw stworzyłam prosty serwer w php (może być napisany w każdym języku, ważne aby działał na lokalnym komputerze na określonym porcie).
Cały kod serwera poniżej (plik index.php).
set_time_limit(0);
$socket = stream_socket_server("tcp://0.0.0.0:8000", $errno, $errstr);
if (!$socket) {
  echo "$errstr ($errno)<br />\n";
} else {
  while ($conn = stream_socket_accept($socket)) {
    while($command = fread($conn,1024)) {
		if(trim($command) == 'volup') {
			exec('amixer set Master 10%+');
		}
		if(trim($command) == 'voldown') {
			exec('amixer set Master 10%-');
		}
		echo $command;
    }
    fclose($conn);
  }
  fclose($socket);
}
Serwer będzie działał na porcie 8000 i oczekiwał na instrukcje od klienta. Jeśli otrzyma komendę volup lub voldown odpowiednio podgłośni lub przyciszy dźwięk na komputerze (o 10%). Jakąkolwiek inną komendę po prostu wyświetli. Wykorzystałam do tego amixer.

Klient w Javie - Android

Klient został napisany w Javie jako aplikacja na Androida. Aplikacja posiada dwa przyciski "Volume Up" i "Volume down", które sterują głośnością. Po kliknięciu na któryś przycisk łączymy się do naszego serwera i wysyłamy mu odpowiednią komendę. Aplikacja oprócz aktywności głównej posiada również aktywność preferencji, gdzie można zmienić preferencje aplikacji. Tutaj adres ip serwera oraz port. Pełny kod aplikacji znajduje się na githubie. Tutaj omówię tylko kluczowe kwestie. W metodzie onCreate MainActivity łapiemy utworzone w layoucie buttony i podczepiamy pod nie odbiornik (listener) obsługujący zdarzenie kliknięcia.
Aplikacja posiada również pole tekstowe i przycisk "Send" do wysłania dowolnej komendy do serwera. Kod z tym związany nie został tu pokazany. Można go znaleźć na githubie.
volup_btn = (Button) findViewById(R.id.volup);
voldown_btn = (Button) findViewById(R.id.voldown);
volup_btn.setOnClickListener(connectListener);
voldown_btn.setOnClickListener(connectListener);
Kod odbiornika poniżej.
private OnClickListener connectListener = new OnClickListener() {
	@Override
	public void onClick(View arg0) {
		if(arg0.getId()==volup_btn.getId()){
			command_str = "volup";
		} else if(arg0.getId()==voldown_btn.getId()){
			command_str = "voldown";
		} else {
			command_str = command.getText().toString();
		}
		if (!is_connected) {
			Thread clientThread = new Thread(new ClientThread());
			clientThread.start();
		}
	}
};
Sprawdzamy w nim, który button został kliknięty na podstawie identyfikatora. Następnie uruchamiamy nowy wątek łączący się z serwerem (gdy połączenie jeszcze nie istnieje).
Najważniejsza część aplikacji to kod wątku łączącego się z serwerem. Jego zawartość poniżej.
public class ClientThread implements Runnable {
	@Override
	public void run() {
		try {
			InetAddress serverAddr = InetAddress.getByName(MainActivity.this.server_ip);
			Log.d("ClientActivity", "Client: Connecting...");
			Socket socket = new Socket(serverAddr, Integer.parseInt(MainActivity.this.server_port));
			is_connected = true;
			if(is_connected) {
				try {
					Log.d("ClientActivity", "Client: Sending command.");
					PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket
								.getOutputStream())), true);
					out.println(command_str);
					Log.d("ClientActivity", "Client: Sent.");
				} catch (Exception e) {
					Log.e("ClientActivity", "Server: Error", e);
					e.printStackTrace();
				}
			}
			socket.close();
			is_connected = false;
			Log.d("ClientActivity", "Client: Closed.");
		} catch (Exception e) {
			Log.e("ClientActivity", "Client: Error", e);
			e.printStackTrace();
			is_connected = false;
		}
	}
}
Jeśli uruchamiamy aplikację na emulatorze to jako adres IP serwera podajemy 10.0.2.2. Screeny aplikacji na Androida. Screeny z aplikacji na Androida W celu sprawdzenia działania należy uruchomić nasz serwer w konsoli.
/usr/bin/php /katalog/z/plikiem/index.php
Następnie uruchomić naszą aplikację na emulatorze lub telefonie i sprawdzić jej działanie.
Materiały:
Kod serwera na githubie
Kod klienta na githubie
Połączenie do lokalnego komputera z emulatora