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:
</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());