No se si este es el primer producto del decreo 3390 después de tantos años, pero me alegra ver una respuesta concreta al dilema de la falta de software libre Venezolano.
Después de un letargo inmenso, y de varios intentos inútiles para convencer a un pana de trabajar en el proyecto conmigo me decidí a arrancar yo sólo. Lo primero fué configurar a mi Eclipse para utilizar Subversion; Hay algunos cambios de paradigmas con la herramienta, pero por lo poco que he jugado es muy similar a CVS.
Tambien estoy acomodando el código que tenia en SourceForge; La idea es comenzar con una versión con la misma funcionalidad que tenia PingBlog y de allí desarrollar las nuevas ideas.
Si tiene curiosidad, puede ver el código fuente desde acá. Dentro de poco ya verán la primera versión de StupidZombie.
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.
Gracias al Geek extraordinarioSebastian Delmont tuve la oportunidad hoy de ir a visitar a la gente de Buglabs, quienes estaban haciendo unOpenHouse en sus oficinas en Soho. Realmente después de todas las noticias negativas en el sector financiero (incluyendo el día de hoy en el cual las acciones de todas las compañías volvieron a caer) fué increíblemente refrescante hablar de tecnología y no de negocios.
Corcho es corcho ;)
¿Pero y que es Buglabs? Buglabs es una compañia la cual fabrica componentes modulares basados en el modelo Open Source. Si, el concepto es innovador ya que tanto el software como el hardware son abiertos. El módulo principal corré Linux y encima de eso tienes Java o si quiere código nativo compilado con GCC.
Si no entendió nada no se preocupe. Lo explico de nuevo, un poco diferente esta vez: Es como tener un lego en el cual cada ladrillo agrega funcionalidad nueva al juguete. La diferencia es que el lego corre Linux y se puede programar en Java.
La plataforma es muy interesante. No sólo se tiene acceso directo a Linux y Java en el aparato, sino que además es modular (por ejemplo ya venden acelerómetro con sensores de movimiento combinados, GPS, camara digital, Wifi, entre otros). También cuenta con un IDE basado en Eclipse lo cual lo hace idóneo si usted es un desarrollador de Java.
Al verlo usted podría pensar que es muy similar a Android. Sin embargo esta plataforma va más allá, ya que la compañía está en capacidad de incluir varias máquinas virtuales en su producto. El sólo hecho de combinar módulos sin necesidad de soldadura y contar con Java como lenguaje de desarrollo lo hace muy interesante como herramienta de enseñanza y aprendizaje, o para el desarollo de aplicaciones a la medida (el sitio web oficial cuenta con una colleción de demostraciones hechas con el producto).
Sin embargo Buglabs no sólo corre Java sino que usted puede utilizar GCC para compilar su código nativo. No pregunté pero no veo imposible tener Python, Ruby o Perl dentro del dispositivo (ciertamente Shell scripting viene grátis con la aplicación de terminal que viene instalada).
La base cuesta un poco más de $340 dolares, y cada modulo cuesta por encima de $20. La camara improvisada con Wifi mostrada arriba en la foto cuesta un poco más de $500 (ya que es una combinación de varios modulos), así que debe estarse preguntando, ¿no es más barato comprarse un Sentilla Perk o Arduino?
Yo creo que el precio de este producto va a bajar una vez que la demanda suba (debe haber producción en masa). Es muy temprano para criticar el precio (habrá que esperar unos 8 meses más o menos), sobre todo si te tiene en cuenta el alto valor que tiene una plataforma tan versátil. Lo otro es que una comparación con Sentilla o Arduino es injusta ya que este no es sólo un dispositivo empotrado que puede ser programado en Java, sino una plataforma completa que corre Linux en la cual hasta se puede compilar código.
Lo reto a que haga esto en su IPhone o teléfono con Android :)
Entonces la pregunta obligada es ¿cuales son las posibilidades de supervivencia de una compañía la cual sólo hace herramientas para "aficionados"?. El CEO de Buglab me comentó que ellos no están cerrados a ninguna posibilidad, y que el "Bug" es una prueba de lo que ellos pueden hacer como compañía (hospitales, seguridad, etc. Cualquiera que necesite una plataforma modular a la medida con suficiente poder).
Yo de verdad creo que estamos al frente de una compañía que ofrece un servicio único, basado en el modelo Open Source. El hecho de poder ofrecer servicios basados en una plataforma abierta implica que sus clientes se sentiran más comodos ya que no estarán casados con un sólo proveedor de hardware / software (como es el caso de Apple con sus excelentes productos los cuales son todos cerrados).
Si usted es paciente, ya verá otras compañias haciendo modulos compatibles con buglabs. No veo como no se pueda desarrollar un ecosistema alrededor de este producto, tal cual y como ha pasado con Arduino.
La visita fué super agradable, los "chamos" de buglabs nos hicieron sentir como en casa mientras nos mostraban sus juguetes. Es raro que alguien te invite a jugar a su casa en estos días, y más si tienen juguetes sofisticados, por lo cual no queda otra más que darles las gracias y esperar que hagan más eventos invitando gente a sus cuarteles generales (revicen el website, ellos tienen un blog muy activo con información útil).
Ya para finalizar, los dejo con las fotos de mi visita a los cuarteles de Buglab en SOHO. Espero que las disfruten y se hagan una idea de lo que vimos allí.
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; 12 13/** 14 * Calibrate the sensor using a known value 15 * @author josevnz@kodegeek.com - http://kodegeek.com 16 */ 17publicfinalclassSensorCalibration{ 18 19/** 20 * Persist the calibration temperature to be used by all the applications 21 * @throws InterruptedException 22 */ 23publicstaticvoidmotemain()throwsInterruptedException{ 24Sensor<Temperature>tempSensor= SensorDriver.create("temp", Temperature.class); 25Ledsleds=LedsDriver.create(); 26floatcalibratedTemp=25.0f;// Put here your known temperature 27leds.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; 13 14/** 15 * Simple class to capture temperature using Sentilla JMote 16 * @author josevnz@kodegeek.com - http://kodegeek.com 17 */ 18 19publicfinalclassTemperatureCapture{ 20publicstaticfinalintWAIT_TIME=1000; 21 22/** 23 * Get the temperature reading 24 * @throws InterruptedException 25 */ 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 alive 42sender.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; 11 12/** 13 * Simple command line client that collects the temperature readings of 14 * all the motes in the wireless network. 15 * @author josevnz@kodegeek.com - http://kodegeek.com 16 */ 17publicfinalclassTemperatureClient{ 18 19privateTemperatureClient(){}; 20 21privatestaticfinalLoggerlog= Logger.getLogger(TemperatureClient.class.getName()); 22 23static{ 24log.setLevel(Level.INFO); 25} 26 27privatestaticfinalintMOTE_WAIT=3000; 28 29/** 30 * Helper class that captures the temperature comming from the sensor 31 * @author josevnz 32 */ 33classTemperatureCaptureHelper{ 34publicfinalMap<Long, TempMessage>sensorMap; 35 36/** 37 * Parametric constructor 38 * @param sensorMap Map to store all the captured temperatures 39 */ 40publicTemperatureCaptureHelper(Map<Long, TempMessage>sensorMap){ 41this.sensorMap=sensorMap; 42} 43 44publicvoidcapture(){ 45 46// Connect to the Sentilla server 47HostClientclient=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} 74 75/** 76 * Collect the statistics from all the motes 77 * @param args Unused 78 */ 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 :)
Kode (echar código): Forma más pura de creación, de los electrones a la aplicación...
Geek: Iluminado cibernetico con pasión inusual por temas técnicos complejos, pero socialmente inepto... KodeGeeK: Intento desesperado de que el Kode y el Geek se lleven bien