Mostrando las entradas con la etiqueta node. Mostrar todas las entradas
Mostrando las entradas con la etiqueta node. Mostrar todas las entradas

domingo, 18 de junio de 2017

Raspberry pi 3

Como ya me pasó varias veces, finalmente incurrí en una nueva (al menos para mi) tecnología a la que le tenía rechazo. Esta vez les traigo una placa muy interesante, la raspberry pi 3, esta placa cuenta con pines de uso general, y tiene la posibilidad (que es lo mas recomendable) de instalarle un sistema operativo Linux (o incluso Windows IOT) ademas de que podremos elegir entre varias distros, lo cual lo hace una plataforma muy flexible. El OS recomendado (que por lo general suelen ser los mejores) es el Linux raspbian que está basado en debian.

  1. Primero que nada, para instalar el os, debemos contar con una memoria micro sd de 8gb como mínimo.
  2. Segundo, vamos a la siguiente página: https://www.raspberrypi.org/downloads/noobs/ y bajamos el noobs (hacemos click donde dice download zip)
  3. Descomprimimos el archivo y guardamos todas las cosas en la memoria micro sd (son varios archivos, por lo que si solo aparece una carpeta la vamos a abrir para encontrar todos los archivos).
  4. Insertamos la memoria en su ranura correspondiente de la raspberry pi, conectamos el monitor, conectamos mouse y teclado (admite un mouse y teclado inalámbricos) y energizamos la placa.
  5. Nos va a aparecer una ventana de instalación, que si seguimos los pasos correctamente no deberíamos tener ningún problema. El SO raspbian no hace falta descargarlo, pero si queremos otro SO (en el menú de instalación se puede elegir entre varios SO) vamos a tener que contar con una conexión a internet (ya sea por wifi o por ethernet) para bajarlo.
Una vez instalado el raspbian (si este fue el so que elegimos) la raspberry pi 3 puede ser usada como servidor, y una de las cosas que más me interesa es que soporta el node-red. Si bien la versión que viene por defecto con la distro debian (si, ya tiene el node-red instalado) está desactualizada, se puede actualizar ingresando por consola el siguiente comando:

update-nodejs-and-nodered

Si luego ejecutamos el comando node-red (para iniciar el servidor) vamos a contar con la versión para la raspberry pi, que viene con un nodo para verificar el estado de los pines (dicho con otras palabras, desde el node-red tendremos acceso a los pines gpio).

Conclusión: Esta plataforma (al igual que la beaglebone balck) es muy completa y tiene casi todo lo necesario para desarrollar sistemas robustos que necesiten de un sistema operativo y pines de propósito general.

domingo, 4 de junio de 2017

ESP8266 + Node-Red + MQTT broker

Bueno, ahora que ya tenemos los conocimientos básicos sobre el MQTT, node-red, el módulo ESP8266 y ya usamos el ESP8266 más un MQTT broker podremos integrar todo para obtener un sistema bastante completo y de cierta complejidad (de forma sencilla).

Primero que nada vamos a iniciar los servicios de node-red y mosca. Una vez que se inicien, vamos a la ip local 127.0.0.1:1880 y ahí deberíamos configurar los siguientes módulos:

  1. Text imput: configurado para que aparezca en el default del dashboard y con un Delay (ms) en 0 para que espere a que se presione el enter para mandar.
  2. MQTT: configurado con la ip donde se aloja el mqtt broker y con el tópico mensajes.
Y debería quedar como muestra la siguiente imágen:


Y si nos vamos a la dirección 127.0.0.1:1880/ui deberíamos encontrarnos con el dashboard de esta forma.


En donde dice escribir acá podremos ingresar un mensaje que se va a mandar a través del mqtt broker, de esta forma si accedemos a la dirección ip de nuestra pc desde el celular (el navegador) podremos mandar mensajes sin necesidad de ninguna aplicación.

Ahora si vamos a arduino y cargamos el siguiente código (que es el mismo que la última vez) y lo cargamos en nuestra ESP8266 deberíamos poder recibir por el puerto serie el mensaje que mandemos desde la interfaz web:


#include <ESP8266WiFi.h>
#include <PubSubClient.h>

// Las siguientes tres constantes definen, ip del 
//mqtt broker, nombre de red wifi y su contraseña.

const char* mqtt_server = "192.168.1.15";
const char* ssid = "id_red_wifi";
const char* password = "contraseña_red_wifi";

// A continuación declaramos el nombre del cliente 
// que se va a conectar.
WiFiClient espClient;
PubSubClient client(espClient);

// En esta variable se almacena el mensaje recibido
// notar que tiene un máximo de 50 (en realidad son
// 49) caracteres.
char msg[50];

// Iniciamos la comunicación serie, la conexión por
// wifi y definimos en donde se aloja el servidor y
// en qué puerto, y la función donde administramos
// la llegada de mensajes.
void setup() {
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  client.setCallback(callback);
}

// En esta función se conecta con la red designada,
// mientras esté tratando de conectarse va a mandar
// un punto "." por el puerto serie y cuando lo 
// consiga nos avisará.
void setup_wifi() {

  delay(10);

  Serial.println();
  Serial.print("Conectando a: ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("WiFi conectado");
  Serial.println("Direccion IP: ");
  Serial.println(WiFi.localIP());
}

// En esta función se administra la llegada de 
// mensajes, nos avisa en qué tópico llegó y 
// cuál es el mensaje.
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Mensaje recibido [");
  Serial.print(topic);
  Serial.print("] ");
  for (int i = 0; i < length; i++) {
    Serial.print((char)payload[i]);
  }
  Serial.println();
}

// Esta función se encarga de conectar con el 
// mqtt broker, si lo consigue se subscribe a
// los tópicos que definamos (no es necesario
// subscribirnos en esta función, pero si lo
// recomiendo para organizar mejor el código.
// Prueba reconectarse cada cinco segundos si
// no lo consigue.
void reconectar() {

  while (!client.connected()) {
    Serial.print("Intentando conectar con el mqtt broker...");

    if (client.connect("ESP8266Client")) {
      Serial.println("conectado");
      client.subscribe("mensajes");
    } else {
      Serial.print("fallo, rc=");
      Serial.print(client.state());
      Serial.println(" prueba nuevamente en 5 segundos");

      delay(5000);
    }
  }
}

// En el loop principal no hacemos nada más 
// que verificar si perdimos la conexión con
// el servicio mqtt y verificamos que lleguen
// mensajes. El "client.loop();" se encarga 
// de revisar si llegaron mensajes, por lo 
// que habría que invocar esta función regu-
// larmente.
// Esta sección se podría mejorar si ponemos
// que revise si perdió la conexión con la
// red wifi.
void loop() {

  if (!client.connected()) {
    reconectar();
  }
  client.loop();
}

Si agregamos al código algo que "analice" el mensaje entrante podremos hacer algún programa que "reaccione" ante ciertos mensajes en específico.

domingo, 14 de mayo de 2017

Node-Red Introducción

Hoy les traigo un programa llamado "Node-red", que es una herramienta que sirve para montar servicios de forma rápida y sencilla. Antes que nada, vamos a instalarlo.

  1. Primero vamos a descargar e instalar el aquila tools. Este programa nos va a instalar todo lo necesario, el git bash, python 2.7.x, el arduino, es un paquete de programas necesarios para poder usar el node red sin ningún problema.
  2. Una vez instalado, abrimos el git-bash y ponemos el comando "npm install node-red -g" y una vez que termina ponemos el comando "npm install node-red-dashboard" una vez finalizado ya tendremos todo lo necesario para usar el node-red en casi todo su esplendor.
Si en la ventana del git-bash ponemos node-red y vamos a la dirección ip 127.0.0.1:1880 nos vamos a encontrar con una interfaz en al cual podremos "programar".


si arrastramos el nodo inject y el debug y los conectamos como muestra la siguiente imágen:


y hacemos click en el botón deploy y en la pestaña debug deberíamos ver lo siguiente:


Esto se consigue haciendo click en el botón del nodo inject (donde está recuadrado en rojo). Si bien esto no es un gran avance y no es muy interesante, si vamos a las 3 filas que se encuentran arriba a la derecha, ponemos la opción import, seleccionamos clipboard y pegamos lo siguiente:

[{"id":"bc740d23.438bf","type":"websocket-listener","path":"/ws/chat","wholemsg":"false"},{"id":"c86da933.379258","type":"websocket in","name":"","server":"bc740d23.438bf","x":112,"y":61,"z":"d46b9957.2b9468","wires":[["f9476129.06b8a"]]},{"id":"f9476129.06b8a","type":"function","name":"","func":"delete msg._session;\nreturn msg;\n\n","outputs":1,"valid":true,"x":286,"y":61,"z":"d46b9957.2b9468","wires":[["bda54943.425ab8"]]},{"id":"bda54943.425ab8","type":"websocket out","name":"","server":"bc740d23.438bf","x":467,"y":61,"z":"d46b9957.2b9468","wires":[]},{"id":"df7af34a.20851","type":"http in","name":"","url":"/chat","method":"get","x":120,"y":129,"z":"d46b9957.2b9468","wires":[["969892ad.69677"]]},{"id":"969892ad.69677","type":"template","name":"","field":"","template":"<head>\n  <meta name=\"viewport\" content=\"width=320, initial-scale=1\">\n  <title>Chat</title>\n</head>\n\n<body>\n  <div id=\"wrapper\">\n    <div id=\"chat_box\" class=\"content\"></div>\n\n    <div id=\"footer\">\n      <div class=\"content\">\n        <input type=\"text\" id=\"user\" placeholder=\"Who are you?\" />\n        <input type=\"text\" id=\"message\" placeholder=\"What do you want to say?\" />\n        <input type=\"button\" id=\"send_btn\" value=\"Send\" onclick=\"sendMessage()\">\n      </div>\n    </div>\n  </div>\n</body>\n\n<script type=\"text/javascript\">\n  var wsUri = \"ws://{{req.headers.host}}/ws/chat\";\n  var ws = new WebSocket(wsUri);\n\n  function createSystemMessage(message) {\n    var message = document.createTextNode(message);\n\n    var messageBox = document.createElement('p');\n    messageBox.className = 'system';\n\n    messageBox.appendChild(message);\n\n    var chat = document.getElementById('chat_box');\n    chat.appendChild(messageBox);\n  }\n\n  function createUserMessage(user, message) {\n    var user = document.createTextNode(user + ': ');\n\n    var userBox = document.createElement('span');\n    userBox.className = 'username';\n    userBox.appendChild(user);\n\n    var message = document.createTextNode(message);\n\n    var messageBox = document.createElement('p');\n    messageBox.appendChild(userBox);\n    messageBox.appendChild(message);\n\n    var chat = document.getElementById('chat_box');\n    chat.appendChild(messageBox);\n  }\n\n  ws.onopen = function(ev) {\n    createSystemMessage('[Connected]');\n  };\n\n  ws.onclose = function(ev) {\n    createSystemMessage('[Disconnected]');\n  }\n\n  ws.onmessage = function(ev) {\n    var payload = JSON.parse(ev.data);\n    createUserMessage(payload.user, payload.message);\n\n    var chat = document.getElementById('chat_box');\n    chat.scrollTop = chat.scrollHeight;\n  }\n\n  function sendMessage() {\n    var user = document.getElementById('user');\n    var message = document.getElementById('message');\n\n    var payload = {\n      message: message.value,\n      user: user.value,\n      ts: (new Date()).getTime()\n    };\n\n    ws.send(JSON.stringify(payload));\n    message.value = \"\";\n  };\n</script>\n\n<style type=\"text/css\">\n  * {\n    font-family: \"Palatino Linotype\", \"Book Antiqua\", Palatino, serif;\n    font-style: italic;\n    font-size: 24px;\n  }\n\n  html, body, #wrapper {\n    margin: 0;\n    padding: 0;\n    height: 100%;\n  }\n\n  #wrapper {\n    background-color: #ecf0f1;\n  }\n\n  #chat_box {\n    box-sizing: border-box;\n    height: 100%;\n    overflow: auto;\n    padding-bottom: 50px;\n  }\n\n  #footer {\n    box-sizing: border-box;\n    position: fixed;\n    bottom: 0;\n    height: 50px;\n    width: 100%;\n    background-color: #2980b9;\n  }\n\n  #footer .content {\n    padding-top: 4px;\n    position: relative;\n  }\n\n  #user { width: 20%; }\n  #message { width: 68%; }\n  #send_btn {\n    width: 10%;\n    position: absolute;\n    right: 0;\n    bottom: 0;\n    margin: 0;\n  }\n\n  .content {\n    width: 70%;\n    margin: 0 auto;\n  }\n\n  input[type=\"text\"],\n  input[type=\"button\"] {\n    border: 0;\n    color: #fff;\n  }\n\n  input[type=\"text\"] {\n    background-color: #146EA8;\n    padding: 3px 10px;\n  }\n\n  input[type=\"button\"] {\n    background-color: #f39c12;\n    border-right: 2px solid #e67e22;\n    border-bottom: 2px solid #e67e22;\n    min-width: 70px;\n    display: inline-block;\n  }\n\n  input[type=\"button\"]:hover {\n    background-color: #e67e22;\n    border-right: 2px solid #f39c12;\n    border-bottom: 2px solid #f39c12;\n    cursor: pointer;\n  }\n\n  .system,\n  .username {\n    color: #aaa;\n    font-style: italic;\n    font-family: monospace;\n    font-size: 16px;\n  }\n\n  @media(max-width: 1000px) {\n    .content { width: 90%; }\n  }\n\n  @media(max-width: 780px) {\n    #footer { height: 91px; }\n    #chat_box { padding-bottom: 91px; }\n\n    #user { width: 100%; }\n    #message { width: 80%; }\n  }\n\n  @media(max-width: 400px) {\n    #footer { height: 135px; }\n    #chat_box { padding-bottom: 135px; }\n\n    #message { width: 100%; }\n    #send_btn {\n      position: relative;\n      margin-top: 3px;\n      width: 100%;\n    }\n  }\n</style>\n","x":286,"y":129,"z":"d46b9957.2b9468","wires":[["82cb0232.7d35"]]},{"id":"82cb0232.7d35","type":"http response","name":"","x":429,"y":129,"z":"d46b9957.2b9468","wires":[]}]

Una vez que presionemos el botón deploy podremos obtener un chat dentro de la red local (si queremos saber como acceder deberíamos saber nuestra ip local y agregar ":1880/chat" (todo esto en el navegador)).

Por defecto en la ip de nuestra máquina más ":1880/ui" vamos a tener una página web desde donde podríamos agregar gráficas y botones. Esto lo explicaré mejor la próxima vez en un ejemplo más práctico. Por lo pronto pueden ir investigando y procesando toda esta información para poder entenderlo lo mejor posible.