lunes, 15 de diciembre de 2014

Domos Automatizando el móvil

En el proyecto Domos quiero utilizar el móvil Android como puente de comunicación entre los sensores (Arduino) y el servidor Web. Lo mismo para los actuadores.

Lo que pretendo es tener una aplicación que cada cierto tiempo (Pongamos cada 10 minutos) realice una medida de los sensores y envíe los resultados al servidor, y también pregunte al servidor qué estado quiere que tengan los actuadores para decírselo a Arduino.

Como aún no tengo el arduino voy a jugar con la cámara a intentar enviar una foto desde el móvil al servidor cada cierto tiempo y poder consultarla en el servidor. (Vamos , una especie de WebCam). Así prácticaré con temporizadores y con mantener el movil vivo, etc...

En Internet hay varios artículos interesantes sobre como hacer tareas periódicamente en el movil:

http://android.stackexchange.com/questions/79532/how-to-watch-a-periodically-shot-image-on-other-pc-smartphone-via-internet-no-l

http://stackoverflow.com/questions/2775628/android-how-to-periodically-send-location-to-a-server

Por otra parte, de paso ha aparecido una aplicación que hace de IP WebCam muy interesante: https://play.google.com/store/apps/details?id=com.pas.webcam&hl=es. Es un enfoque diferente ya que esta aplicación crea un servidor web en el movil que realiza la foto a petición de un cliente Web. Este enfoque estaría muy bien pero tiene dos pegas:


  1. No es fácil saber la IP del móvil ya que puede cambiar y tener cortafuegos que impidan alcanzarla. Quizás tendría que hacer otro servicio que periódicamente informe a un servidor de la URL.
  2. No me permite guardar estadísticas de los datos tomados de los sensores ya que solamente se tomaría bajo petición.
Este es el código fuente de la primera prueba, que se limita a sacar una foto periódicamente pero que aún no hace nada con ella.


public class Main extends Activity implements OnClickListener, SurfaceHolder.Callback {
Button sacarFoto;

Camera camara;
SurfaceHolder holder;
SurfaceView   visor;
private Handler tomaFotoCallback = new Handler() {
public void handleMessage(android.os.Message msg) {
Main.this.doSacarFoto();
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sacarFoto=initButton(R.id.sacarFoto);

visor=(SurfaceView)findViewById(R.id.visor);
holder=visor.getHolder();
initCamera();
Thread thread=new Thread() {
public void run() {
for(;;) {
try { Thread.sleep(10 * 1000); } catch(InterruptedException e) {};
tomaFotoCallback.sendEmptyMessage(0);
}
}
};
thread.start();
}
@Override
public void onDestroy() {
   stopCamera();
}

public void surfaceChanged(SurfaceHolder holder, int format, int width,
       int height) {

   startCamera(holder, width, height);
}

public void surfaceCreated(SurfaceHolder holder) {
   // TODO Auto-generated method stub
   camara = Camera.open();
   try {
       camara.setPreviewDisplay(holder);
   } catch (IOException e) {
       // TODO Auto-generated catch block
       e.printStackTrace();
   }
}

public void surfaceDestroyed(SurfaceHolder holder) {
   // TODO Auto-generated method stub

}

private void initCamera() {
   holder.addCallback(this);
   holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}


private void startCamera(SurfaceHolder sh, int width, int height) {
//    Camera.Parameters p = camara.getParameters();
//    // Camera.Size s = p.getSupportedPreviewSizes().get(0);
//    p.setPreviewSize(width, height);
//
//    camara.setParameters(p);

   try {
       camara.setPreviewDisplay(sh);
   } catch (Exception e) {
   }

   camara.startPreview();
}

private void stopCamera() {
   holder.removeCallback(this);

   camara.stopPreview();
   camara.release();
}
public Button initButton(int id) {
Button boton=(Button)findViewById(id);
boton.setOnClickListener(this);
return boton;
}
@Override
public void onClick(View v) {
if(v==sacarFoto) {
doSacarFoto();
}
}

public void doSacarFoto() {
camara.takePicture(null, null, null, new Camera.PictureCallback() {
@Override
public void onPictureTaken(byte[] data, Camera camera) {
Toast.makeText(Main.this, "FOTO SACADA!!!", Toast.LENGTH_LONG).show();
}
});

}

}


Ahora vamos a crear una tabla en nuestro servidor php:

   create table imagen ( id integer, imagen blob, hora timestamp);

Para enviar la imagen desde la parte Android voy a intentar seguir los consejos de esta página: http://stackoverflow.com/questions/2935946/sending-images-using-http-post.


No hay comentarios:

Publicar un comentario