Archivo de la categoría: Curso IoT Open Source

Grafana y Arduino

Grafana es un software libre basado en licencia de Apache 2.0, que permite la visualización y el formato de datos métricos. Permite crear cuadros de mando y gráficos a partir de múltiples fuentes, incluidas bases de datos de series de tiempo como Graphite, InfluxDB y OpenTSDB. Originalmente comenzó como un componente de Kibana y que luego le fue realizado una bifurcación.

Grafana es multiplataforma sin ninguna dependencia y también se puede implementar con Docker. Está escrito en lenguaje Go y tiene un HTTP API completo.

Además de administrar cuadros de mando clásicos (adiciones, eliminaciones, favoritos), Grafana ofrece compartir un cuadro de mando actual mediante la creación de un enlace o una instantánea estática del mismo.

Todos los paneles de control y las fuentes de datos están vinculados a una organización, y los usuarios de la aplicación están vinculados a organizaciones a través de roles.

Web: https://grafana.com/

Grafana API: https://grafana.com/docs/http_api/

Como obtener grafana: https://grafana.com/get

Wikipedia: https://es.wikipedia.org/wiki/Grafana

Introducing grafana 6: https://www.hostedgraphite.com/blog/introducing-grafana-6

Instalar Grafana

Download: https://grafana.com/grafana/download

Instalación en sistemas linux: https://grafana.com/docs/installation/rpm/

Para iniciar el servicio: sudo service grafana-server start

Esto iniciará el proceso grafana-server como el usuario grafana, que se crea durante la instalación del paquete. El puerto HTTP predeterminado es 3000, y el usuario y el grupo predeterminados son admin. Nombre de usuario y contraseña por defecto admin/admin

Guia de instalación en Debian/Ubuntu: https://grafana.com/docs/installation/debian/

Guia de instalación CentOS: https://grafana.com/docs/installation/rpm/

Instalar y configurar en CentOS: https://www.fosslinux.com/8328/how-to-install-and-configure-grafana-on-centos-7.htm

Actualizar grafana: https://grafana.com/docs/installation/upgrading/

Tutoriales para CentOS:

Instalar Grafana en Raspberry Pi

Download para Raspberry Pi: https://grafana.com/grafana/download?platform=arm

Comandos:

Para actualizar: sudo apt-get install grafana

Iniciar el servicio: sudo service grafana-server start

Para configurar grafana en el arranque: sudo systemctl enable grafana-server.service

Más información: https://grafana.com/docs/installation/rpm/

Ahora podemos acceder a Grafana desde el navegador en http://127.0.0.1:3000 con admin/admin y nos pedirá que cambiemos la contraseña.

Adicionalmente si queremos instalar influxDB: sudo apt-get install influxdb

Getting started InfluxDB: https://docs.influxdata.com/influxdb/v1.7/introduction/getting-started/

Configuring InfluxDB: https://docs.influxdata.com/influxdb/v1.7/administration/config/

Instalar Telegraf (opcional):

Herramientas:

  • Grafana: Una herramienta que te permite visualizar series de datos temporales de una forma visualmente muy atractiva. Además de la parte visual, dispone de un potente motor y editor de consultas, que te permite seleccionar y tratar los datos que necesitas mostrar en las gráficas y Dashboards que puedes crear en su interfaz web. Además, los datos que muestra se pueden incluir desde diversas fuentes de datos, entre las que se encuentran Graphite, InfluxDB, Prometheus, ElasticSearch, AWS CloudWatch, StackDriver, MySQL y muchos otros mediante los plugins que tiene disponibles.
  • InfluxDB: Es una base de datos diseñada para almacenar series de datos temporales, esto quiere decir, que se almacenan una serie de datos en registros asociados a un valor principal o índice, que es la marca de tiempo (fecha y hora). La monitorización es un caso típico de este almacenamiento de datos, donde se guarda la marca de tiempo, el nombre del host y los valores de métricas que se pretenden almacenar (CPU, memoria, IO, red, …). InfluxDB es software libre, y el rendimiento que definen para este tipo de entornos es muy competitivo.
  • Telegraf: Es un agente que se encarga de recopilar datos/métricas de un determinado sistema y almacenarlos donde le indiquemos. Por ejemplo, Telegraf recopilará datos de sistema tradicionales (uso de memoria, uso de MySQL/Apache, …) y los enviará a la URL con la API de InfluxDB, que se encargará de almacenarlo. Telegraf, al igual que InfluxDB, pertenecen a Influxdata, por lo que la integración entre ambos es perfecta.
  • Chronograf es la aplicación web de código abierto de InfluxData. Utilice Chronograf con los otros componentes de la pila TICK para visualizar sus datos de monitorización y crear fácilmente reglas de alerta y automatización.
  • Kapacitor es un motor de procesamiento de datos nativo. Puede procesar stream de datos de InfluxDB. Kapacitor le permite conectar su propia lógica personalizada o funciones definidas por el usuario para procesar alertas con umbrales dinámicos, hacer coincidir las métricas de los patrones, calcular anomalías estadísticas y realizar acciones específicas basadas en estas alertas, como el reequilibrio de carga dinámico.

TICK Stack: https://www.influxdata.com/time-series-platform/

Otros tutoriales:

Configurar Grafana

El archivo de configuración se encuentra en /etc/grafana/grafana.ini.

Para obtener detalles sobre todas esas opciones de configuración consultar: https://grafana.com/docs/installation/configuration/

Seguridad: https://grafana.com/docs/installation/security/

Autenticación: https://grafana.com/docs/auth/overview/

Añadir fuentes de datos a Grafana

Getting started: https://grafana.com/docs/guides/getting_started/

Conceptos básicos: https://grafana.com/docs/guides/basic_concepts/

Añadir la BBDD de MySQL donde hemos guardado nuestros datos de Arduino:

Adding data sources:

Primera Gráfica

Guia de novatos para hacer Dashboards: https://www.youtube.com/watch?v=sKNZMtoSHN4&index=7&list=PLDGkOdUX1Ujo3wHw9-z5Vo12YLqXRjzg2

Getting started: https://grafana.com/docs/guides/getting_started/

Pasos:

  • Crear un nuevo Dashboard
  • Añadir una Visualización
  • Elegir “Graph”
  • Poner en Column: IntensidadLuminosa
  • Crear otra visualización como tabla.

Resultado:

Métricas fáciles: https://www.ochobitshacenunbyte.com/2018/03/01/metricas-faciles-con-influxdb-telegraf-y-grafana/

Paneles https://grafana.com/docs/features/panels/graph/

  • Graph
  • Logs
  • Singlestat
  • Table
  • Heatmap
  • Alert List
  • Dasboard list
  • Text

Visualizar los datos de la raspberry Pi en un dashboard:

Plugins Grafana

Plugings grafana: https://grafana.com/plugins 

Instalar plugin grafana: https://grafana.com/grafana/plugins/grafana-piechart-panel/installation

Hosted Grafana

Web: https://grafana.com/products/cloud/

Si no queremos instalarlo tenemos disponible un grafana en la nube gratuito para un usuario y hasta 5 dashboards. Pricing: https://grafana.com/products/cloud/#pricing

Mi grafana cloud: https://aprendiendoarduino.grafana.net/

API REST

Las API REST se han convertido en una herramienta muy importante para los desarrollos con IoT al permitir conectar servicios entre sí. Vamos a explicar qué son exactamente.

La interfaz de programación de aplicaciones, conocida también por la sigla API, en inglés, application programming interface, es un conjunto de subrutinas, funciones y procedimientos (o métodos, en la programación orientada a objetos) que ofrece cierta biblioteca para ser utilizado por otro software como una capa de abstracción.

Hoy en día la mayoría de las empresas utilizan API REST para crear servicios. Esto se debe a que es un estándar lógico y eficiente para la creación de servicios web. Por poner algún ejemplo tenemos los sistemas de identificación de Facebook, la autenticación en los servicios de Google (hojas de cálculo, Google Analytics, …).

Las APIs forman el pegamento de conexión entre las aplicaciones modernas. Casi todas las aplicaciones utilizan APIs para conectarse con fuentes de datos corporativas, servicios de datos de terceros u otras aplicaciones. La creación de un formato de descripción abierto para los servicios de API que sea neutral para los proveedores, portátil y abierto es fundamental para acelerar la visión de un mundo verdaderamente conectado.

Una API es básicamente una forma de hacer una solicitud a otra aplicación. Por ejemplo, si estamos desarrollando una aplicación y queremos encontrar a las personas que nos siguen en Twitter, podría solicitar esta información a la API de Twitter: “Dame una lista de todas las personas que me siguen”. No hay diferencias si nuestra aplicación está en Ruby, Php, Javascript, etc., y Twitter otro lenguaje porque la API transmite y recibe datos en un formato común (normalmente JSON o XML). Esto permite que dos aplicaciones totalmente separadas envíen y reciban datos.

REST, REpresentational State Transfer, es un tipo de arquitectura de desarrollo web que se apoya totalmente en el estándar HTTP. REST nos permite crear servicios y aplicaciones que pueden ser usadas por cualquier dispositivo o cliente que entienda HTTP, por lo que es increíblemente más simple y convencional que otras alternativas como SOAP y XML-RPC. REST se definió en el 2000 por Roy Fielding, coautor principal también de la especificación HTTP. Podríamos considerar REST como un framework para construir aplicaciones web respetando HTTP.

Conocer bien HTTP no es opcional para alguien de desarrollo APIs ni para los consumidores de las mismas. El RFC es sencillo de leer.

Para desarrollar APIs REST los aspectos claves que hay que dominar y tener claros son:

Más información:

Según Fielding las restricciones que definen a un sistema RESTful serían:

  • Cliente-servidor: esta restricción mantiene al cliente y al servidor débilmente acoplados. Esto quiere decir que el cliente no necesita conocer los detalles de implementación del servidor  y el servidor se “despreocupa” de cómo son usados los datos que envía al cliente.
  • Sin estado: aquí decimos que cada petición que recibe el servidor debería ser independiente, es decir, no es necesario mantener sesiones.
  • Cacheable: debe admitir un sistema de almacenamiento en caché. La infraestructura de red debe soportar una caché de varios niveles. Este almacenamiento evitará repetir varias conexiones entre el servidor y el cliente para recuperar un mismo recurso.
  • Interfaz uniforme: define una interfaz genérica para administrar cada interacción que se produzca entre el cliente y el servidor de manera uniforme, lo cual simplifica y separa la arquitectura. Esta restricción indica que cada recurso del servicio REST debe tener una única dirección, “URI”.
  • Sistema de capas: el servidor puede disponer de varias capas para su implementación. Esto ayuda a mejorar la escalabilidad, el rendimiento y la seguridad.

Las operaciones más importantes que nos permitirán manipular los recursos son cuatro:

  • GET para consultar y leer
  • POST para crear
  • PUT para editar
  • DELETE para eliminar.

Ventajas e inconvenientes de las API REST: http://www.desarrolloweb.com/articulos/ventajas-inconvenientes-apirest-desarrollo.html

Arquitectura de una API REST: https://juanda.gitbooks.io/webapps/content/api/arquitectura-api-rest.html

Buenas prácticas de diseño de API REST: https://elbauldelprogramador.com/buenas-practicas-para-el-diseno-de-una-api-restful-pragmatica/

Qué es REST:

Enlaces:

Cliente REST de Arduino: https://github.com/csquared/arduino-restclient

Requests HTTP en python:

En informática, CRUD es el acrónimo de “Crear, Leer, Actualizar y Borrar” (del original en inglés: Create, Read, Update and Delete), que se usa para referirse a las funciones básicas en bases de datos o la capa de persistencia en un software.

Wikipedia: https://es.wikipedia.org/wiki/CRUD

Crear una API: https://desarrolloweb.com/manuales/manual-desarrollo-api.html 

Pulling and pushing data con Arduino usando HTTP:

Pull: Una aplicación en un ordenador o servidor pregunta a Arduino por los datos

Push: Arduino se comunica con el servidor para mandarle los datos

Postman

Postman surgió originariamente como una extensión para el navegador Google Chrome. A día de hoy dispone de aplicaciones nativas para MAC y Windows y Linux.

Está compuesto por diferentes herramientas y utilidades gratuitas (en la versión free) que permiten realizar tareas diferentes dentro del mundo API REST: creación de peticiones a APIs internas o de terceros, elaboración de tests para validar el comportamiento de APIs, posibilidad de crear entornos de trabajo diferentes (con variables globales y locales), y todo ello con la posibilidad de ser compartido con otros compañeros del equipo de manera gratuita (exportación de toda esta información mediante URL en formato JSON).

Además, dispone de un modo cloud colaborativo (de pago) para que equipos de trabajo puedan desarrollar entre todos colecciones para APIs sincronizadas en la nube para una integración más inmediata y sincronizada.

Más información: https://www.paradigmadigital.com/dev/postman-gestiona-construye-tus-apis-rapidamente/

El interés fundamental de Postman es que lo utilicemos como una herramienta para hacer peticiones a APIs y generar colecciones de peticiones que nos permitan probarlas de una manera rápida y sencilla.

Las colecciones son carpetas donde se almacenan las peticiones y que permiten ser estructuradas por recursos, módulos o como desees:

Todas las llamadas almacenadas en nuestra colección pueden ser exportadas a múltiples lenguajes haciendo clic en el apartado Generate Code que podéis ver en la captura anterior. Os dejo un ejemplo de cómo exporta una llamada GET para poder ser utilizada automáticamente desde código Python:

Herramienta para las API REST: Postman

Video explicativo: https://www.youtube.com/watch?list=PLM-7VG-sgbtCJYpjQfmLCcJZ6Yd74oytQ&v=ptvV_Fc3hd8   

Como probar una api rest con postman: https://www.luisllamas.es/realizar-peticiones-http-con-postman/ 

Instalar postman y probar a hacer estas dos peticiones:

Autorización/Autenticación API Rest

En el mundo de las API REST, se deben implementar flujos distintos de los habituales en cuanto a la autenticación de usuarios, ya que su arquitectura nos ofrece otro tipo de recursos que los tradicionales. Por lo general, en las aplicaciones web tradicionales, se utilizan las variables de sesión como soporte para memorizar el usuario. Esto viene a decir que en el momento de autenticar un usuario, el servidor genera las correspondientes variables de sesión y en las siguientes páginas consultadas por ese mismo cliente, es capaz de recordar al usuario.

Sin embargo, en las aplicaciones REST, esto no es posible, ya que una de las limitaciones de este sistema es que no se dispone de variables de sesión. Esto es debido a motivos de escalabilidad, ya que las API REST suelen estar alojadas en un cluster de servidores. La solución habitual para salvar este problema es la autenticación por token.

Una API RESTful debería ser stateless (sin estado). Esto significa que la petición de autenticación no debería depender de cookies o sesiones. En lugar de ello, cada petición debería venir con algún tipo de credencial de autorización.

En una API REST, enviar las credenciales una vez para iniciar sesión no es suficiente, las API REST son asíncronas. Al ser asíncrona, la API REST no puede recordar las credenciales ya que no existe ninguna sesión activa HTTP. ¡Así que tienes que indicar quién eres cada vez que hagas una petición!

Siempre que se use SSL, las credenciales de autenticación pueden ser simplificadas a un token de acceso generado de forma aleatoria, que es entregado en el campo de nombre de usuario de HTTP Basic Auth.

De todos modos, este método de autenticación token-over-basic-auth (token sobre autenticación básica) es sólo aceptable en los casos en que sea práctico tener la posibilidad de que el usuario copie un token de una interface de administración del entorno del consumidor de la API.

En los casos donde no sea posible, OAuth 2 debería ser usado para facilitar la transferencia del token seguro a terceros. OAuth 2 usa tokens Bearer y además depende de SSL para su encriptación de transporte subyacente.

Una API que necesita soporte JSONP necesitará un tercer método de autenticación, ya que las peticiones JSONP no pueden enviar credenciales HTTP Basic Auth ni Bearer tokens. En este caso, puede utilizarse un parámetro especial de consulta “access_token”.

Más información:

Basic Auth

Siempre que se use SSL, las credenciales de autenticación pueden ser simplificadas a un token de acceso generado de forma aleatoria, que es entregado en el campo de nombre de usuario de HTTP Basic Auth.

Esta es la forma más sencilla de asegurar tu API. Se basa principalmente en un nombre de usuario y una contraseña para identificarte.

Para comunicar estas credenciales desde el cliente hasta el servidor, se debe realizar mediante el encabezado HTTP Autorización (Authorization), según la especificación del protocolo HTTP.

Este método de autentificación está algo anticuado y puede ser un problema de seguridad en tu API REST.

API Key

Las API Keys son el primer método que apareció para realizar accesos a este tipo de servicios. Los desarrolladores no dudan en pensar en ella como la primera alternativa a la hora de autenticarse en su API. Esto se debe a que entre sus ventajas están su simpleza, la posibilidad de sacar estadísticas de accesos o peticiones y a su facilidad de uso para implementarlas en las aplicaciones que consumirán el servicio. Generalmente cuando accedemos a una web con este tipo de autenticación, vamos a nuestro perfil y en la sección de configuración nos encontramos con la API Key lista para ser cargada en alguna app móvil o servicio web para hacer tests de API.

Todo esto trae aparejados dos grandes problemas que son: su falta de seguridad y la pésima experiencia de usuario. En muchos casos, estas claves son enviadas dentro de la URL en donde se realiza la petición al servicio, lo que permite ser accedida por alguien que no debería. Para esto el estándar nos dice que las keys deberían viajar en el Header de la petición, para dificultar un poco su acceso por parte de terceros, aunque en la práctica se pueden ver en el Header Authorization, en un Header personalizado o en la URL.

Token

Un token es un valor que nos autentica en el servidor, Normalmente se consigue después de hacer login mediante usuario/contraseña.

Un token se genera normalmente como un hash calculado con algún dato (p.ej. login del usuario + clave secreta). Además el token puede llevar datos adicionales como el login.

Cada vez que el cliente deba realizar nuevas solicitudes al servidor, certificando que es un usuario correctamente autenticado, tendrá que enviar el token de nuevo al servidor. Por lo tanto, una vez recibido el token, deberá ser almacenado del lado del cliente para enviarlo con las posteriores solicitudes. En estos casos, el token suele viajar en las cabeceras del HTTP, de modo que llegue al servidor.

El servidor que recibe el token tiene la capacidad de desencriptarlo, de modo que pueda comprobar qué usuario es el que está realizando esta solicitud. Durante el proceso de decodificación del token, el servidor puede comprobar si este es válido y si resulta serlo, puede recuperar toda la información encriptada en el mismo, que suele ser al menos la referencia inequívoca del usuario involucrado. Por supuesto, si en cualquier momento se detecta que el token no es correcto, se obligará al usuario a autenticarse nuevamente.

Más información: https://desarrolloweb.com/articulos/autenticacion-token.html

JSON Web Token

Este tipo de token es mucho más largo que los demás ya que depende de la cantidad de datos que queramos almacenar en él. Sin embargo, una buena utilización del mismo nos permitiría mantener un token que se puede enviar por la red sin ocupar mucho espacio.

Este token está compuesto por varios campos codificados en base64 donde se guarda la información, identificación de usuario, alcance de los permisos del token, y finalmente una firma de todo los datos contenidos del token hecha por el servidor de la API para comprobar que el token es válido. Esta comprobación es mucho más eficiente y rápida que el acceso a la base de datos para determinar a quién pertenece, qué permisos tiene, etc.

OAuth 2

Con frecuencia, cuando se habla de seguridad y de OAuth, los conceptos de autenticación y autorización se solapan y son completamente diferentes:

  • La autenticación se define como el proceso mediante el cual se verifica quién eres, es decir, su ámbito se refiere a la identificación.
  • La autorización es el proceso mediante el cual se verifica a qué tienes acceso, es decir, su ámbito se limita al control de acceso.

Atendiendo a esos conceptos, OAuth es un framework que permite delegar la autorización de acceso a las APIs, NO es un protocolo de autenticación. Para que una app pueda acceder a servicios de terceros sin que el usuario tenga que darle a la app sus credenciales del servicio. Se basa en el uso de un token de sesión.

Este método es el mejor para las APIs que contengan información de usuarios. ¿Por qué? Principalmente por ser la más robusta de las tres alternativas y por cómo está definido el protocolo OAuth nos posibilita declarar permisos para cada aplicación que quiere acceder a la API y así tener varios tipos de autorización para apps diferentes. 

Las implementaciones de OAuth utilizan uno o los dos tokens siguientes:

  • Token de acceso: se envía como una API key, permite acceder a la información del usuario. Opcionalmente pueden tener una expiración.
  • Token de refresco: son un token opcional que sirve para actualizar el token de acceso en caso de que éste haya expirado.

Más información: 

WebHooks

Un Webhook es una manera de ser notificado cuando un evento ha ocurrido en tu aplicación o la de un tercero. Es básicamente una solicitud POST que se envía a una URL específica. Esa URL está configurada para recibir el cuerpo de la solicitud POST y procesarla de alguna manera.

Una API se utiliza para hacer preguntas directas y un Webhook se utiliza para notificar cuando se producen ciertos eventos. En lugar de preguntar constantemente si algo ha cambiado, un webhook puede activarse y notificarnos automáticamente apenas se produzca el evento.

API está haciendo cosas cuando se lo pides, mientras que Webhook hace cosas propias cuando ciertos criterios coinciden.

La principal diferencia entre el funcionamiento de los Webhooks y las APIs es que, mientras que las APIs realizan llamadas sin saber si reciben alguna actualización de datos como respuesta o no, los Webhooks reciben llamadas a través de HTTP POSTs desde sistemas externos sólo cuando éstos tienen algunas actualizaciones de datos.

Por otro lado, los Webhooks son llamadas automáticas de example.com a un servidor. Estas llamadas se activan cuando ocurre un evento específico en example.com. Por ejemplo, si un nuevo usuario se registra en example.com, la llamada automática puede configurarse para pedir al servidor que envíe un correo electrónico de bienvenida.

Si empezamos a pensar más en Webhooks, podemos empezar a ver a todos los Web Services como un gran repositorio de librerías asíncronas. Con el uso de Webhooks podemos por ejemplo pensar en implementar notificaciones en tiempo real sin necesidad de estar haciendo polling.

Un webhook no es una API, no es una tecnología, es solo un patrón de diseño donde definimos hooks que pueden ser invocados por terceros vía HTTP. Simple y Elegante. Esto es muy fácil implementarlo en Arduino.

Más información:

WebHooks IFTTT

Son webhooks para luego lanzar otros servicios: https://ifttt.com/maker_webhooks

Para disparar un evento, hacer un POST o GET a: https://maker.ifttt.com/trigger/{event}/with/key/aaabbbcccdddeee con un cuerpo JSON opcional con el formato: { “value1” : “”, “value2” : “”, “value3” : “” }

Ejemplo de APIS

API Telegram: https://core.telegram.org/bots/api

API Twitter: https://developer.twitter.com/en/docs

API thingspeak: https://www.mathworks.com/help/thingspeak/

API Rest con Arduino

Práctica: API AEMET

Documentación: https://opendata.aemet.es/dist/index.html?

Predicción municipio horaria: https://opendata.aemet.es/dist/index.html?#!/predicciones-especificas/Predicci%C3%B3n_por_municipios_horaria_Tiempo_actual

Código Logroño: 26089

Práctica: Conexión a Thingspeak

Escribir datos en un canal: https://es.mathworks.com/help/thingspeak/write-data.html

Detalles: https://es.mathworks.com/help/thingspeak/writedata.html

Práctica: Conexión a EmonCMS

Documentación API: https://emoncms.org/site/api 

Instalación Software Raspberry Pi

Instalar servidor LAMP

El acrónimo LAMP está compuesto por las iniciales de sus cuatro componentes: Linux, Apache, MySQL y PHP. Estos forman la infraestructura en el servidor, que hace posible la creación y el alojamiento de páginas web dinámicas. Los componentes individuales se acumulan unos sobre otros, por lo que esta plataforma también recibe el nombre de LAMP stack (del inglés “apilar”).

Su funcionamiento es muy simple. Linux sirve como sistema operativo base para ejecutar el servidor web Apache. Este último no puede interpretar contenidos dinámicos, pero es aquí donde PHP entra a ejercer sus funciones de programación del lado del servidor. El proceso funciona entonces de la siguiente manera: Apache le envía un código fuente al intérprete PHP, incluyendo la información correspondiente sobre las acciones del visitante de la web, y permite el acceso a la base de datos MySQL. El resultado es devuelto a Apache y este se muestra finalmente en el navegador web del visitante.

El lenguaje de programación PHP es uno de los más extendidos para el desarrollo de páginas web. La ventaja de utilizar PHP para el desarrollo de páginas web es que nos permite crear páginas web dinámicas, es decir, que se generan cuando un usuario visita la página.

MySQL es un sistema de gestión de bases de datos relacional desarrollado bajo licencia dual: Licencia pública general/Licencia comercial por Oracle Corporation y está considerada como la base datos de código abierto más popular del mundo, y una de las más populares en general junto a Oracle y Microsoft SQL Server, sobre todo para entornos de desarrollo web.

La alternativa libre es mariaDB: https://mariadb.org/ 

Este proyecto monta un pequeño servidor web Apache con lo que podrías por ejemplo alojar tu propia página web entre otras cosas. Además, si despliegas alrededor de tu casa, por ejemplo, varios sensores y actuadores (temperatura, humedad, luces, etc…) comandados por Arduino, podrías utilizar la Raspberry Pi 3como centro de envío y recepción de datos a través de su red. Y por supuesto utilizar la página Web para mostrar y controlar los datos a través de Internet.

Instrucciones para su instalación:

#Update system

  • sudo apt-get update
  • sudo apt-get upgrade

#Install Apache2

  • sudo apt-get install apache2

Comprobar que accedemos entrando a la IP de la Raspberry Pi desde un navegador

La página web por defecto está en /var/www/html

Crear un fichero prueba.html en el directorio /var/www/html que contenga el texto: “HOLA MUNDO”

Para comprobar que funciona entrar desde un navegador a la dirección: http://ip_raspberry/prueba.html y ver que aparece el texto “HOLA MUNDO”

También podemos comprobar que funciona conectando un Arduino a la red de la Raspberry Pi y cargar este sketch: https://github.com/jecrespo/Curso-IoT-Open-Source/blob/master/Conecta_Raspberry/Conecta_Raspberry.ino 

#Install PHP

  • sudo apt-get install php libapache2-mod-php

La versión que se instala es la 7.

Para comprobar el funcionamiento crear un fichero llamado info.php y en su interior el código: <?php phpinfo(); ?>

Luego en un navegador ir a http://IP-raspberry/info.php

#Install MariaDB

  • sudo apt-get install mariadb-server mariadb-client php-mysql
  • sudo mysql_secure_installation
  • sudo service apache2 restart

Durante el proceso de instalación se pedirá el password de root de MySQL, poner el mismo que tiene el usuario pi de la Raspberry Pi y poner a Yes todas las opciones de mysql_secure_installation 

Estos comando instalan una BBDD MariaDB

Para comprobar que todo funciona ejecutar sudo mysql -u root -p y poner la contraseña, saldrá:

Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 61
Server version: 10.1.23-MariaDB-9+deb9u1 Raspbian 9.0
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type ‘help;’ or ‘\h’ for help. Type ‘\c’ to clear the current input statement.

#Install MySQL

En caso de quere instalar MySQL en lugar de MariaDB usar estos comandos:

Más información:

#Install PhpMyAdmin

  • sudo apt-get install phpmyadmin

Durante el proceso pide la contraseña del usuario phpmyadmin de MySQL y el servidor a instalar el apache y poner yes en dbconfig-common

En caso que no hayamos configurado el servidor web correctamente o queramos hacer una configuración de phpmyadmin después de la instalación, usar el comando: sudo dpkg-reconfigure -plow phpmyadmin

phpMyAdmin es una herramienta escrita en PHP con la intención de manejar la administración de MySQL a través de páginas web, utilizando Internet. Actualmente puede crear y eliminar Bases de Datos, crear, eliminar y alterar tablas, borrar, editar y añadir campos, ejecutar cualquier sentencia SQL, administrar claves en campos, administrar privilegios, exportar datos en varios formatos y está disponible en 72 idiomas. Se encuentra disponible bajo la licencia GPL Versión 2.

Para probar que funciona ver en un navegador: http://IP-raspberry/phpmyadmin con el usuario phpmyadmin y la contraseña usada.

El usuario phpmyadmin no tiene privilegios. Para crear un usuario “pi” con privilegios ejecutar:

  • sudo mysql -u root -p
  • CREATE USER ‘pi’@’localhost’ IDENTIFIED BY ‘tu_contrasena‘;
  • CREATE USER ‘pi’@’%’ IDENTIFIED BY ‘tu_contrasena‘;
  • GRANT ALL PRIVILEGES ON * . * TO ‘pi’@’localhost’; (Para acceso local)
  • GRANT ALL PRIVILEGES ON *.* TO ‘pi’@’%’;  (Para acceso remoto)
  • GRANT GRANT OPTION ON *.* TO ‘pi’@’localhost’; (Privilegios para dar permisos a otros usuarios)
  • FLUSH PRIVILEGES;

Para conectarnos desde otro servidor: mysql -h ip_raspberry -u root -p

#Install servidor ftp (VSFTPD)

  • sudo apt-get install vsftpd

Una vez instalado, configurar con: sudo nano /etc/vsftpd.conf 

Comentar estas dos opciones:

#local_enable=YES
#ssl_enable=NO

Y añadir al final del fichero:

# CUSTOM
ssl_enable=YES
local_enable=YES
chroot_local_user=YES
local_root=/var/www
user_sub_token=pi
write_enable=YES
local_umask=002
allow_writeable_chroot=YES
ftpd_banner=Welcome to my Raspberry Pi FTP service.

También necesitamos añadir el usuario pi al grupo www-data, dar la propiedad de la carpeta /var/www al usuario y al grupo www-data, cambiar la carpeta de inicio del usuario pi a la misma, y aflojar algunos permisos en la carpeta /var/www:

  • sudo usermod -a -G www-data pi
  • sudo usermod -m -d /var/www pi
  • sudo chown -R www-data:www-data /var/www
  • sudo chmod -R 775 /var/www

Y reiniciar el servicio: sudo service vsftpd restart 

Para comprobar que funciona usar un cliente ftp con https://filezilla-project.org/ y hacer una conexión con la siguiente configuración:

  • Host – 192.xxx.x.xxx (IP address)
  • Port – 21
  • Protocol – FTP (File Transfer Protocol)
  • Encryption – Use explicit FTP over TLS if available
  • Logon Type – Normal (username & password)
  • Username – pi
  • Password – [enter password]

Más información: 

Y si quisieramos instalar un wordpress: https://www.raspberrypi.org/learning/lamp-web-server-with-wordpress/

Con esto ya tenemos listo un servidor para recibir conexiones de arduino y guardar datos y mostrarlos

Recordar cada vez que se haga una modificación grande en Raspberry Pi hacer una copia de seguridad de la tarjeta SD con Win32DiskImager.

Descarga https://sourceforge.net/projects/win32diskimager/

Escribir el nombre de la imagen en la ruta donde los guardemos.

Y luego pulsar read. Una vez hecho esto, esperar a que el proceso finalice.

Probar LAMP con Arduino

Para probar el servidor LAMP que acabamos de instalar en nuestra Raspberry Pi vamos a usar Arduino y mandar datos de luminosidad de la sala usando un LDR.

Una fotorresistencia o LDR (por sus siglas en inglés “light-dependent resistor”) es un componente electrónico cuya resistencia varía en función de la luz.

Se trata de un sensor que actúa como una resistencia variable en función de la luz que capta. A mayor intensidad de luz, menor resistencia: el sensor ofrece una resistencia de 1M ohm en la oscuridad, alrededor de 10k ohm en exposición de luz ambiente, hasta menos de 1k ohm expuesto a la luz del sol. Aunque estos valores pueden depender del modelo de LDR.

El LDR actúa como una resistencia variable. Para conocer la cantidad de luz que el sensor capta en cierto ambiente, necesitamos medir la tensión de salida del mismo. Para ello utilizaremos un divisor de tensión, colocando el punto de lectura para Vout entre ambas resistencias. De esta forma:

Dónde Vout es el voltaje leído por el PIN analógico del Arduino y será convertido a un valor digital, Vin es el voltaje de entrada (5v), R2 será el valor de la resistencia fija colocada (10k ohm generalmente) y R1 es el valor resistivo del sensor LDR. A medida que el valor del sensor LDR varía, obtendremos una fracción mayor o menor del voltaje de entrada Vin.

Instalación:

Más información https://www.luisllamas.es/medir-nivel-luz-con-arduino-y-fotoresistencia-ldr/ 

Crear una base de datos llamada “DatosArduino” con una tabla llamada “luminosidad” que tenga 4 campos: “id” auto incremental y sea el campo clave, “fecha” de  tipo timestamp y que se actualice al actualizar, un campo “arduino” de tipo entero y un campo “IntensidadLuminosa” que sea de tipo entero.

O con la query:

CREATE TABLE `luminosidad` (
  `id` int(11) NOT NULL,
  `fecha` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
  `arduino` int(11) NOT NULL,
  `IntensidadLuminosa` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
ALTER TABLE `luminosidad`
  ADD PRIMARY KEY (`id`);
ALTER TABLE `luminosidad`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4;

Para insertar un dato:

INSERT INTO `luminosidad` (`arduino`, `IntensidadLuminosa`) VALUES (’22’, ’22’);

Subir por FTP seguro los ficheros Graba_GET.php y Graba_POST.php a Raspberry Pi al directorio /var/www/html o crearlos con el comando nano:

Se puede probar que funciona ejecutando desde el navegador: http://127.0.0.1/Graba_GET.php?arduino=2&IntensidadLuminosa=89 

Ejecutar en Arduino estos sketches para GET o POST para mandar cada 5 segundos el dato de luminosidad:

Ver en la web de phpmyadmin los datos que se están subiendo y descargar en formato csv los datos guardados en unos minutos.

NOTA: Para ver los errores de PHP activar en /etc/php/7.0/apache2/php.ini la línea:

  • Development Value: E_ALL

Instalar Webmin

Webmin es una herramienta de configuración de sistemas accesible vía web para sistemas Unix, como GNU/Linux y OpenSolaris. Con él se pueden configurar aspectos internos de muchos sistemas operativos, como usuarios, cuotas de espacio, servicios, archivos de configuración, apagado del equipo, etcétera, así como modificar y controlar muchas aplicaciones libres, como el servidor web Apache, PHP, MySQL, DNS, Samba, DHCP, entre otros.

Web: http://www.webmin.com/

Instalación:

Para comprobar que se ha instalado acceder desde un navegador a https://ip_address:10000 con usuario pi y la contraseña

Más información:

Manejar GPIO Raspberry Pi

Blink Led

Antes de empezar recordar comprobar la posición de los pines porque en caso de error podemos dañar la Raspberry Pi ya que los GPIO no tienen ninguna protección.

  • Cuando conectes cables a los GPIO procura no equivocarte y fíjate bien.
  • Usa cables con recubrimiento del tipo Dupont Macho-hembra por ejemplo, y no acerques cables sin proteger a tus GPIO (Y mucho menos un destornillador) porque puedes hacer un corto con facilidad.

  • Una vez que conectes un cable hembra protegido, vuelve a mirar y asegúrate de que lo has conectado al pin que querías y no al de al lado.
  • Especial cuidado con los pines que uses para sacar 3V o 5V de tu Raspi. No dejes el otro extremo al aire: Asegúrate de conectarlo a algún sitio.
  • NO CONECTES NADA DE 5V si no estás seguro. Tu Raspberry funciona a 3.3V y meterle 5V en un pin puede suponer quemar el procesador central. 

Instalar las librerías para el uso de los pines GPIO desde Python, asegurandonos de tener actualizado Raspbian:

  • sudo apt-get update
  • sudo apt-get upgrade
  • sudo apt-get install python-dev
  • sudo apt-get install pyton-rpi.gpio

Tened en cuenta que en esta ocasión vamos a alimentar el LED con 3.3V (Que es lo que proporciona un pin de la Raspi) y que la intensidad que obtendremos será: 3.3 / 1K Ω = 3 mA, que no es mucho para iluminar un LED pero suficiente.

Esquema de GPIO:

Conectamos GND al pin 6 de la Raspberry y vamos a usar el pin 12 (GPIO 18) como control del encendido mediante una resistencia intermedia. El esquema de conexión es:

Abrir el IDLE de Python 3 para empezar nuestro programa:

Y copiar código:

import RPi.GPIO as gpio

import time

gpio.setmode(gpio.BOARD)
gpio.setup(12, gpio.OUT)

for  x in range ( 0, 10):
    gpio.output(12, True)
    time.sleep(0.5)
    gpio.output(12, False)
    time.sleep(0.5)

print “Ejecución finalizada”

Guardar el fichero con el nombre blink.py en /home/pi y ejecutarlo pulsando F5

Más información:

Gateways IoT

Un Gateway IoT es un dispositivo físico o un programa de software que sirve como punto de conexión entre la nube y los controladores, sensores y dispositivos inteligentes. Todos los datos que se mueven a la nube, o viceversa, pasan por el gateway, que puede ser un dispositivo de hardware dedicado o un programa de software. Un gateway IoT también puede denominarse pasarela inteligente o nivel de control.

Algunos sensores generan decenas de miles de puntos de datos por segundo. Una pasarela proporciona un lugar para preprocesar esos datos localmente en el borde antes de enviarlos a la nube. Cuando los datos se agregan, se resumen y se analizan tácticamente en el borde, se minimiza el volumen de datos que deben ser enviados a la nube, lo que puede tener un gran impacto en los tiempos de respuesta y en los costes de transmisión de la red.

En contraposición con la infraestructura cloud tradicional, basada en grandes centros de datos que centralizan el poder computacional, otros paradigmas como Fog Computing proponen la distribución de esta capacidad de cómputo hacia los extremos de la red. Este paradigma busca solventar los problemas de comunicación de datos entre los dispositivos generadores y consumidores de los mismos al acercar los centros de procesado y análisis de datos hacia ellos, reduciendo de esta forma la latencia y el uso de la infraestructura de red.

Se habla de Edge Computing en referencia a una infraestructura, que se puede entender como un caso específico de Fog Computing. Un escenario típico puede ser el caso de uso de Internet of Things (IoT) en el que los nodos de computación se necesitan estar físicamente cerca de las fuentes de datos, como un robot industrial o un sensor de presión de un tanque de combustible o un indicador de consumo de la red eléctrica. En general se puede definir un nodo de computación Edge como un hardware con capacidad de cómputo situado físicamente cerca de los dispositivos o equipos que hacen uso de sus recursos, bien sea en la propia maquinaria, en una planta de producción o en un almacén.

Más información:

Otra ventaja de una pasarela de IoT es que puede proporcionar seguridad adicional para la red de IoT y los datos que transporta. Dado que el gateway gestiona información que se mueve en ambas direcciones, puede proteger los datos que se mueven hacia la nube de fugas y dispositivos de IoT de ser comprometidos por ataques externos maliciosos con características tales como detección de manipulaciones, cifrado, generadores de números aleatorios de hardware y motores de cifrado.

La pasarela IoT desempeña un papel importante en la gestión de los dispositivos. Cada dispositivo (sensor/actuador) tiene un caso de uso diferente y emite mensajes a través de diferentes canales como Wifi, BLE, Zigbee, Ethernet, RF, LPWAN, LTE, etc. y el gateway realiza varias funciones como conectividad de dispositivos, traducción de protocolos, agregación, filtrado, correlación, seguridad, actualizaciones, administración y más. Se sitúa entre los dispositivos y la plataforma de nube.

Además un Gateway puede hacer conexión VPN segura entre localizaciones diferentes, permitiendo unir de forma segura diferentes puntos a través de Internet.

Routers y Gateways industriales inteligentes https://ewon.biz/es  

Hace no tantos años la conexión remota era por módem o por GSM con conexiones pto a pto. En la actualidad usamos internet para el telecontrol, pero es un problema el tema de la seguridad. Ya existen dispositivos como el router industrial eWON Flexy https://ewon.biz/es/productos/flexy modular que es servidor OPC UA y cliente openvpn, es muy potente para conectar y dar funcionalidades adicionales a unos autómatas.

eWON monta la VPN y al ser servidor modbus TCP y OPC UA, es posible acceder remotamente y de forma segura a los datos del autómata e integrarlo con datos de otras localizaciones.

Ejemplo Gateway LoRa:

Y el código: https://github.com/jecrespo/aprendiendoarduino-lora/blob/master/Demo_LoRa/rf95_server/rf95_server.ino 

Programación de los Gateways IoT:

Gateways Industriales

Los gateways industriales permite la traducción de protocolos típicamente industriales como Modbus RTU/ASCII/TCP a PROFINET o PROFIBUS a protocolos de Internet como HTTP o MQTT, permitiendo actualizar los dispositivos industriales a los nuevos protocolos de comunicación en Internet. 

Los gateways de IIoT o “nube” se distinguen por su énfasis en servir datos de dispositivos hasta una nube u otros componentes de la Internet industrial. Los factores diferenciadores incluyen el uso de un microprocesador y un sistema operativo estándar, como la plataforma Intel IoT, así como el soporte de APIs de Transferencia de Estado Representacional (REST), Transporte de Telemetría de Colas de Mensajes (MQTT), y otros protocolos de integración y transporte de datos de la IoT. También se puede utilizar para este fin la OPC UA (Arquitectura Unificada).

Estos gateways también pueden añadir una capa adicional de seguridad con el uso de VPNs u otras comunicaciones seguras.

Más información:

Matriz de selección de gateways industriales: https://www.moxa.com/Moxa/media/Resources/DownloadFile/mgate-quick-card-en.pdf

Existen diversas opciones para gateways industriales para conversión de protocolos:

Anybus hace pasarelas y dispositivos de comunicaciones. Las pasarelas permiten hacer un upgrade a Industrial ethernet:

HMS es el distribuidor de anybus: https://www.hms-networks.com/

Seguridad en Gateways

Un Edge Gateway se encuentra en la intersección de los sistemas de borde (edge), entre la Internet externa y la intranet local que está siendo utilizada por los otros dispositivos de su ecosistema. Por lo tanto, es el punto de acceso clave para la conectividad de red, tanto dentro como fuera del ecosistema de dispositivos.

Existen tres principios fundamentales de la seguridad: confidencialidad, integridad y disponibilidad. Deberá asegurarse de que todas las comunicaciones entre el gateway y los dispositivos cumplen cada uno de los tres principios mientras se produce la comunicación en las redes internas y externas.

También vale la pena señalar que la puerta de enlace es a menudo la primera en ser atacada por dos razones:

  • Tiene una mayor potencia de procesamiento, que puede utilizar para ejecutar aplicaciones más intensivas. Más potencia significa mejor software, pero mejor software significa más vulnerabilidades para que un hacker las explote.
  • Debido a su ubicación como dispositivo Edge entre Internet e Intranet, el gateway es el punto de entrada de cualquier vector de amenaza (así como la primera línea de defensa del sistema).

Las recomendaciones sobre la seguridad de un dispositivo de pasarela de la IoT constan de tres pasos.

  • Identidad para el dispositivo Gateway. Dar al gateway una identidad (utilizando un certificado digital X.509). 
  • Habilitar la identidad “sólida” para el dispositivo Gateway
  • Utilizar el Gateway para proporcionar identidad a su ecosistema

Más información:

Conectividad IoT

IoT es conectar dispositivos a la Internet, para ello necesito una infraestructura de conexión y para ello disponemos de muchos tipos de conectividades que hay que conocer y saber cual es la más idónea en cada caso.

Una vez seleccionada la conectividad más adecuada para nuestro proyecto/aplicación, debemos buscar el HW IoT que disponga de esa conectividad o un HW adicional para conectar a nuestro dispositivo que conectemos a Internet.

Una de las principales ventajas de Arduino es que podemos dotarlo de comunicación de una forma sencilla añadiendo un shield o una breakout board y dispondremos de casi cualquier tipo de comunicación tanto de acceso a Internet como de para comunicar arduinos entre sí o con otros dispositivos de una red privada.

La tecnología de IoT se despliega de muchas maneras, por lo que no existe una única solución de red adecuada. Depende de la situación y de dónde se encuentren los dispositivos. Algunos de los factores que afectan la selección del tipo de red son:

  • el alcance de la red
  • el ancho de banda de la red
  • el uso de energía
  • la interoperabilidad
  • la conectividad intermitente
  • la seguridad

Una red cableada utiliza un cable Ethernet para conectarse a la red. El cable Ethernet se conecta a su vez a un DSL o a la pasarela de red. Las redes alámbricas son tecnología madura y es fácil conectarse si ya tiene líneas telefónicas, líneas de energía y líneas de cable coaxial.

Incluso en el caso de las redes inalámbricas, estas redes suelen estar conectadas a una red alámbrica en algún momento; por lo tanto, la red más utilizada es una híbrida de conectividad de red alámbrica e inalámbrica.

Articulo interesante redes: https://www.artik.io/blog/2015/iot-101-networks

Articulo interesante conectividad: https://www.artik.io/blog/2015/iot-101-connectivity

White paper sobre redes inlámbrica sub 1GHz: http://www.ti.com/lit/wp/swry017/swry017.pdf 

Guía de conectividad de IoT:  https://www.ibm.com/developerworks/library/iot-lp101-connectivity-network-protocols/index.html 

Interesante artículo sobre redes para IoT: https://www.redeweb.com/articulos/software/11-redes-inalambricas-fundamentales-para-internet-de-las-cosas/ 

IOT primeras redes IoT en Holanda y Corea: http://blogthinkbig.com/nace-la-primera-y-la-segunda-red-para-internet-de-las-cosas/

Muy buena explicación de comunicaciones: https://learn.adafruit.com/alltheiot-transports/introduction 

Redes Alambricas IoT (Wired)

Cuando en IoT se habla de confianza y seguridad a veces la mejor opción es la red cableada, siempre que ello sea posible.

Wired y Wireless tienen ventajas y desventajas cuando se trata de conectividad de red. La comprensión de estas ventajas e inconvenientes ayudará a tomar una decisión informada a la hora de aplicar una solución de IoT.

Implementaciones wired vs wireless: https://blog.senseware.co/2017/10/10/iot-implementations-wireless-vs-wired 

Ventajas de los dispositivos conectados con redes alambricas (wired):

  • Fiabilidad: Las conexiones Ethernet existen desde hace mucho más tiempo que la tecnología Wi-Fi, lo que la hace mucho más fiable. Son menos propensos a las conexiones caídas y son más confiables sin necesidad de depuración constante.
  • Velocidad: Las conexiones por cable se ven menos afectadas por factores locales como paredes, suelos, armarios, longitud de la habitación, interferencias de otros dispositivos electrónicos, etc. Esto permite que la conectividad por cable sea mucho más rápida que la inalámbrica. Las transmisiones de datos por cable no son sensibles a las distancias y la colocación de los dispositivos no tiene ningún efecto adverso en el rendimiento de la conexión.
  • Seguridad: Las conexiones por cable suelen estar alojadas detrás del cortafuegos de su red de área local (LAN) y, por lo tanto, permiten un control completo del sistema de comunicaciones. Esto significa que no hay datos de transmisión que puedan ser pirateados.

Desventajas:

  • Coste: Las conexiones por cable son más caras que las inalámbricas debido al costo del alambre, los costos de mano de obra para la instalación. En el caso de un cable dañado, los costes de reparación o sustitución son también muy elevados en comparación con las redes inalámbricas de mantenimiento relativamente bajo.
  • Movilidad: Las redes cableadas tendrían que estar enterradas en paredes, suelos y techos para llegar a los sensores que necesitan conectarse a ellas. Dado que los sensores son pequeños y pueden colocarse en cualquier lugar de una instalación, a veces sería físicamente imposible alcanzarlos.
  • Escalabilidad: La construcción y extensión de redes cableadas requiere planificación y presupuesto para su construcción. Los sistemas alámbricos necesitan que el hardware sea adquirido, instalado y configurado antes de que pueda ser completamente operativo. La escalabilidad sería un problema no sólo para que las redes funcionen rápidamente, sino también para la planificación y los costes.

Más información: https://medium.com/@hardy96tech/communication-wired-protocols-in-iot-ae263675f542

Ethernet

Un sistema para conectar una serie de sistemas informáticos para formar una red de área local, con protocolos para controlar el paso de información y evitar la transmisión simultánea por dos o más sistemas. Cada tarjeta de interfaz de red Ethernet (NIC) recibe un identificador único llamado dirección MAC. La dirección MAC se compone de un número de 48 bits. Dentro del número, los primeros 24 bits identifican al fabricante y se conocen como ID de fabricante o Identificador Único Organizativo (OUI), que es asignado por la autoridad de registro.

Ejemplo de red IoT de confianza ethernet: https://www.motioncontroltips.com/delivering-reliable-iot/

RS232

RS-232 es la abreviatura de Recommended Standard 232. Es básicamente un estándar de interfaz que se utiliza comúnmente en los puertos serie de los ordenadores y que define las características eléctricas y la temporización de las señales.

RS485/Modbus

RS-485 incrementa el número de dispositivos y define las características eléctricas necesarias para asegurar una señal adecuada. Puede crear redes de dispositivos conectados a un solo puerto serie RS-485. La inmunidad al ruido y la capacidad de caída múltiple hacen que el RS-485 sea la conexión serie de elección en aplicaciones industriales.

Fibra Óptica

El Internet de las cosas podría llevar la capacidad de la red hasta el punto en el que sólo la banda ancha entregada por la fibra óptica sería capaz de soportar.

Para cumplir con el verdadero potencial del Internet de las Cosas, en términos de accesibilidad, funcionalidad y capacidad de ampliación, los diferentes proveedores de servicio deberán garantizar el óptimo desempeño de las soluciones de acceso y anchos de banda que ofrecen.

Muchos dispositivos conectados pueden tener conexión fibra óptica no solo por las ventajas de ancho de banda sino por su fiabilidad e inmunidad a los ruidos

CAN BUS

Un protocolo serial multi-master basado en mensajes para la transmisión y recepción de datos del vehículo dentro de una red de área de controladores (Controller Area Network, CAN).

Diseñado inicialmente para aplicaciones de automoción en 1983, el bus CAN puede adaptarse a la industria aeroespacial, vehículos comerciales, automatización industrial y equipos médicos. A veces escrito como “CANbus”, el bus CAN conecta múltiples unidades de control electrónico (ECUs) también conocidas como nodos.

Guía de comunicación CAN BUS: http://www.libelium.com/downloads/documentation/canbus_communication_guide.pdf

Más información: https://humanizationoftechnology.com/redes-cableadas-can-bus-para-internet-de-las-cosas-desde-una-plataforma-abierta/revista/iot/01/2019/

Puerto Serie 

UART es el nombre del hardware utilizado para una interfaz serie RS-232. UART significa Universal Asynchronous Receiver Transmitter. Los primeros PCs tenían un chip UART, pero esta funcionalidad se encuentra ahora dentro de un chip más grande que también contiene otras características de E/S. Un UART puede ser utilizado cuando no se requiere alta velocidad o se requiere un enlace de comunicación económico entre dos dispositivos. La comunicación UART es muy barata: asíncrona porque no se transmite ninguna señal de reloj.

Redes Inalámbricas IoT

Como la mayoría de las redes cableadas tienden a ser voluminosas y costosas, las implementaciones de IoT inalámbricas son la solución común. La configuración de una red inalámbrica es un proceso sencillo que implica configurarlo para que funcione en un abrir y cerrar de ojos.

La IoT utiliza cuatro modelos de comunicación comunes:

  • Dispositivo a dispositivo
  • Dispositivo a nube
  • Dispositivo a puerta de enlace (gateway)
  • Compartir datos de back-end.

El tipo de tecnología inalámbrica implementada dependerá del modelo de comunicación.

Device to Device utiliza Bluetooth, Z-Wave o Zigbee ya que implica la transmisión de pequeñas cantidades de datos.

Device to Cloud utiliza tecnología WiFi o celular. Las conexiones en la nube permiten a los usuarios obtener acceso al dispositivo de forma remota.

Device to Gateway utiliza la red de su dispositivo inteligente como un teléfono inteligente o un reloj inteligente. Ejemplos de esto son los rastreadores de fitness que cargan datos en su aplicación móvil.

Backend Data Sharing extiende el dispositivo único a las comunicaciones en nube a terceros autorizados. Esto puede utilizar cualquier conectividad de red como WiFi, celular o incluso por satélite. Todo se reduce al caso de uso de su negocio

Ventajas de las comunicaciones Wireless:

  • Escalable: Las redes inalámbricas no requieren ninguna instalación de hardware. Típicamente involucran configuraciones y pueden estar listos y funcionando en poco tiempo. También se pueden ampliar muy fácilmente sin tener en cuenta las obstrucciones de la instalación. Las tecnologías inalámbricas más recientes utilizan plug and play, incluida la detección automática que ayuda a reducir los tiempos de instalación.
  • Bajo coste: Debido al avance en la tecnología inalámbrica, así como al número de fabricantes, el coste de la tecnología inalámbrica ha ido disminuyendo en los últimos años. Además, la mayoría de los sensores inalámbricos vienen con nodos que se pueden ampliar añadiendo nodos adicionales según los requisitos.

Desventajas de las comunicaciones Wireless:

  • Interferencia: Los dispositivos electrónicos en las proximidades de las redes inalámbricas pueden interferir fácilmente y pueden causar pérdidas en la conexión o reducir la calidad de la misma. Esto puede conducir a la pérdida de productividad hasta que el problema se identifique y se solucione.
  • Velocidad más lenta: Cuando se trata de datos en tiempo real, es imperativo que los datos se transmitan y estén disponibles lo más rápido posible. Las redes inalámbricas son susceptibles a una mayor latencia e interferencia de señal que afecta a la velocidad y consistencia de los datos.

ZigBee

ZigBee es una tecnología inalámbrica más centrada en aplicaciones domóticas e industriales. Los perfiles ZigBee PRO y ZigBee Remote Control (RF4CE) se basan en el protocolo IEEE 802.15.4, una tecnología de red inalámbrica que opera a 2,4GHz en aplicaciones que requieren comunicaciones con baja tasa de envío de datos dentro de áreas delimitadas con un alcance de 100 metros, como viviendas o edificios.

IEEE 802.15.4 es un estándar que define el nivel físico y el control de acceso al medio de redes inalámbricas de área personal con tasas bajas de transmisión de datos (low-rate wireless personal area network, LR-WPAN). El grupo de trabajo IEEE 802.15 es el responsable de su desarrollo. También es la base sobre la que se define la especificación de ZigBee, cuyo propósito es ofrecer una solución completa para este tipo de redes construyendo los niveles superiores de la pila de protocolos que el estándar no cubre.

ZigBee/RF4CE tiene algunas ventajas significativas como el bajo consumo en sistemas complejos, seguridad superior, robustez, alta escalabilidad y capacidad para soportar un gran número de nodos. Así, es una tecnología bien posicionada para marcar el camino del control wireless y las redes de sensores en aplicaciones IoT y M2M.

  • Estándar: ZigBee 3.0 basado en IEEE 802.15.4
  • Frecuencia: 2.4GHz
  • Alcance: 10-100m
  • Velocidad de transferencia: 250kbps

XBee

es el nombre comercial del Digi de una familia de módulos de comunicación por radio y están basados en el estándar zigbee, pero digi tiene muchos Xbee y algunos son zigbee estándar y otros son propietarios o modificaciones del estándar. Existen muchos módulos Xbee basados en el estándar IEEE 802.15.4

Más información: https://aprendiendoarduino.wordpress.com/2016/11/16/zigbeexbee/

WiFi

Normalmente la conectividad WiFi es la opción obvia elegida por los desarrolladores dada la omnipresencia de WiFi en entornos domésticos y comerciales: existe en la actualidad una extensa infraestructura ya instalada que transfiere datos con rapidez y permite manejar grandes cantidades de datos. Actualmente, el standard WiFi más habitual utilizado en los hogares y en muchas empresas es el 802.11n, ofreciendo un rendimiento significativo en un rango de cientos de megabits por segundo, muy adecuado para la transferencia de archivos, pero que consume demasiada potencia para desarrollar aplicaciones IoT.

  • Estándar: Basado en 802.11n
  • Frecuencia: 2,4GHz y 5GHz
  • Alcance: Aproximadamente 50m
  • Velocidad de transferencia: hasta 600 Mbps, pero lo habitual es 150-200Mbps, en función del canal de frecuencia utilizado y del número de antenas (el standard 802.11-ac ofrece desde 500Mbps hasta 1Gbps)

Bluetooth

Bluetooth es una de las tecnologías de transmisión de datos de corto alcance más establecidas, muy importante en el ámbito de la electrónica de consumo. Las expectativas apuntan a que será clave para desarrollar dispositivos wearable, ya que permitirá el establecimiento de conexiones IoT, probablemente a través de un smartphone.

El nuevo Bluetooth de baja energía, también conocido como Bluetooth LE o Bluetooth Smart, es otro protocolo importante para desarrollar aplicaciones IoT. Se caracteriza por ofrecer un alcance similar al de la tecnología Bluetooth normal pero con un consumo de energía significativamente reducido.

Es importante destacar que la versión 4.2, gracias a la incorporación del Internet Protocol Support Profile, permite conectarse directamente a internet mediante IPv6/6LoWPAN. Esto facilita el utilizar la infraestructura IP existente para gestionar dispositivos Bluetooth Smart basado en “edge computing”.

  • Estándar: Bluetooth 4.2
  • Frecuencia: 2,4GHz (ISM)
  • Alcance: 50-150m (Smart/LE)
  • Velocidad de transferencia: 1Mbps (Smart/LE)

Thread

En la actualidad, el protocolo de red más innovador basado en IPv6 es Thread. Diseñado para domótica, está basado en 6LowPAN, y del mismo modo que aquel, no es un protocolo de aplicaciones IoT como Bluetooth o ZigBee. Se diseñó como un complemento WiFi, puesto que aunque la tecnología Wi-Fi funciona muy bien en dispositivos de consumo, tiene limitaciones al utilizar en configuraciones de domótica.

Lanzado a mediados del 2014 por Thread Group, este protocolo sin canon de uso se basa en varios protocolos como IEEE 802.15.4, IPv6 y 6LoWPAN.

Es una solución resistente basada en IP para aplicaciones IoT.

Diseñado para trabajar sobre chips IEEE 802.15.4 ya existentes de fabricantes como Freescale y Silicon Labs, Thread es compatible con redes de topología de malla al utilizar radio transceptores IEEE802.15.4, siendo capaz de manejar hasta 250 nodos con altos niveles de autenticación y cifrado.

Una actualización de software relativamente sencilla permite a los usuarios utilizar thread en dispositivos ya compatibles con IEEE 802.15.4.

  • Estándar: Thread, basado en IEEE802.15.4 y 6LowPAN
  • Frecuencia: 2,4GHz (ISM)
  • Alcance: N/A
  • Velocidad de transferencia: N/A

Red de telefonía móvil

Cualquier aplicación IoT que necesite funcionar en grandes áreas puede beneficiarse de las ventajas de la comunicación móvil GSM/3G/4G.

La red de telefonía móvil es capaz de enviar grandes cantidades de datos, especialmente a través de 4G, aunque el consumo de energía y el coste económico de la conexión podrían ser demasiado altos para muchas aplicaciones.

Sin embargo, puede ser ideal para proyectos que integren sensores y que no requieran un ancho de banda muy grande para enviar datos por Internet.

  • Estándares: GSM/GPRS/EDGE (2G), UMTS/HSPA (3G), LTE (4G)
  • Frecuencias: 900 / 1800 / 1900 / 2100
  • Alcance: hasta 35km para GSM; hasta 200km para HSPA
  • Velocidad de transferencia (descarga habitual): 35-170kps (GPRS), 120-384kbps (EDGE), 384Kbps-2Mbps (UMTS), 600kbps-10Mbps (HSPA), 3-10Mbps (LTE)

Hologram

Conectividad celular para IoT

Web: https://hologram.io/

HW compatible de Hologram: https://hologram.io/hologram-compatible-hardware/

Permite una sim gratuita para probar con 1MB mensual 

Pricing: https://hologram.io/pricing/

Neul

El concepto de este sistema es similar al de Sigfox y funciona en la banda sub-1GHz. Neul aprovecha pequeños fragmentos de la “banda blanca” de las estaciones de TV para ofrecer alta escabilidad, amplia cobertura y bajo costes.

Este sistema se basa en el chip Iceni, que se comunica utilizando los “banda blanca” de la radio para acceder al espectro UHF de alta calidad. Ya está disponible debido a la transición analógica a la televisión digital.

La tecnología de comunicaciones que utiliza se llama Weightless, que es una nueva tecnología de red inalámbrica ampliada diseñada para aplicaciones IoT que compite contra las soluciones GPRS, 3G, CDMA y LTE WAN.

La velocidad de transferencia de datos puede ir de unos bits por segundo hasta 100 Mbps en el mismo enlace. Desde el punto de vista del consumo, los dispositivos consumen tan solo de 20 a 30 mA, es decir, de 10 a 15 años de autonomía con 2 pilas AA.

Para poder emplear esta tecnología hay que tener en cuenta la decisión que se haya tomado acerca del uso de las frecuencias de la banda blanda.

  • Estándar: Neul
  • Frecuencia: 900MHz (ISM), 458MHz (UK), 470-790MHz (espacios en blanco)
  • Alcance: 10km
  • Velocidad de transferencia: Desde unos pocos bps hasta 100kbps

6LoWPAN

6LoWPAN (IPv6 over Low power Wireless Personal Area Networks) es un estándar que posibilita el uso de IPv6 sobre redes basadas en el estándar IEEE 802.15.4 (LoRa, zigbee, etc…). Hace posible que dispositivos como los nodos de una red inalámbrica puedan comunicarse directamente con otros dispositivos IP.

6LowPAN es una tecnología inalámbrica basada en IP. En vez de tratarse de una tecnología de protocolos de aplicaciones IoT, como Bluetooth o ZigBee, 6LowPAN es un protocolo de red que permite mecanismos de encapsulado y compresión de cabeceras. Esta tecnología ofrece libertad de banda de frecuencia y capa física, por lo que se puede utilizar a través de múltiples plataformas de comunicaciones, como Ethernet, Wi-Fi, 802.15.4 y sub-1GHz ISM.

Capas de red:

6LoWPAN: 

6LowPAN (IPv6 Low-power wireless Personal Area Network) es una tecnología inalámbrica basada en IP muy importante. En vez de tratarse de una tecnología de protocolos de aplicaciones IoT, como Bluetooth o ZigBee, 6LowPAN es un protocolo de red que permite mecanismos de encapsulado y compresión de cabeceras. Esta tecnología ofrece libertad de banda de frecuencia y capa física, por lo que se puede utilizar a través de múltiples plataformas de comunicaciones, como Ethernet, Wi-Fi, 802.15.4 y sub-1GHz ISM.

Una característica clave es la introducción de la pila IPv6 (protocolo de internet versión 6), una innovación clave en el avance de IoT en los últimos años, ya que con IPv6 se ofrecen aproximadamente 5 x 10E28 direcciones IP a nivel global, permitiendo que cualquier objeto o dispositivo embebido tenga su propia dirección IP única para conectarse a Internet.

Ha sido diseñada especialmente para el hogar y la automatización de edificios proporcionando un mecanismo de transporte básico para producir sistemas de control complejos e interconexión de dispositivos de un modo económico a través de una red inalámbrica de bajo consumo.

Diseñada para enviar paquetes IPv6 sobre redes IEEE 802.15.4, para luego implementar protocolos superiores como TCP, UDP, HTTP, COAP, MQTT y websockets, 6LowPAN es una red de topología en malla robusta, escalable y auto-regenerativa. Los routers pueden encaminar datos enviados a otros dispositivos, mientras que los hosts permanecen inactivos mucho tiempo.

  • Estándar: RFC6282
  • Frecuencia: adaptable a múltiples capas físicas como Bluetooth Smart (2.4GHz), ZigBee o comunicación RF de bajo consumo (sub-1GHz)
  • Alcance: N/A
  • Velocidad de transferencia: N/A

Hardware 6LoWPAN: https://zolertia.io/ 

LoRaWAN

Es una especificación de una red LPWAN (Low Power Wide Area Network) propuesta por la LoRa Alliance y pensada para comunicar dispositivos de bajo coste y bajo consumo alimentados por baterías. La especificación cubre las capas PHY y MAC de la red, dejando a las aplicaciones el resto de capas. En la banda ISM de 868MHz (915 MHz en otras regiones), con un bitrate de hasta decenas de kbps (de 0.3 kbps hasta  50 kbps).

Enlaces:

Esta tecnología se parece en algunos aspectos a Sigfox y a Neul. LoRaWAN está diseñada para implementar redes de área amplia (WAN) con características específicas para soportar comunicaciones móviles, bidireccionales, económicas y seguras para aplicaciones de IoT, M2M, ciudades inteligentes y aplicaciones industriales.

Optimizada para bajo consumo de energía y para ofrecer amplias redes con millones y millones de dispositivos, sus velocidades de transferencia de datos van desde 0,3 kbps hasta 50 kbps.

  • Estándar: LoRaWAN
  • Frecuencia: Varias
  • Alcance: 2-5km (entorno urbano), 15km (entorno rural)
  • Velocidad de transferencia: 0,3-50 kbps.

Z-Wave

Z-Wave es una tecnología RF de bajo consumo diseñada inicialmente para productos de domótica como controladores de iluminación y sensores. Optimizado para la comunicación fiable de baja latencia de pequeños paquetes de datos, alcanza velocidades de datos de hasta 100kbit/s, opera en la banda de sub-1 GHz y es robusta frente a interferencias de Wi-Fi y otras tecnologías inalámbricas en el rango 2,4 GHz como Bluetooth o ZigBee. Es totalmente compatible con redes de topología de malla, no necesita un nodo coordinador y es muy escalable, permitiendo controlar hasta 232 dispositivos.

Z-Wave utiliza un protocolo más simple que otras tecnologías lo que permite una mayor rapidez en el desarrollo, pero el único fabricante de chips compatibles es la empresa Sigma Design, en comparación con la multitud de empresas que ofrecen productos de otras tecnologías inalámbricas como ZigBee o Bluetooth.

  • Estándar: Z-Wave Alliance ZAD12837 / ITU-T G.9959
  • Frecuencia: 900MHz (Banda ISM)
  • Alcance: 30m
  • Velocidad de transferencia: 9,6/40/100kbit/s

NFC

NFC (Near Field Communication) es una tecnología que permite dos vías simultáneas de interacción segura entre dispositivos electrónicos, siendo especialmente adecuada para smartphones, permitiendo a los consumidores realizar transacciones de pago, acceder al contenido digital y conectar dispositivos electrónicos, todo ellos sin contacto. Esencialmente, amplía la capacidad de la tecnología contacless de las tarjetas inteligentes permitiendo conexiones punto a punto y modos de funcionamiento activos y pasivos.

  • Estándar: ISO/IEC 18000-3
  • Frecuencia: 13.56MHz (ISM)
  • Alcance: 10cm
  • Velocidad de transf.: 100–420kbps

nRF24

Este dispositivo NRF2401, integra en un único chip, toda la electrónica y bloques funcionales precisos, para establecer comunicaciones RF (Radio Frecuencia) entre dos o más puntos a diferentes velocidades, (Hasta 2  Mb/seg) con corrección de errores y protocolo de reenvío cuando es necesario, sin intervención del control externo, lo que nos permite aislarnos de todo el trabajo sucio y complicado relacionado con la transmisión física.

Información de producto: http://www.nordicsemi.com/eng/Products/2.4GHz-RF/nRF24L01 

Wize

La tecnología Wize se basa en la frecuencia de 169 MHz y se ha utilizado durante más de 10 años para la medición inteligente por parte de las compañías de agua y gas. La tecnología ha mostrado un rendimiento excepcional, especialmente en lo que se refiere a la penetración de la radio en interiores. Esto lo hace perfecto para aplicaciones de IoT en entornos urbanos donde las paredes suelen mitigar la propagación de otras comunicaciones de radio.

Características.

  • Basado en una norma robusta y fiable EN-13757 – Wireless M-Bus
  • Capaz de alcanzar a larga distancia, hasta 20 KM
  • Consumo de energía extremadamente bajo: hasta 20 años de duración de la batería con 1 mensaje/día
  • Bidireccional con programación por aire (OTA)
  • Penetración profunda de la radio en interiores
  • Solución flexible: Sin bloqueo de chip, sin bloqueo de telecomunicaciones, posibilidad de utilizar la red existente o crear nuevas redes.

Protocolo: https://www.allwize.io/wize-protocol

Wize Alliance: https://www.wize-alliance.com/

Más información: https://www.allwize.io/post/the-wize-protocol-the-new-trendy-iot-standard

Dispositivo compatible con Arduino: https://www.kickstarter.com/projects/1230929587/extreme-lpwa-arduino-board-for-iot-using-the-wize?lang=es

Sigfox

Es una solución de conectividad celular mundial para el Internet of Things pensada para comunicaciones de baja velocidad que permite reducir los precios y el consumo de energía para los dispositivos conectados. La solución de conectividad SIGFOX se basa en una infraestructura de antenas y de estaciones de base totalmente independientes de las redes existentes.

En la red SIGFOX se transmiten mensajes de 12 bytes, pudiendo enviar 140 mensajes al día.

Sigfox trabaja con fabricantes como Texas Instruments, Atmel, Silicon Labs y otros para poder ofrecer distintos tipos de SOC, transceptores y componentes de conexión a su red. En el caso de smartphones y tablets, actualmente no son compatibles con esta red, pero, al no tener licencia de uso, su inclusión sería realmente económica y sencilla.

Es una alternativa de amplio alcance es Sigfox, que en términos de alcance está entre Wi-Fi y la comunicación móvil. Utiliza bandas ISM, que se pueden utilizar sin necesidad de adquirir licencias.

Sigfox responde a las necesidades de muchas aplicaciones M2M que funcionan con una batería pequeña y solo requieren niveles menores de transferencia de datos, allí donde WiFi se queda demasiado corto y la comunicación móvil es muy cara y consume demasiada energía.

Sigfox utiliza una tecnología llamada Ultra Narrow Band (UNB) diseñada para funcionar con bajas velocidades de transferencias de 10 a 1.000 bits por segundo.

Solo consume 50 microvatios (la comunicación móvil consume 5.000 microvatios) además de poder mantenerse en stand-by 20 años con una batería 2.5Ah (0,2 años para comunicaciones móviles).

Esta tecnología es robusta, energéticamente eficiente y funciona como una red escalable que puede comunicarse con millones de dispositivos móviles a lo largo de muchos kilómetros cuadrados. Así pues, es adecuada para aplicaciones M2M como: contadores inteligentes, monitores médicos, dispositivos de seguridad, alumbrado público y sensores ambientales.

El sistema Sigfox utiliza los transceptores inalámbricos que funcionan en la banda sub-1GHz ofreciendo un rendimiento excepcional, mayor alcance y un consumo mínimo.

  • Estándar: Sigfox
  • Frecuencia: 900MHz
  • Alcance: 30-50km (ambientes rurales), 3-10km (ambientes urbanos)
  • Velocidad de transferencia: 10-1000bps

Más información: https://www.rs-online.com/designspark/eleven-internet-of-things-iot-protocols-you-need-to-know-about