El nuevo servidor de red LoRaWAN de The Things Industries, llamado The Things Enterprise Stack, ofrece la solución para construir y operar redes LoRaWAN privadas. Administra y monitorea tus dispositivos remotos y gateways con un conjunto de herramientas elaborado, y enruta los datos de telemetría de manera segura a tu aplicación en la nube IoT impulsada por Ubidots.
NOTA IMPORTANTE: este artículo asume que los gateways y dispositivos LoRaWAN ya han sido provisionados dentro de la instancia de The Things Industries y están enviando datos regularmente.
Abreviaturas:
TTI: The Things Industries
Requisitos
Cuenta de prueba de Ubidots o cuenta licenciada (Profesional y superior)
Instancia de The Things Industry
Gateway y dispositivos conectados a la instancia de TTI
1. Flujo de trabajo de integración
Conectar/enviar datos desde TTI a Ubidots se conoce como una integración HTTP de nube a nube. Estas integraciones a menudo, si no siempre, requieren pasos intermedios para asegurar la compatibilidad entre los formatos de datos de la nube del emisor y del receptor. En este caso, la integración de TTI con Ubidots no es la excepción, ya que requiere un paso de análisis para convertir el formato JSON nativo de TTI en uno compatible con Ubidots. Ese paso de análisis es donde el módulo de Funciones como Servicio (FaaS) de Ubidots, UbiFunctions, entra en juego para tomar el formato JSON nativo de TTI y hacerlo compatible con la API de Ubidots.
La imagen a continuación ilustra este flujo de trabajo:
2. Configuración de Ubidots: UbiFunctions
Desde el módulo UbiFunctions, sigue los pasos a continuación para crear y lanzar la UbiFunction que manejará la conversión del formato JSON nativo de TTI en uno compatible con Ubidots:
Paso 1: Haz clic en el botón “+” en la esquina superior derecha
Paso 2: Nombra tu UbiFunction. Por ejemplo, “Integración TTI”
Paso 3: Selecciona POST como el Método
Paso 4: Selecciona Python 3.6 como el Runtime predeterminado
NOTA: Deja la opción “Time-base trigger” desactivada
Paso 5: Ingresa el siguiente código en el Editor
import requestsimport jsonimport timeBASE_URL = "https://industrial.api.ubidots.com"TOKEN = "····" # Ingresa un token de cuenta de Ubidots aquídef main(args): # Imprimiendo args de TTI print(f'[INFO] Args de TTI:\n {args}') # Analizando datos payload = parse_tti_data(args) dev_label = tti_dev_eui(args) print(f'[INFO] Datos analizados:\n {payload}') print(f'[INFO] Datos TTI Dev_EUI:\n {dev_label}') # Publicando en Ubidots req = update_device(dev_label, payload, TOKEN) print(f'[INFO] Código de estado de la solicitud a Ubidots: {req.status_code}') print(f'[INFO] Solicitud a Ubidots JSON:\n {req.json()}') return { 'status_code': req.status_code, 'response_json': req.json() }def parse_tti_data(data): return data['uplink_message']['decoded_payload']def tti_dev_eui(data): return data['end_device_ids']['device_id']def update_device(device, payload, token): """ Actualiza el dispositivo con el payload """ url = "{}/api/v1.6/devices/{}".format(BASE_URL, device) headers = {"X-Auth-Token": token, "Content-Type": "application/json"} req = create_request(url, headers, attempts=5, request_type="post", data=payload) return reqdef create_request(url, headers, attempts, request_type, data=None): """ Función para hacer una solicitud al servidor """ request_func = getattr(requests, request_type) kwargs = {"url": url, "headers": headers} if request_type == "post" or request_type == "patch": kwargs["json"] = data try: req = request_func(**kwargs) status_code = req.status_code time.sleep(1) while status_code >= 400 and attempts < 5: req = request_func(**kwargs) status_code = req.status_code attempts += 1 time.sleep(1) return req except Exception as e: print("[ERROR] Hubo un error con la solicitud, detalles:") print(e) return None
Paso 6: Ingresa un token de cuenta de Ubidots donde se solicita (línea 6)
Paso 7: Haz clic en el botón “Hacerlo en vivo”.
Paso 8: Copia la “URL del Endpoint HTTPS” haciendo clic en el ícono de “Copiar” y guárdalo para más tarde.
3. Formateadores de carga útil de dispositivo y aplicación TTI
El formateador de carga útil, también conocido como Decodificador, es la función integrada dentro de la pila v3 de TTI que permite que los datos codificados en hexadecimal provenientes de los Dispositivos sean analizados y convertidos en valores numéricos legibles, así como estructurarlos como un objeto JSON compatible con plataformas ascendentes como Ubidots. Los formateadores de carga útil en v3 son similares a los de la Edición Comunitaria de TTN, pero con la adición de un Formateador de Carga Útil por Dispositivo.
Es IMPORTANTE NOTAR que el Formateador de Carga Útil del Dispositivo tiene prioridad sobre el Formateador de Carga Útil a nivel de Aplicación.
Formateador de Carga Útil del Dispositivo
A diferencia de la Edición Comunitaria de TTN, donde hay un Formateador de Carga Útil general por aplicación, las pilas v3 de TTI permiten configurar un Formateador de Carga Útil para cada Dispositivo dentro de una Aplicación, ampliando así el rango y tipos de dispositivos que una sola Aplicación puede soportar.
Inicia sesión en la instancia de TTI, dirígete a la Aplicación con la que te gustaría integrar Ubidots y sigue estos pasos para crear un Formateador de Carga Útil del Dispositivo:
Paso 1: Haz clic en la opción “Dispositivos” en el panel izquierdo
Paso 2: Selecciona el Dispositivo para el que te gustaría crear un Formateador de Carga Útil
Paso 3: Abre la pestaña “Formateadores de Carga Útil”
Paso 4: Selecciona de las opciones de decodificador disponibles:
– Ninguno
– JavaScript
– Servicio GRPC
– CayenneLPP
– Repositorio
NOTA: La mayoría de las veces, JavaScript es la opción que permite más flexibilidad para estructurar el JSON de salida. En la integración de Ubidots, el decodificador de JavaScript permite analizar el marco de datos hexadecimal en un JSON compatible con Ubidots.
Paso 5: Haz clic en “Guardar cambios”
Después de completar estos pasos, cada vez que el dispositivo seleccionado envíe un mensaje de subida, se activará este decodificador de Formateador de Carga Útil.
Formateador de Carga Útil de Aplicación
El Formateador de Carga Útil a nivel de Aplicación funciona de la misma manera que su contraparte en los Dispositivos, la diferencia es que este solo se activará para aquellos Dispositivos cuyo propio Formateador de Carga Útil se haya configurado como Ninguno.
Sigue los pasos a continuación para establecer un Formateador de Carga Útil a nivel de Aplicación:
Paso 1: Haz clic en “Formateadores de Carga Útil” y en la opción “Uplink” en el panel izquierdo.
Paso 2: Selecciona de las opciones de decodificador disponibles:
– Ninguno
– JavaScript
– Servicio GRPC
– CayenneLPP
– Repositorio
NOTA: La mayoría de las veces, JavaScript es la opción que permite más flexibilidad para estructurar el JSON de salida. En la integración de Ubidots, el decodificador de JavaScript permite analizar el marco de datos hexadecimal en un JSON compatible con Ubidots.
Paso 3: Haz clic en “Guardar cambios”
4. Integración HTTP Uplink de TTI
Teniendo configurada la UbiFunction y el Formateador de Carga Útil del Dispositivo y/o de Aplicación, es hora de completar la integración para comenzar a enviar datos a Ubidots. Para ello, estos pasos te guiarán a través de este proceso final:
Paso 1: Haz clic en “Integraciones” y en la opción “Webhooks” en el panel izquierdo
Paso 2: Agrega uno nuevo con el botón “+ Agregar Webhook”.
Paso 3: Ingresa la información de la siguiente manera:
– ID del Webhook: caracteres alfanuméricos y guiones solamente
– Formato del Webhook: JSON
– URL base: https://parse.ubidots.com
Paso 4: Selecciona la casilla de verificación Uplink
Paso 5: Ingresa la ruta de la UbiFunction de la Sección 2.
NOTA: La ruta debe tener esta estructura:
/prv/{UbidotsUsername}/{UbifunctionName}Donde {UbifunctionName} debe estar todo en minúsculas y los espacios reemplazados por guiones (“-”)
Paso 6: Haz clic en el botón “Agregar Webhook”