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
No hay nada más fustrante (por no poder escribir la palabra que realmente describe mi estado de animo) que sentarse a trabajar en una idea y encontrarse conque las herramientas no funcionan.
En este caso estoy tratando de liberar código (ya probado un millón de veces) desde Sentilla Eclipse hacia el mote. Pero Eclipse se tira 3 peos:
serial@ftd/M4ASU2W5:115200: resynchronising Use replacement opcodes 6:34:59: PacketHandler started. 6:34:59: MimeoConnectionListener starting 6:34:59: HostConnectionListener starting 6:34:59: HostCollectionThread started. 6:34:59: Creating CollectionProtocol Ack listener... 6:34:59: Server started. 6:34:59: Listening on: 127.0.0.1:9002 6:34:59: Listening on: 127.0.0.1:10004 java.io.FileNotFoundException: com.sentilla.mote.clientservices.ClientServices.oos (No such file or directory) at java.io.FileInputStream.open(Native Method) at java.io.FileInputStream.(FileInputStream.java:106) at java.io.FileInputStream.(FileInputStream.java:66) at com.sentilla.virtual.ImageEnvironment$Image.init(ImageEnvironment.java:179) at com.sentilla.virtual.ImageEnvironment$Image.(ImageEnvironment.java:206) at com.sentilla.virtual.ImageEnvironment.addImage(ImageEnvironment.java:317) at com.sentilla.virtual.HostService$MimeoSync.completed(HostService.java:204) at com.sentilla.net.mimeo.ProxyImage.completed(ProxyImage.java:164) at com.sentilla.net.mimeo.ProxyImage$Slingshot.completed(ProxyImage.java:114) at com.sentilla.net.mimeo.MimeoImage.writePage(MimeoImage.java:55) at com.sentilla.net.mimeo.ProxyImage$Slingshot.writePage(ProxyImage.java:107) at com.sentilla.net.mimeo.Mimeo.process_outputs(Mimeo.java:501) at com.sentilla.net.mimeo.Mimeo.run(Mimeo.java:790) at java.lang.Thread.run(Thread.java:613) 6:35:22: mimeoImageComplet: 600949431; {binHashId=600949431, user=josevnz, mimeoSlot=1, imageData=com.sentilla.net.mimeo.ProxyImage$Slingshot@7d51a6, host=auyan.local, binary=com.sentilla.net.mimeo.ProxyImage$Slingshot@7d51a6, size=2450, date=Sat Oct 18 06:15:51 EDT 2008, name=com.sentilla.mote.clientservices.ClientServices}
Curiosamante esto comenzó a ocurrir después de un parche de seguridad liberado por Apple hace poco. Sin emnargo no puedo probar que esten relacionados. Voy a probar desde Windows.
Si, es oficial. AguaYFuego ahora tiene un hogar en Sentilla Labs. Pienso colocar el código fuente completo bajo la licencia Apache en Source Forge usando CVS (más adelante migraré a subversion pero estoy más interesado en echar código que en aprender otra herramienta para controlarlo).
Esten pendientes, estoy esperando que me aprueben la página del proyecto en Source Forge.
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):
1package com.kodegeek.app.aguayfuego; 2 3import static javax.measure.unit.SI.CELSIUS; 4 5import javax.measure.quantity.Temperature; 6 7import com.sentilla.system.Leds; 8import com.sentilla.system.LedsDriver; 9import com.sentilla.system.PropertyDriver;10import com.sentilla.system.Sensor;11import com.sentilla.system.SensorDriver;1213/**14 * Calibrate the sensor using a known value15 * @author josevnz@kodegeek.com - http://kodegeek.com16 */17publicfinalclassSensorCalibration{1819/**20 * Persist the calibration temperature tobe used by all the applications21 * @throws InterruptedException22 */23publicstaticvoidmotemain()throwsInterruptedException{24Sensor<Temperature>tempSensor=SensorDriver.create("temp", Temperature.class);25Ledsleds=LedsDriver.create();26floatcalibratedTemp=25.0f;//Put here your known temperature27leds.toggle(1);28doubledelta=calibratedTemp-tempSensor.read().doubleValue(CELSIUS);29PropertyDriver.create("aguayfuego_temp_init", 8).writeDouble(delta);30leds.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:
1package com.kodegeek.app.aguayfuego; 2 3import static javax.measure.unit.SI.CELSIUS; 4import javax.measure.quantity.Temperature; 5import com.sentilla.net.Mac64Address; 6import com.sentilla.net.Sender; 7import com.sentilla.net.SenderDriver; 8import com.sentilla.system.Leds; 9import com.sentilla.system.LedsDriver;10import com.sentilla.system.PropertyDriver;11import com.sentilla.system.Sensor;12import com.sentilla.system.SensorDriver;1314/**15 * Simple class to capture temperature usingSentilla JMote16 * @author josevnz@kodegeek.com - http://kodegeek.com17 */1819publicfinalclassTemperatureCapture{20publicstaticfinalintWAIT_TIME=1000;2122/**23 * Get the temperature reading24 * @throws InterruptedException25 */26publicstaticvoidmotemain()throwsInterruptedException{27Sensor<Temperature>tempSensor=28SensorDriver.create("temp", Temperature.class);29Ledsleds=LedsDriver.create();30longid=Mac64Address.getLocalAddress().longValue();31Sendersender=SenderDriver.create("local");32shortcount=0;33TempMessagedatamsg=newTempMessage();34datamsg.moteId=id;35leds.toggle(0);36doubledelta=PropertyDriver.open("aguayfuego_temp_init").readDouble();37while(true){38count++;39datamsg.count=count;40datamsg.tempCelcius=tempSensor.read().doubleValue(CELSIUS)+delta;41leds.toggle(1);// Show the user the sensor is alive42sender.send(datamsg);43Thread.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):
1package com.kodegeek.app.aguayfuego; 2 3import java.io.IOException; 4import java.util.Map; 5import java.util.concurrent.ConcurrentHashMap; 6import java.util.logging.Level; 7import java.util.logging.Logger; 8import com.sentilla.host.client.HostClient; 9import com.sentilla.net.Receiver;10import 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 */17publicfinalclassTemperatureClient{1819privateTemperatureClient(){};2021privatestaticfinalLoggerlog=Logger.getLogger(TemperatureClient.class.getName());2223static{24log.setLevel(Level.INFO);25}2627privatestaticfinalintMOTE_WAIT=3000;2829/**30 * Helper class that captures the temperaturecomming from the sensor31 * @author josevnz32 */33classTemperatureCaptureHelper{34publicfinalMap<Long, TempMessage>sensorMap;3536/**37 * Parametric constructor38 * @param sensorMap Map to store all the captured temperatures39 */40publicTemperatureCaptureHelper(Map<Long, TempMessage>sensorMap){41this.sensorMap=sensorMap;42}4344publicvoidcapture(){4546// Connect to the Sentilla server47HostClientclient=newHostClient();48try{49client.connect();50log.log(Level.INFO,String.format("Connected to sensor gateway at %s,capturing temperatures",client.getHost()));51Receiverreceiver=ReceiverDriver.create(TempMessage.class);52while(true){53receiver.setReceive().submit().block(MOTE_WAIT);54if(receiver.isDone()){55TempMessagetmsg=receiver.getData();56sensorMap.put(tmsg.moteId, tmsg);57log.log(Level.INFO, String.format("Update from sensor id: %s, %.3f",tmsg.moteId, tmsg.tempCelcius));58}else{59log.log(Level.INFO, "No update");60}61}62}catch(IOExceptionioExp){63log.log(Level.SEVERE, "Severe error, response will be dropped", ioExp);64}finally{65try{66if(client!=null)67client.disconnect();68}catch(IOExceptionioExp){69log.log(Level.SEVERE,"Error while closing sensor connection", ioExp);70}71}72}73}7475/**76 * Collect the statistics from all the motes77 * @param args Unused78 */79publicstaticvoidmain(String[]args)throwsThrowable{80log.log(Level.INFO, "Starting TemperatureService");81finalTemperatureClientinstance=newTemperatureClient();82try{83finalMap<Long, TempMessage>temperatures=newConcurrentHashMap<Long, TempMessage>();84TemperatureCaptureHelperhelper=instance.newTemperatureCaptureHelper(temperatures);85helper.capture();86}catch(Throwablethrowbl){87log.log(Level.SEVERE, "Fatal error, no recover possible", throwbl);88throwthrowbl;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
Esta semana me decidí a instalar OSX Leopard en la Laptop de mi esposa Veronica y en mi computadora de escritorio; La experiencia fué simplemente indolora (no recuerdo que ninguna actualización de Windows o Linux halla ido tan bien). La razón de la actualización tuvo más que ver con el hecho de que necesito utilizar Java 6 es OSX y no tengo tiempo para jugar con OpenJDK.
Con este cambio ahora puedo bajarme también el Kit Perk de Sentilla para OSX, el cual fué liberado recientemente (Agosto 22).
¿Las instrucciones de instalación? Sencillas:
Mac OS X Distribution of Sentilla Work ———————————–
Version: 1.1.1 for Mac OS X
Tested on Mac OS X 10.4.11 and 10.5.4. Please see the release notes in SentillaWork/docs for more complete installation instructions and limitations.
Prerequisites: - Mac OS X Tiger or Leopard - Java 1.5 or higher
To install: 1. Install prerequisites. 2. Untar the archive 3. cd into the resulting directory. 4. Run “sudo ./install.sh”.
To run the Sentilla Host Server: 1. Run the hostserver with “./sentilla-hostserver”. 2. The server can be shut down using it’s PID: kill -9 `cat log/hostserver.pid`
To run the SentillaWork IDE: 1. Run the IDE with “./sentilla-work”.
To uninstall: 1. Run “sudo ./uninstall.sh”. 2. Delete the Sentilla directory and tar file.
This is NOT free software. Please see the included LICENSE.txt file for licensing information.
Aunque por otro lado, hubiera sido mucho mejor hacer un paquete (.app), ¿no es así?. Dejando esa queja de un lado, me decidí a revisar el instalador (install.sh), buscando la parte en la cual instalan un manejador de dispositivos USB compatible con el Gateway:
if [ -e /System/Library/Extensions/FTDIUSBSerialDriver.kext ]; then echo “FTDI VCP driver found; moving to /System/Library/Extensions.disabled” if [ ! -e /System/Library/Extensions.disabled ]; then mkdir /System/Library/Extensions.disabled; fi mv /System/Library/Extensions/FTDIUSBSerialDriver.kext /System/Library/Extensions.disabled/ echo “Please restart your system and run install.sh again.” exit 1 fi
Ajá, aquí esta la vaina. Se ve sencillo, así que puedo dejar que el script haga el daño. Sin embargo (y en un acto de precaución raro en mi) me decidí también leerme la documentación en PDF especifica para OSX.
Ahh, bueno, resulta que la versión de Mac tiene cosas que no funcionan como en la versión de Windows, sin embargo no son tan importantes. Pero me molesto que cuando traté de instalar una aplicación desde Sentilla Eclipse, me dió el siguiente error:
5:31:25: Exception at node 00:12:75:00:11:e4:2d:75: BIN num: abd13878CLASS num: 54 at : BIN num: abd13878; methodNum: 292; pc: 665 at : BIN num: abd13878; methodNum: 172; pc: 34 at : BIN num: 722bd3fd; methodNum: 671; pc: 18 at : BIN num: 722bd3fd; methodNum: 839; pc: 48 at : BIN num: 722bd3fd; methodNum: 664; pc: 41
La versión de OS X pareciera hecha a los trancazos; El programa que se usa para correr el servidor de sentilla es super sencillo, sin embargo no tiene manera de matar al demonio (lo tiene que hacer usted con ‘kill’).
No estoy muy impresionado, vamos a ver que tan lejos llego el el foro de soporte de Sentilla.
Bueno, seguí jugando con Sentilla Perk y Swing; Esta vez terminé de acomodar al cliente gráfico que muestra los datos en una tabla, al mismo tiempo que genera gráficos de temperatura capturados por cada sensor (código fuente aquí).
Aún tengo un par de problemas:
No he calibrado los sensores, uno de ellos siempre mide en el rango de las 20 grados Celcius mientras que el otro está en los 30.
JFreeChart me tiene confundido con la gráfica, tengo un problema extraño de refrescamiento de pantalla.
Sin embargo no me tomó mucho tiempo montar esto, y cada vez se pone más divertido. Voy a preguntar a otros desarrolladores más expertos en el foro de Sentilla a ver que tal
Bueno, no tengo mucho tiempo para escribir estos días (la semana ha estado muy movida en el área de finanzas), así que les traigo una pequeña pieza de código en la cual capturo la temperatura de los sensores de Sentilla (sí, código viejo) para ponerla de inmediato en un cliente escrito en Swing, el cual utiliza un TableModel el cual dispara las actualizaciones usando un Thread que corre en paralelo.
Sin embargo la noticia principal es que este blog se va de vacaciones, por dos meses. Así es, se me ha presentado una oportunidad para la cual tengo que enfocar todos mis esfuerzos si quiero salga bien.
Si, cero Facebook, cero Google reader con mis RSS, cero blog, cero distracciones. Como dicen por acá “do or die”
Así que no se desesperen, comenten mucho y escriban correos (yo les prometo responder) y sobre todo, no se preocupen por el blog, este no va a desaparecer
Downloads of the Beta release of Sentilla Work for both Mac OS X and Ubuntu Linux are now available for current Perk customers at the following URLs:
Sentilla Work (Beta) for Linux
Sentilla Work (Beta) for Mac OS X
Go to the URL for your OS of choice and login as
XXXXXX
and use the password
ZZZZZZZZ
After you download the release to your computer and expand the files, refer to the Release Notes included with the builds for installation instructions (page 10) and important notices. You do not need to reinstall mote firmware for this release; your current Perk firmware will work on both the Mac OS X and Linux platforms.
Note that you cannot install firmware with the Mac OS X release.
Últimos comentarios