Vous êtes sur la page 1sur 7

Client TCP en Android Control sobre Leds

mayo 12, 2011 | Posted in Varios | Comentarios desactivados



Presento una de mis primeras aplicaciones realizada en android (El primero es el !Hola mundo! ).
Se trata en crear una interfaz visual donde es posible ingresar una direccin IP y un puerto TCP
para poder controlar 3 leds que se encuentran en la placa PIC32 Ethernet Starter Kit la cual
implementa un server TCP.

El server TCP implementado en el microcontrolador es bastante sencillo:
Tenemos una funcin que inicializa el server creando un socket server al puerto asignado:

void vInitTCPServerControlLeds(void){


myTCPServer.TCPSocket=TCP_Open(0,TCP_OPEN_SERVER,TCP_LEDS_PORT,TCP_PURPOSE_LEDS_T
CP_SERVER);
}
Luego tenemos otra funcin que es llamada cada cierto tiempo que se encarga de recibir los datos
enviados al server y trabajarlos para determinar si es un comando adecuado:

void vTCPServerControlLeds(void){
WORD wMaxGet,wMaxPut;
BYTE Buffer[10];

// Hay alguien conectado?
if(!TCPIsConnected(myTCPServer.TCPSocket))return;


wMaxGet=TCPIsGetReady(myTCPServer.TCPSocket);
if(wMaxGet!=0){
// Leemos data
TCPGetArray(myTCPServer.TCPSocket,&Buffer[0],wMaxGet);
if(Buffer[0]==100){
switch(Buffer[1]){
case 1:
LED0_IO=Buffer[2];
break;
case 2:
LED1_IO=Buffer[2];
break;
case 3:
LED2_IO=Buffer[2];
break;
}
}
}
}
Para la aplicacin en android recomiendo las siguientes fuentes de informacin:

Introduccin a programar en android. Lo que hay que instalar y los pasos a seguir.
Primera aplicacin de ejemplo. Un ejemplo explicado paso a paso.
Creacin de la interfaz visual.
Para ello vamos a res/layout/main.xml donde podemos ir realizando el diseo que nos parezca
adecuado. En este caso el cdigo es el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView android:id="@+id/textView1" android:text="Direccin IP:"
android:layout_height="wrap_content" android:layout_width="wrap_content"></TextView>
<EditText android:id="@+id/et_ip" android:layout_height="wrap_content"
android:text="169.254.1.1" android:layout_width="fill_parent"></EditText>
</LinearLayout>
<LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView android:id="@+id/textView1" android:text="Puerto TCP:"
android:layout_height="wrap_content" android:layout_width="wrap_content"></TextView>
<EditText android:id="@+id/et_port" android:layout_height="wrap_content"
android:text="1572" android:layout_width="fill_parent"></EditText>
</LinearLayout>
<CheckBox android:text="Led 1" android:id="@+id/cb_led1"
android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
<CheckBox android:id="@+id/cb_led2" android:text="Led 2"
android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
<CheckBox android:text="Led 3" android:id="@+id/cb_led3"
android:layout_width="wrap_content" android:layout_height="wrap_content"></CheckBox>
<TextView android:id="@+id/tv_estado" android:text="Estado: Desconectado"
android:layout_width="fill_parent" android:layout_height="wrap_content"></TextView>

</LinearLayout>
Se crean 2 lneas para ubicar en cada una de ellas un textView y un EditText:

Direccin IP: _______

Puerto TCP: _______

Luego se colocan 3 Checkbox (Igualmente podran reuinirse en una linea) y un TextView como para
indicar si hay conexin con el Server TCP.

El resultado es el siguiente:



Cdigo fuente:
En el archivo *.java ubicado en /scr/ comenzamos a escribir el cdigo que realizar las tareas
segn las acciones en la interfaz de usuario. Primero que nada debemos referenciar en variables
los elementos creados en main.xml como para controlarlos:

final CheckBox _cb_led1=(CheckBox)findViewById(R.id.cb_led1);
final CheckBox _cb_led2=(CheckBox)findViewById(R.id.cb_led2);
final CheckBox _cb_led3=(CheckBox)findViewById(R.id.cb_led3);
final TextView _tv_estado=(TextView)findViewById(R.id.tv_estado);
final EditText _et_ip=(EditText)findViewById(R.id.et_ip);
final EditText _et_port=(EditText)findViewById(R.id.et_port);
Luego generamos una accin al realizar un click sobre cada CheckBox, de manera de establecer
comunicacin con el Server TCP al cual se necesita acceder, indicado mediante la direccin IP y el
puerto TCP colocado en los EditText, y enviar el comando segn el CheckBox seleccionado junto a
su estado.

El protocolo usado para establecer el comando es sencillo, un primer byte para indicar que se trata
de control sobre Leds (100d), un segundo byte para indicar sobre que led actuar y un tercer byte
para indicar el valor a setear al led seleccionado:

CMD LEDS N LED ESTADO
final byte[] Buffer = {100,0,0};
_cb_led1.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
try {
String myIP=_et_ip.getText().toString();
int myPort= Integer.parseInt(_et_port.getText().toString());
Socket mySocket = new Socket(myIP,myPort);
OutputStream Data_Out = mySocket.getOutputStream();
_tv_estado.setText("Estado: Conectado");
Buffer[1]=1;
if(_cb_led1.isChecked()==true){
Buffer[2]=1;
}else{
Buffer[2]=0;
}
Data_Out.write(Buffer, 0, 3);
mySocket.close();
} catch (UnknownHostException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
Con la siguiente linea leemos la direccion IP y la guardamos en un String:

String myIP=_et_ip.getText().toString();

La siguiente lee el nmero de Puerto TCP y lo convierte a un valor entero:

int myPort= Integer.parseInt(_et_port.getText().toString());

Establecemos comunicacin:

Socket mySocket = new Socket(myIP,myPort);

Creamos un flujo de salida de datos:

OutputStream Data_Out = mySocket.getOutputStream();

Establecido el CheckBox seleccionado y el estado del mismo enviamos comando, por ejemplo:

Data_Out.write(Buffer, 0, 3);

Adems de todo esto debemos definir el siguiente permiso en AndroidManifest.xml:

<uses-permission android:name=android.permission.INTERNET />

El resultado que se obtiene es el siguiente:





Si el material que encontraste te ha sido til, aydanos a mantenerlo y obtener recursos para ms
ejemplos.

Vous aimerez peut-être aussi