2.5 ChirpStack – Añadir un dispositivo

Para añadir un dispositivo en el Broker ChirpStack, el ejemplo básico envía una trama solo para leer los datos de niveles de señal RSSI y SNR.

1.  Application Service Profile

El perfil de servicio en la aplicación se asigna un nombre acorde a la aplicación que la usará.

se ingresan los parametros requeridos, por simplicidad solo se añade un nombre. Ejemplo:

2. Device Profile

El perfil de dispositivos describe la forma de conexión y autenticación de un grupo de dispositivos.

Por ejemplo, si los dispositivos autentican por medio de OTTA/APB, si se incluirán dispositivos clase B, clase C y las instrucciones para codificar o decodificar los datos del dispositivo (CODEC).

para conexión OTAA/ABP

soporte de dispositivos clase B

soporte de dispositivos clase C

Para el tema de CODEC se recomienda revisar la sección de LoRaWAN – Mensajes y datos entre componentes

3. Applications

La aplicación agrupa dispositivos que realizan funciones semejantes, mediante el perfil del dispositivo, donde se encuentra también el CODEC de los datos.

Se asigna un nombre y una descripción de lo que va a realizar con los dispositivos:

para finalmente registrar la aplicación

4. Añadir dispositivos a la aplicación

Hay que crear cada dispositivo con identificadores únicos y autenticarlos en la red.

los primeros datos corresponden a nombre y nombre y descripción.

El identificador único de dispositivo: Device EUI es primordial para la conexión por OTAA. El Device EUI se puede generar con el boton mostrado en la pantalla y se usa en la programación del dispositivo.

El  perfil del dispositivo se selecciona desde la pestaña y se despliegan las opciones.

https://heltec-automation-docs.readthedocs.io/en/latest/esp32/lorawan/config_parameter.html

https://www.thethingsnetwork.org/docs/lorawan/addressing.html

los parámetros para OTAA se pueden visualizar, generar en la pestaña correspondiente. Hay un boton para visualizar el que se esté usando, o en otro caso se puede generar para usar en la programación del dispositivo.

Si el dispositivo no ha sido conectado al menos una vez, la pestaña de activación aparece vacia. Para obtener los datos de activación es necesario realizar al menos un intento de conexión, con lo que la ventana llena los datos para completar la programación del dispositivo.

Para observar los datos de activación debe usar el boton de visualización en la parte derecha de la ventana.

Los intentos de conexión se pueden visualizar en la pestaña de LoRaWAN Frames

mientras que los datos recibidos se observan en la pestaña de Device Data

Hay que considerar que la primera vez que se conecta el dispositivo, la autenticación puede llevar algunos intentos, por lo que hay que esperar para que se comiencen a recibir los datos, a pesar que las tramas LoRaWAN si se registran en el programa.

5. Instrucciones Arduino IDE ejemplo básico

Los datos para la configuración del dispositivo se obtienen en el proceso descrito anteriormente, por lo que es necesario actualizar los datos.

En el caso de dispositivos HELTEC es necesario obtener los datos de licencia que se encuentran al inicio de las instrucciones. La licencia de cada dispositivo se puede revisar en: https://resource.heltec.cn/search/

/*
 * HelTec Automation(TM) LoRaWAN 1.0.2 OTAA example use OTAA, CLASS A
 * Solo ESP32+LoRa series boards con licencia http://www.heltec.cn/search/);
 *https://github.com/HelTecAutomation/ESP32_LoRaWAN
*/
#include <ESP32_LoRaWAN.h>
#include "Arduino.h"

/*licencia Heltec ESP32 LoRaWan http://resource.heltec.cn/search  
uint32_t  license[4] = {0xBE21335B, 0xAEC3C5CE, 0xCC0A1CF4, 0xB836F981};
/* OTAA parametros 
uint8_t DevEui[] = { 0x01, 0x20, 0x08, 0x93, 0xdf, 0x80, 0x37, 0x74 };
uint8_t AppEui[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
uint8_t AppKey[] = { 0x05, 0x8e, 0xeb, 0xff, 0x24, 0xf1, 0x01, 0x84, 0xd0, 0x07, 0xbe, 0xd4, 0x65, 0xe7, 0x6b, 0xb5 };

/* ABP parametros 
uint32_t DevAddr =  ( uint32_t )0x0174b1fd;
uint8_t NwkSKey[] = { 0xc1, 0x45, 0x31, 0x28, 0x5f, 0xb2, 0x56, 0x3b, 0x9d, 0x5f, 0x27, 0x15, 0xed, 0x3a, 0x0e, 0xbc}; 
uint8_t AppSKey[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

//LoraWan channelsmask, default channels 0-7/
uint16_t userChannelsMask[6]={ 0x00FF,0x0000,0x0000,0x0000,0x0000,0x0000 };

DeviceClass_t  loraWanClass = CLASS_A;  /*Soporte de A and C 
uint32_t appTxDutyCycle = 15000;        /*15000; en [ms] 
bool overTheAirActivation = true;       /*OTAA or ABP 
bool loraWanAdr    = true;              /*ADR enable 
bool isTxConfirmed = true;              /*confirmed or unconfirmed messages  
uint8_t appPort = 2;                    /* Application port  

/* reintentos de transmisión, en caso de no recibir ack  
uint8_t confirmedNbTrials = 8;

/* Seleccionado de Arduino IDE tools  
uint8_t debugLevel = LoRaWAN_DEBUG_LEVEL; 
LoRaMacRegion_t loraWanRegion = ACTIVE_REGION;

// variables de sensor/actuador
byte    contador1 = 0;
uint8_t contador2 = 0;  
int    unalectura = 221;

void setup(){
  Serial.begin(115200);
  while (!Serial);
  SPI.begin(SCK,MISO,MOSI,SS);
  Mcu.init(SS,RST_LoRa,DIO0,DIO1,license);
  deviceState = DEVICE_STATE_INIT;
}
void loop(){
  switch( deviceState )  {
    case DEVICE_STATE_INIT:    {
      LoRaWAN.init(loraWanClass,loraWanRegion);
      break;
    }
    case DEVICE_STATE_JOIN:    {
      LoRaWAN.join();
      break;
    }
    case DEVICE_STATE_SEND:    {
      prepareTxFrame( appPort );
      LoRaWAN.send(loraWanClass);
      deviceState = DEVICE_STATE_CYCLE;
      break;
      
    }
    case DEVICE_STATE_CYCLE:    {
      // Schedule next packet transmission
      txDutyCycleTime = appTxDutyCycle + randr( -APP_TX_DUTYCYCLE_RND,
                                                APP_TX_DUTYCYCLE_RND );
      LoRaWAN.cycle(txDutyCycleTime);
      deviceState = DEVICE_STATE_SLEEP;
      break;
    }
    case DEVICE_STATE_SLEEP:    {
      LoRaWAN.sleep(loraWanClass,debugLevel);
      break;
    }
    default:    {
      deviceState = DEVICE_STATE_INIT;
      break;
    }
  }
}

static void prepareTxFrame( uint8_t port ){
    contador1 = contador1 + 1;
    contador2 = contador2 - 1;

    //orden de trama
    appDataSize = 4         //AppDataSize max value is 64
    appData[0] = contador1; //0x01;
    appData[1] = contador2;
    appData[2] = highByte(unalectura);
    appData[3] = lowByte(unalectura);

    // mostrar en puerto USB
    Serial.println(contador1);
    Serial.println(contador2);
    Serial.println(unalectura);
}