red en androidlsub.org/mov/8.net.pdf · red en android • igual que en java • algunas...

27
Red en Android LSUB, GYSC, URJC

Upload: lykiet

Post on 28-May-2019

226 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Red en AndroidLSUB, GYSC, URJC

Page 2: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Red en Android

• Igual que en Java

• Algunas peculiaridades con el interfaz (WIFI lock)

• Se puede emular

Page 3: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Clientepublic void hola(View button){

int time = Toast.LENGTH_SHORT;Toast msg = Toast.makeText(this, "hola", time);msg.show();Thread c = new Thread(){

@Overridepublic void run() {

Socket s;OutputStream o;o = null;

try{s = new Socket("10.0.2.2", 2000);OutputStream o = s.getOutputStream();byte buf[] = "hola hola".getBytes("UTF-8");o.write(buf, 0, buf.length);

}

Page 4: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Cliente} catch (ConnectException e){

System.out.println("connection refused" + e);} catch(UnknownHostException e){

System.out.println("cannot connect to host " + e);} catch(IOException e){

System.out.println("IO exception" + e);} finally {

if o != null o.close()

}

}};c.start();

}

Page 5: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Permisos

• Como para muchos recursos hay que pedir permiso al usuario

• Se declaran los permisos que se necesitan en el manifest

Page 6: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Permisos (cliente o servidor)

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.client" android:versionCode="1" android:versionName="1.0" >

<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" />

<uses-permission android:name="android.permission.INTERNET" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.client.MainActivity" android:label="@string/app_name" > ...

Page 7: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Servidortry{

ServerSocket s = new ServerSocket(1234); OutputStream o; o = null;

while(true){Socket sin = s.accept();if(sin == null)

break;o = sin.getOutputStream();byte buf[] = "hola hola".getBytes("UTF-8");o.write(buf, 0, buf.length);

}s.close();

} catch (ConnectException e){System.out.println("connection refused" + e);

} catch(UnknownHostException e){System.out.println("cannot connect to host " + e);

} catch(IOException e){System.out.println("IO exception" + e);

} finally {if o != null

o.close() }

Page 8: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Información de Interfaces

• La clase WifiInfo (ojo, en el emulador no funciona).

• Necesita el permiso:

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

Page 9: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Información de Interfaces

WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);WifiInfo wifiInfo = wifiManager.getConnectionInfo();int ipAddress = wifiInfo.getIpAddress();

String ip = String.format("%d.%d.%d.%d",ipAddress & 0xff, ipAddress>>8 & 0xff,ipAddress>>16 & 0xff, ipAddress>>24 & 0xff);

int time = Toast.LENGTH_SHORT;Toast msg = Toast.makeText(this, "hola soy: " + ip, time);msg.show();

Page 10: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

WIFI lock

• En cuanto deja de haber actividad se apaga la WIFI (aunque haya conexiones abiertas)

• Si no quiero que se me de problemas puedo hacer que se quede encendida

• Si el usuario la apaga, se apaga

Page 11: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

WIFI lock

• Mejor por cuenta de referencias

• Así, creo uno sólo para mi App y me despreocupo

Page 12: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

WIFI lock

WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); wifiLock = wm.createWifiLock(WifiManager.WIFI_MODE_FULL , “MyWifiLock”); // Poner cuenta de referencias wifilock.setReferenceCounted(true); // Coger el cierre wifiLock.acquire(); // Usar la red // Coger el cierre wifiLock.release(); Log.i(“Mi_app”, "WiFi Lock released!”);

Page 13: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

WIFI lock

<uses-permission android:name="android.permission.WAKE_LOCK" />

• Tengo que pedir el permiso:

Page 14: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

3G

• Detrás de NAT (en muchas WIFIs también)

• Lo mejor es usar un servidor para comunicarse

Page 15: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Emular la Red

• Todo lo que hay que saber:

• http://developer.android.com/tools/devices/emulator.html#emulatornetworking

Page 16: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Depuración

• Usar telnet o nc para depurar (se puede redireccionar la entrada y usar una fifo creada con mkfifo)

• Así nos fiamos de uno de los lados mientras depuramos el otro

Page 17: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Emular la RedPuerto de control

Page 18: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Emular la redGateway10.0.2.1

Simulador10.0.2.15

Gateway10.0.2.1

Simulador10.0.2.15

Host

1234

127.0.0.1 == 10.0.2.2

325

Las direcciones que ven los emuladores son siempre las mismas

Page 19: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Emular la red

$ telnet localhost 5554Trying ::1...telnet: connect to address ::1: Connection refusedTrying 127.0.0.1...Connected to localhost.Escape character is '^]'.Android Console: type 'help' for a list of commandsOKredir add tcp:325:1234OK

Redireccionar el puerto del NAT(de entrada al dispositivo)

Page 20: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Emular la red (servidor)

try{ServerSocket s = new ServerSocket(1234);while(true){

Socket sin = s.accept();if(sin == null)

break;OutputStream o = sin.getOutputStream();byte buf[] = "hola hola".getBytes("UTF-8");o.write(buf, 0, buf.length);o.close();

}s.close();

} catch (ConnectException e){System.out.println("connection refused" + e);

} catch(UnknownHostException e){System.out.println("cannot connect to host " + e);

} catch(IOException e){System.out.println("IO exception" + e);

}

Page 21: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Depuración (servidor:android, cliente: telnet)

$ telnet localhost 1234Trying ::1...telnet: connect to address ::1: Connection refusedTrying 127.0.0.1...Connected to localhost.Escape character is '^]'.hola holaConnection closed by foreign host.$

Page 22: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Depuración: (cliente:android, servidor: nc)

• Es cómodo poner un netcat de servidor para probar

• Ej: cliente en el dispositivo, conecta a 10.0.2.2:2000 en la shell ejecuto:

$ nc -l 2000

Page 23: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Depuración

s = new Socket("10.0.2.2", 2000);OutputStream o = s.getOutputStream();byte buf[] = "hola hola\n".getBytes("UTF-8");o.write(buf, 0, buf.length);o.close();

Page 24: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Depuración

$ nc -l 2000hola hola$

Page 25: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Automatización: adb

• Para hacerle cosas al emulador automáticamente desde la shell

• Por ejemplo levantar el interfaz de red y cambiar a 3G, cambiar el forward de puertos, etc.

• http://developer.android.com/tools/help/adb.html#move

Page 26: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

WIFI direct

• Conectar dos teléfonos directamente

• Sin access point

• Sin bluetooth (protocolo roto en muchos teléfonos y no llega muy lejos)

Page 27: Red en Androidlsub.org/mov/8.net.pdf · Red en Android • Igual que en Java • Algunas peculiaridades con el interfaz (WIFI lock) • Se puede emular

Más de uso de la red

• Conseguir red con un BW decente (sin cargos):

https://developer.android.com/training/wearables/data-layer/network-access.html

• Cloud messaging, FCM (GCM ya no), Firebase Cloud Messaging

https://firebase.google.com/docs/cloud-messaging/