Internet de las Cosas
Es un concepto nuevo y simple, pero en muchas ocaciones, confuso. También es conocido como IoT por sus siglas en inglés Internet Of Things. No es más como su nombre lo indica, cosas que tienen internet. Es el conunto de objetos físicos interconectados por medio de internet.
Existe mucha filosofía en internet acerca de este concepto. En esta entrada vamos a ponerlo en práctica con un simple ejercicio. Encender y apagar un led por medio del celular. Para esto vamos a utilizar varias herramientas de software y hardware.
Herramientas
Estas son las herramientas que se utlizaron en este ejercicio:
- Cuenta en AWS (Amazon Web Service)
- Conocimientos de Javascript (node js) [En realidad no, pero sería de gran ayuda]
- Raspberry PI 3 Modelo B.
- Un teclado
- Pantalla
- Mouse
- Un led
- Protoboard
- Cables conectores Dupoint
Conectar el Raspberry PI
Para conectar nuestro Raspberry PI necesitamos generar unos certificados y añadirlo a nuestra cosa, de esta manera podemos asegurar con Amazon cual es el objeto que queremos conectar:
Configurar Iot Core de AWS
Para conectar una cosa a nuestro aws iot, seguimos los siguientes pasos:
- Entrar a https://console.aws.amazon.com/iot/home
- Luego en Administración y hacer clic en Crear
- Les debe salir una pantalla como la figura 1:

Figura 1. Crear cosa en aws iot
- Se escribe un nombre para la cosa
- Hacer clic en crear certificado.

Figura 2. Crear certificados aws iot
- Se descargan los 3 certificados.
- Se activa el certificado CA raiz y se descarga con el link que allí aparece.

Figura 3. Descargar certificados. Aws iot
- Hacer clic en Asociar una política
- Si no tiene una política registrada crearla con
- Action: iot:*
- Resources: *
Y listo, con esto le decimos a nuestro aws que tenemos un objeto, ahora tenemos que descargar los certificados en el Raspberry PI.
1. Configuración Raspberry PI
Si es la primera vez con Raspberry PI, le recomentamos seguir este tutorial: https://www.raspberrypi.org/help/noobs-setup/2/. En este ejercicio tomamos el SO recomendado por ellos.
Descargamos el repositorio en el dispositivo https://github.com/arturoverbel/led_nodejs_aws. Escribir las siguientes lineas de comando en la consola:
git clone https://github.com/arturoverbel/led_nodejs_aws cd led_nodejs_aws npm install mkdir certs
- En la carpeta de certs, incluir los certificados descargados, son cuatro, pero para esta actividad solo usaremos tres.
En el archivo led.js se encuentra toda la lógica.
var awsIot = require('aws-iot-device-sdk'); var Gpio = require('onoff').Gpio; var PIN = 18; const LED = new Gpio(PIN, 'out'); var device = awsIot.device({ keyPath: 'certs/d64015abd5-private.pem.key', certPath: 'certs/d64015abd5-certificate.pem.crt', caPath: 'certs/root-CA.crt', region: 'us-east-1', clientId: 'sdk-nodejs-128cb846-7b05-450a-87ef-86de0fa031d0', //clientId: 'mything', host: 'a1io5eo0eh1c6a-ats.iot.us-east-1.amazonaws.com' }); device.on('connect', function() { device.subscribe('LED'); console.log('Subscribed'); }); device.on('message', function(topic, payload){ data = JSON.parse(payload); if(data.hasOwnProperty('light')){ console.log(data.light); if(topic == 'LED'){ if(data.light == 'on'){ LED.writeSync(1); console.log('led on'); } else{ LED.writeSync(0); console.log('led off'); } } } });
En este código podemos decir lo siguiente:
- Usamos la librería aws-iot-device-sdk para solicitar los recursos de amazon.
- La librería Gpio nos ayuda a controlar el hardware de nuestro Raspberry.
- En la linea 4 establecemos cuál PIN usar, en nuestro caso el 18.
- La línea 8 a la 16 establecemos los parámetros de conexión, señalamos donde tenemos nuestros certificados (cambiar el nombre para su certificado correspondiente). El clientID puede ser cualquier nombre.
- La linea 18 a la 21 nos conectamos a amazon con los parámetros. Si todo resulta OK nos suscribimos al topic LED.
- Desde la linea 23 nos ayuda a recibir todo lo que llega en el canal del topic LED. Debe llegar un formato JSON.
- En la linea 31, si light es on, hacemos encender el LED
- Linea 35. Si es off lo hacemos apagar.
Configuración Hardware
Conectamos el Raspberry con el LED, tener en cuenta como está configurado los pins de nuestro Rapsberry PI3 modelo B:

Figura 4. Pins de Raspberry Pi.
En nuestro caso es el de la derecha. Así conectamos el cable en el 3 pin para la fuente a tierra y otro cable en el sexto pin para usar el pin 18.

Figura 5. Cables conectados al pin 18 del raspberry

Figura 6. Cables conectados al led en la protoboard
Probando Fase 1
Si vamos a AWS Iot Core en la consola de amazon y hacemos clic en Prueba nos debe salir una pantalla como en la Figura 7.

Figura 7. Pruebas de Mqtt. Aws Iot
Desde esta consola podemos envuar y leer los mensajes compartidos en cualquier tema. Enviamos al tema LED el siguiente mensaje:
{ "light": "on" }
Y luego en el mismo tema mandamos:
{ "light": "off" }
El LED debería encender y apagar.
Posibles Errores
Hasta aquí debería salir todo OK, pero durante el ejercicio me he topado con varios problemas:
- Los certificados deben tener la política correcta, establecida más arriba. No usar los certifiacdos del tutorial que se descargan desde AWS, esas policas están limitadas
- El root-CA no es necesario generarse (a menos que lo llevas a producción)
- Verificar con un script aparte de nodejs que el PIN efectivamente encienda.
2. Configuración servidor
Ahora bien, necesitamos crear un api para encender y apagar el led desde un servicio web. Sin utilizar el ambiente de prueba de Aws Iot. Para esto repetimos el mismo paso para crear una cosa en AWS IOT, la llamaremos server, descargamos los certificados. Luego utilizaremos el siguiente código en nodejs:
const awsIot = require('aws-iot-device-sdk'); const express = require('express') const app = express() const port = 3001 app.get('/', (req, res) => res.send('Light led')) const device = awsIot.device({ keyPath: 'certs/040198d3e3-private.pem.key', certPath: 'certs/040198d3e3-certificate.pem.crt', caPath: 'certs/root-CA.crt', region: 'us-east-1', clientId: 'server-prod', host: 'a1io5eo0eh1c6a-ats.iot.us-east-1.amazonaws.com' }); device.on('connect', function() { console.log('Connected'); }); app.get('/light/:state', function (req, res) { console.log("GET request") const state = req.params.state; const data = { light: state}; console.log(data); device.publish('LED', JSON.stringify(data)); res.send(data); }) app.listen(port, () => console.log(`Example app listening on port ${port}!`))
Esta vez usamos la librería express para montar un servidor web.
En la linea 6 nos conectamos a aws iot, y permanecerá conectado mientras el servidor esté corriendo. Solo cuando ingresen a la url http://127.0.0.1:3001/light/on se publicará un mensaje en el canal LED.
Importante subir este código a un servidor. Puede ser un EC2 para que tenga una dirección pública y poder llamarlo desde la aplicación del celular. Pueden correr en background este script con el comando:
node index.js > ~/logs/log &
Para esto se necesita crear un archivo llamado log en la carpeta con el path: ~/logs/
Probando Fase 2
En la figura 8 se puede ver una solicitud de nuestra api en producción. También pueden verlo desde la

Figura 8. Correr servicio api para prender y apagar el LED
En las pruebas de aws iot debería salir nuestro mensaje si nos subscribimos al tema LED, como lo muestra la figura 9:

Figura 9. Mensajes desde el servidor
3. Configuración Aplicación Móvil
Para la creación de la aplicación móvil, basta con descargar el repositorio de la app: https://github.com/arturoverbel/app_robot_car en su computadora. Nos dirijimos al archivo src/pages/home/home.ts el cual es un archivo escrito en TypeScript.
import { Component } from '@angular/core'; import { NavController } from 'ionic-angular'; import { AlertController } from 'ionic-angular'; import { Http } from "@angular/http"; @Component({ selector: 'page-home', templateUrl: 'home.html' }) export class HomePage { constructor( public navCtrl: NavController, public alertCtrl: AlertController, public http: Http ) { } showAlert(status) { let data = (status == 1) ? 'on' : 'off'; let url = 'http://35.168.88.201:3001/light/' + data; this.http.get(url) .subscribe(response => { console.log(response.json()) }, xhr => { console.log(xhr); }); const alert = this.alertCtrl.create({ title: 'Petición enviada', subTitle: 'Status: ' + status, buttons: ['OK'] }); alert.present(); } }
Este código recibe datos de la vista home.html de 1 o 0. Estos se setean en la url para solicitar el servicio. Recuerden cambiar en la linea 20 la dirección de su servicio.
Para correr en su local correr el comando
ionic serve
Les debería aparecer la aplicación en su navegador:

Figura 10. Aplicación corriendo en el navegador
Si todo sale bien, en hacer clic en los botones debería encender y apagar el led.
Para obtener el apk bien pueden correr el comando para android:
ionic cordova build android
Para esto deberían tener Android Studio instalado en su computador y definir las variables de entorno en donde se encuentra la instalación.
(Siento no hablar mucho de ionic, en realidad yo tampoco soy muy experto 😣)
Probando versión final
Luego de instalar el apk en su teléfono móvil, pueden encender y apagar el led cuando quieran. Este es una prueba de todo el ejercicio:
Anexos
- Aplicación en Ionic: https://github.com/arturoverbel/app_robot_car
- Script para el LED en el Raspberry: https://github.com/arturoverbel/led_nodejs_aws
- Script para el servidor en nodejs: https://github.com/arturoverbel/publush_iot
Comentarios