Ir al contenido principal

Integrar tus datos de ChirpStack con Ubidots

Recibir y decodificar datos de dispositivos LoRaWAN conectados al servidor ChirpStack.

Santiago Pachon Robayo avatar
Escrito por Santiago Pachon Robayo
Actualizado esta semana

El stack de servidor de red LoRaWAN de ChirpStack, de código abierto, proporciona componentes de código abierto para redes LoRaWAN. Juntos forman una solución lista para usar que incluye una interfaz web fácil de utilizar para la gestión de dispositivos y APIs para la integración.

Siguiendo esta guía, podrás decodificar los datos de ChirpStack y enviarlos a Ubidots.

Requisitos

1. Flujo de Trabajo de Integración

Para enviar los datos ubicados en el servidor de ChirpStack a Ubidots, es necesario realizar una integración HTTP de nube a nube. Esta integración requiere convertir el formato JSON de salida de ChirpStack en uno compatible con Ubidots. El proceso de análisis de los datos se puede lograr utilizando el módulo de Funciones como Servicio (FaaS) de Ubidots, llamado UbiFunctions, donde se toma el formato JSON nativo de ChirpStack y se transforma en uno compatible con la API de Ubidots.

2. Configuración de UbiFunction en Ubidots

Sigue los pasos a continuación para crear y lanzar la UbiFunction que manejará la conversión del formato JSON nativo de ChirpStack en uno compatible con Ubidots:

Paso 1: Ve al módulo de Funciones que se encuentra en la pestaña Dev Center.
Paso 2: Haz clic en el ícono “+” para crear una nueva UbiFunction en tu cuenta.
Paso 3: Asigna POST como el Método HTTP y elige Python o NodeJS como lenguaje de programación (runtime). Presiona el botón llamado “Guardar y Desplegar”, asigna un nombre a la UbiFunction, por ejemplo, “Integración ChirpStack” y se generará la URL del endpoint HTTPs.

Paso 4: Ve a la sección de Configuración y selecciona un token de tu cuenta.

Paso 5: Copia y pega el código a continuación en el editor de código de la Función de Ubidots. Por favor, selecciona el código de acuerdo con el lenguaje de programación (runtime).

Python:

import requests
import time
import base64
import json

BASE_URL = "https://industrial.api.ubidots.com"

REQUESTS_FUNCTIONS = {"get": requests.get, "post": requests.post}

def main(args):
print(args)

token = args.get("_auth_token")
device_label = get_device_label(args)
payload = json.loads(args.get("objectJSON"))
req = update_device(device_label, payload, token)

return {"status_code": req.status_code, "res": req.json()}


def get_device_label(data):
label_b64 = base64.b64decode(data.get("devEUI"))
return label_b64.hex()

def update_device(device, payload, token):
url = "{}/api/v1.6/devices/{}".format(BASE_URL, device)
headers = {"X-Auth-Token": token, "Content-Type": "application/json"}

req = create_request(url, headers, payload, attempts=5, request_type="post")

return req

def create_request(url, headers, data, attempts, request_type):
"""
Function to create a request to the server
"""

request_func = REQUESTS_FUNCTIONS.get(request_type)

kwargs = {"url": url, "headers": headers}

if request_type == "post":
kwargs["json"] = data

try:
req = request_func(**kwargs)
print("[INFO] Request result: {}".format(req.text))
status_code = req.status_code
time.sleep(1)

while status_code >= 400 and attempts < 5:
req = request_func(**kwargs)
print("[INFO] Request result: {}".format(req.text))
status_code = req.status_code
attempts += 1
time.sleep(1)

return req
except Exception as e:
print("[ERROR] There was an error with the request, details:")
print(e)
return None

NodeJS:

const axios = require('axios');

async function main(args) {
console.log(args);

// Get token
var token = args.token;

// Get Device Label
var label = args.devEUI;

// Decode data
var buff = Buffer.from(label, 'base64');
var device_label = buff.toString('hex');
console.log(device_label);

var payload = args.objectJSON;
console.log(payload);

// Send the payload to Ubidots
var response = await ubidots_request(token, device_label, payload);

// Log Ubidots response to the console
console.log(response);

// Pass Ubidots' API response as the function's reponse
return response;
}
// This function builds an HTTP POST request to Ubidots
async function ubidots_request(token, device_label, payload) {
let config = {
method: 'post',
url: 'https://industrial.api.ubidots.com/api/v1.6/devices/' + device_label,
data: payload,
headers: {
'Content-Type': 'application/json',
'X-Auth-Token': token
}
}
const response = await axios.request(config);
return response.data;
}

Paso 6: Copia la URL del Endpoint HTTPS haciendo clic en el ícono “Copiar” y guárdala para más tarde.

3. Integración HTTP de ChirpStack

Una vez que la UbiFunction esté configurada, puedes proceder a completar la integración para comenzar a enviar datos a Ubidots. Por favor, sigue los siguientes pasos que te guiarán a través de este proceso:

Paso 1: Haz clic en “Aplicaciones” y selecciona la opción “CREAR”.
Paso 2: Ingresa un nombre de Aplicación, descripción de Aplicación y selecciona el perfil de servicio. Luego haz clic en el botón “CREAR APLICACIÓN”.
Paso 3: Ve a la Aplicación recién creada y entra en la pestaña “INTEGRACIONES”.
Paso 4: Elige la opción HTTP e ingresa la siguiente información:
- Payload marshaler: JSON
- Headers: “X-Auth-Token”: Tu Token.
- Endpoints: URL del Endpoint HTTPS guardada de la sección anterior.

Después de completar este proceso, podrás comenzar a ver tus dispositivos de ChirpStack siendo creados en tu cuenta de Ubidots y reportando datos a medida que estén disponibles.

¿Ha quedado contestada tu pregunta?