Archivo

Entradas Etiquetadas ‘pervasive computing’

Pervasive computing: Sentilla once again

Sábado, 6 de febrero de 2010

Ya ha pasado un rato laaaargo desde que juegue con mis motes de Sentilla Lab. La última aplicación que escribí (AguaYFuego) requiere un poco de maquillaje (en aquel entonces lo hice con Swing y JFreeChart). Esta vez voy a probar una nueva dirección.

Ahora que tengo mi servidor Mac mini ocioso creo que es hora de poner a trabajar ese equipo. Por ahora me estoy bajando las actualizaciones para OSX y poniéndole las pilas a los sensores :)

java, programación , , ,

Sentilla: Agua y fuego

Domingo, 5 de octubre de 2008

Estoy escribiendo una pequeña aplicación para Sentilla Labs. Comencé primero escribiendo una pequeña aplicación para calibrar el sensor (algo que no habia resuelto muy bien hace tiempo atrás). Lo cierto es que primero usted debe averiguar la temperatura del sitio del cual piensa sacar las medidas, usando quizas el termostato de su casa y luego corre esto desde Sentilla Works (el ide de Eclipse):

 1 package com.kodegeek.app.aguayfuego; 2 3 import static javax.measure.unit.SI.CELSIUS; 4 5 import javax.measure.quantity.Temperature; 6 7 import com.sentilla.system.Leds; 8 import com.sentilla.system.LedsDriver; 9 import com.sentilla.system.PropertyDriver;10 import com.sentilla.system.Sensor;11 import com.sentilla.system.SensorDriver;1213 /**14  * Calibrate the sensor using a known value15  * @author josevnz@kodegeek.com - http://kodegeek.com16  */17 public final class SensorCalibration {18 19  /**20   * Persist the calibration temperature tobe used by all the applications21   * @throws InterruptedException22   */23  public static void motemain() throws InterruptedException {24   Sensor <Temperature>tempSensor =SensorDriver.create("temp", Temperature.class);25   Leds leds = LedsDriver.create();26   float calibratedTemp = 25.0f; //Put here your known temperature27   leds.toggle(1);28      double delta = calibratedTemp -tempSensor.read().doubleValue(CELSIUS);29   PropertyDriver.create("aguayfuego_temp_init", 8).writeDouble(delta);30      leds.toggle(0);31  }32 }

Guardamos el valor en la lína 49. Una vez que usted corra este programa (solamente hace falta si sospecha que la temperatura de su cuarto ha cambiado mucho) entonces puede comenzar a capturar las temperaturas de nuevo. Fijense en el detalle de como se envia la temperatura, más el “delta” el cual contiene el ajuste:

 1 package com.kodegeek.app.aguayfuego; 2 3 import static javax.measure.unit.SI.CELSIUS; 4 import javax.measure.quantity.Temperature; 5 import com.sentilla.net.Mac64Address; 6 import com.sentilla.net.Sender; 7 import com.sentilla.net.SenderDriver; 8 import com.sentilla.system.Leds; 9 import com.sentilla.system.LedsDriver;10 import com.sentilla.system.PropertyDriver;11 import com.sentilla.system.Sensor;12 import com.sentilla.system.SensorDriver;1314 /**15  * Simple class to capture temperature usingSentilla JMote16  * @author josevnz@kodegeek.com - http://kodegeek.com17  */1819 public final class TemperatureCapture {20  public static final int WAIT_TIME = 1000;2122  /**23   * Get the temperature reading24   * @throws InterruptedException25   */26  public static void motemain() throws InterruptedException {27   Sensor <Temperature>tempSensor =28    SensorDriver.create("temp", Temperature.class);29   Leds leds = LedsDriver.create();30   long id = Mac64Address.getLocalAddress().longValue();31   Sender sender = SenderDriver.create("local");32   short count = 0;33      TempMessage datamsg = new TempMessage();34      datamsg.moteId = id;35      leds.toggle(0);36      double delta = PropertyDriver.open("aguayfuego_temp_init").readDouble();37   while(true) {38    count++;39    datamsg.count = count;40    datamsg.tempCelcius = tempSensor.read().doubleValue(CELSIUS) + delta;41    leds.toggle(1); // Show the user the sensor is alive42    sender.send(datamsg);43    Thread.sleep(WAIT_TIME);44   }45  }46 }

La línea 36 lee el delta y la 40 lee la temperatura con la corrección. Después la transmitimos en la linea 42.

Finalmente el cliente que lee los valores de los sensores (Esta es una aplicación común y silvestre de Java):

 1 package com.kodegeek.app.aguayfuego; 2 3 import java.io.IOException; 4 import java.util.Map; 5 import java.util.concurrent.ConcurrentHashMap; 6 import java.util.logging.Level; 7 import java.util.logging.Logger; 8 import com.sentilla.host.client.HostClient; 9 import com.sentilla.net.Receiver;10 import com.sentilla.net.ReceiverDriver;1112 /**13  * Simple command line client that collectsthe temperature readings of14  * all the motes in the wireless network.15  * @author josevnz@kodegeek.com - http://kodegeek.com16  */17 public final class TemperatureClient {1819  private TemperatureClient() {};2021  private static final Logger log =Logger.getLogger(TemperatureClient.class.getName());2223  static {24   log.setLevel(Level.INFO);25  }2627  private static final int MOTE_WAIT = 3000;2829  /**30   * Helper class that captures the temperaturecomming from the sensor31   * @author josevnz32   */33  class TemperatureCaptureHelper {34   public final Map <Long, TempMessage>sensorMap;35  36   /**37    * Parametric constructor38    * @param sensorMap Map to store all the captured temperatures39    */40   public TemperatureCaptureHelper(Map <Long, TempMessage>sensorMap) {41    this.sensorMap = sensorMap;42   }43  44   public void capture() {4546    // Connect to the Sentilla server47    HostClient client = new HostClient();48    try {49     client.connect();50     log.log(Level.INFO,String.format("Connected to sensor gateway at %s,capturing temperatures",client.getHost()));51     Receiver receiver =ReceiverDriver.create(TempMessage.class);52     while(true) {53      receiver.setReceive().submit().block(MOTE_WAIT);54      if (receiver.isDone()) {55       TempMessage tmsg= receiver.getData();56       sensorMap.put(tmsg.moteId, tmsg);57       log.log(Level.INFO, String.format("Update from sensor id: %s, %.3f",tmsg.moteId, tmsg.tempCelcius));58      } else {59       log.log(Level.INFO, "No update");60      }61     }62    } catch (IOException ioExp) {63     log.log(Level.SEVERE, "Severe error, response will be dropped", ioExp);64    } finally {65     try {66      if (client != null)67       client.disconnect();68     } catch (IOException ioExp) {69      log.log(Level.SEVERE,"Error while closing sensor connection", ioExp);70     }71    }72   }73  }74 75  /**76   * Collect the statistics from all the motes77   * @param args Unused78   */79  public static void main(String[] args) throws Throwable {80   log.log(Level.INFO, "Starting TemperatureService");81   final TemperatureClient instance = new TemperatureClient(); 82   try {83    final Map <Long, TempMessage>temperatures= new ConcurrentHashMap<Long, TempMessage>();  84    TemperatureCaptureHelper helper = instance.new TemperatureCaptureHelper(temperatures);85    helper.capture();  86   } catch (Throwable throwbl) {87    log.log(Level.SEVERE, "Fatal error, no recover possible", throwbl);88    throw throwbl;89   }90  }91 }

Una vez resuelto esto puedo comenzar con la nueva aplicación. El código no está disponible en CVS, en algún momento colocaré todo para que se lo bajen. Mientras tanto les dejo esto para que se entretengan :)

Buscar en otros sitios:

Blogalaxia:, , , ,
Technorati:, , , ,
To2blogs:, , , ,
Del.icio.us:, , , ,

java, kodegeek , , , ,

Como medir temperatura desde Java, usando Perk

Sábado, 17 de mayo de 2008

Running the client app to listen to the motes from Eclipse
El código de captura es bien sencillo

¿Recuerdan como les prometí que iba a jugar con Sentilla Perk? Hoy comencé con una sencilla aplicación la cual mide la temperatura usando los dos sensores (llamados “Motes”) para luego transmitirla a la laptop la cual tiene instalado el “Gateway” que habla el protocolo CC420 en el puerto USB.

Después de leer los ejemplos, la guia de programador y el API me conseguí que es muy fácil recolectar datos con los sensores. El código que hace la captura es el siguiente (este código es instalado desde la máquina que corre el servidor Perk en todos los motes):


     Sender sender = SenderDriver.create("local");  short count = 0;     TempMessage datamsg = new TempMessage();     datamsg.moteId = id;  while(true) {   count++;   leds.toggle(count); // Play with the leds   datamsg.count = count;   datamsg.temperature = tempSensor.read(); // Read the temperature   sender.send(datamsg);   Thread.sleep(WAIT_TIME);  }

Y en la Laptop en donde estoy corriendo el servidor me limito a capturar la información enviada por los sensores para mostrarla por pantalla (código):

client = new HostClient(); client.connect(); Receiver receiver = ReceiverDriver.create(TempMessage.class); while(true) { receiver.setReceive().submit().block(500); if (receiver.isDone()) { TempMessage msg = receiver.getData(); log.log(Level.INFO, String.format( "Mote ID: %d, Count: %d, Temperature: %fC\n", msg.moteId, msg.count, msg.temperature.doubleValue(CELSIUS))); } }

Sencillo hasta ahora, ¿no es así?

Pienso hacer una interfaz para poder mostrar esta información en Internet, esten pendientes. Por ahora los dejo con un video en el que se ve como corre el cliente que recibe los datos de los sensores:

Buscar en otros sitios:

Blogalaxia:, , , ,
Technorati:, , , ,
To2blogs:, , , ,
Del.icio.us:, , , ,

java, kodegeek , , , ,