[Tutorial] Cómo crear una aplicación de servidor con la API Aquila


#1

El Aquila Server proporciona una API REST y una interfaz por web sockets para crear aplicaciones cliente.
Hay dos tipos principales de apps que se pueden hacer:

  1. Aplicaciones de servidor: son aplicaciones que corren en un servidor, o dentro del mismo hub, que monitorean dispositivos y proporcionan servicios, como conexión con otras APIs web.
  2. Aplicaciones UI: corren en un navegador y proporcionan una interfaz gráfica al usuario.

En este tutorial vamos a hacer una aplicación de servidor.

El objetivo de la aplicación que haremos será enviar un email cuando se presione un botón. Imaginaremos que este botón es un timbre de casa, y el email nos informará que alguien tocó el timbre.

Para esto, primero definiremos el hardware para el timbre: éste será un Altair, del cual estaremos usando el botón integrado (Pin 33) como botón del timbre.

Ahora, empecemos a programar. Para esto estaremos usando la terminal y node.js. (Si estas en Windows, por favor, usa Git Bash u otra terminal UNIX). Empecemos:

  1. Crea el directorio del proyecto:

    mkdir aquila-bell

  2. Entra en el directorio:

    cd aquila-bell

  3. Inicializa un nuevo proyecto de node.js, se te harán algunas preguntas; para el nombre de la app, usaremos “bell”; para el nombre del archivo main, usaremos “app.js”; todo lo demás se dejará por defecto:

    npm init

  4. instala las bibliotecas aquila-client y nodemailer:

    npm install aquila-client nodemailer --save

  5. Crea el archivo principal con el nombre mencionado anteriormente:

    touch app.js

  6. Abre app.js con tu editor de texto favorito. Yo usaré Sublime Text.

Código

Ahora si, empecemos a programar:

Primero, necesitamos importar las bibliotecas requeridas e inicializar la biblioteca Aquila-client, pasándole la url de tu servidor. Estoy corriendo el servidor en la misma computadora en la que estoy programando, así que usaré http://localhost:8080:

var nodemailer = require("nodemailer");
var Aquila = require("aquila-client");
// especifica la url de tu hub (servidor)
aq = new Aquila("http://localhost:8080");

Luego, hagamos dos variables para guardar la configuración del dispositivo:

// Configuración:
// El nombre del dispositivo que vamos a observar:
var DEVICE_NAME = "Button";
// El nombre del evento:
var EVENT_NAME = "Button Pressed";

Ahora configuraremos el Email. Primero está el objeto “transport”, aquí debes poner las credenciales de la cuenta que enviará el Email, luego el contenido del Email que será enviado, incluyendo la dirección de destino:

// Email setup:
// creando un objeto "transporter" reusable usando SMTP
var transporter = nodemailer.createTransport({
    service: "Gmail",
    auth: {
        user: "SENDER@gmail.com",
        pass: "YOUR PASSWORD"
    }
});

// contenido del Email
var mailContent = {
    from: "Aquila <SENDER@gmail.com>",
    to: "RECEIVER@gmail.com",
    subject: "#bell",
    text: "Someone rang the bell"
};

En la siguiente función, estamos pidiendo una lista de dispositivos que coinciden con el nombre del dispositivo, y luego estamos subscribiendo otra función que será llamada cuando el evento EVENT_NAME de estos dispositivos sea emitido. Dentro de esta función, simplemente estaremos imprimiendo en consola que “Alguien tocó el timbre”, y enviando el Email.

// Aquí se guardará la lista de dispositivos seleccionados
var devices = null;

var subscribeEvent = function()
{
    // Remueve todos los Listeners previos para evitar duplicados
    if(devices) devices.removeAllListeners(EVENT_NAME);

    // # para buscar por nombre
    devices = aq.devices("#" + DEVICE_NAME);
    
    // subscripción
    devices.on(EVENT_NAME, function(param)
        {
            console.log("Alguien tocó el timbre");
            // Envia el mail
            transporter.sendMail(mailContent, function(error, info)
            {
                if(error){
                    console.log(error);
                }else{
                    console.log("Message sent: " + info.response);
                }
            });
        });
};

Finalmente, el código que estará haciendo el trabajo real:
Aquí estaremos haciendo una conexión al Aquila Server, pasando el usuario, la contraseña y una función que será llamada cuando la conexión esté hecha.

Luego, llamaremos a subscribeEvent(), y luego inscribiremos esta misma función para que se ejecute cuando se añada un dispositivo nuevo a la red. Esto es para hacerlo mas robusto.

// hacer conexión y login con Aquila Server
aq.login("Admin", "Admin", function(err)
    {
        // atiende cualquier error en la conexión
        if(err) return console.log(err.message);

        subscribeEvent();

        // Resubscribir eventos cuando se añada un dispositivo
        aq.manager.socket.on("deviceAdded", function()
        {
            subscribeEvent();
        });
        
    });

Corriendo la aplicación

  1. Sube el ejemplo “Example_ButtonEvent” a un Altair, puedes encontrarlo desde el Arduino IDE en:
    File > Examples > Altair > Example_ButtonEvent
  2. Programa otro Altair como puente y mantenlo conectado a la PC
  3. Lanza el Aquila Server
  4. Alimenta al Altair programado como “timbre”
  5. Ejecuta este programa con node app.js
  6. Presiona el botón en el “timbre”; debes ver un mensaje en la terminal y recibir un Email.

Tip: Puedes modificar fácilmente este código para usar IFTTT, usando el “Email Channel” de IFTTT para ejecutar otros servicios web.

Para más información sobre cómo hacer apps para la API Aquila, ve el repo de aquila-client-node en GitHub.

También puedes probar código y monitorear la red Aquila con el aquila-monitor.

Puedes descargar este código completo en el repositorio de aquila-bell en GitHub.


[Tutorial] Recibe una notificación de tu timbre por medio de IFTTT
Recursos para Aquila (Documentación, código, etc.)
#2

hola veo que para suscribirse y escuchar eventos utilizan “devices.on”. ¿Que funciones o elementos utiliza este si quisiera programar en otro software que no sea node? Espero haberme dado a entender.Saludos


#3

@Victor_Dlgado, la función devices.on([event name], [function] ) es parte de la biblioteca aquila-client, hereda de EventEmmiter de node.js.

Básicamente lo que hace es decirle que cuando ocurra un evento dado, llame a la función que pasas como parámetro.

Por cierto, la biblioteca aquila-client que se usa en este tutorial está deprecada y ya no la estamos soportando. Lo que hace internamente es conectarse por medio de websockets al aquila-server, puedes encontrar un ejemplo de cómo hacer esto directamente en javascript al final de este documento: http://www.aquila.io/img/guides/Guia%20de%20la%20API%20Aquila.pdf

Si quisieras implementar esto en otro lenguaje necesitas alguna biblioteca cliente de websockets para ese lenguaje y conectarte con los parámetros que menciona el documento.