Introducción
LoRaWAN es una especificación de red inalámbrica a largo plazo y de baja potencia, (LPWAN), basada en la modulación LoRa que puede lograr comunicaciones de hasta 20 Km. en condiciones favorables. Se trata de un MAC (Media Access Control) que se utiliza para conectar diferentes dispositivos LoRa y proporcionar autenticación a través de las conexiones siguiendo protocolos estándar. Si desea saber más sobre LoRa y LoRaWAN consulte los blogs de Enlaces Relacionados.
Al trabajar con LoRaWAN, se requiere una autenticación y una encriptación de los datos. Además, antes de que puedas comunicarte con los dispositivos, tendrás que añadir una aplicación y una puerta de enlace a una red y registrar los dispositivos en ella. Necesitarás una clave de sesión de la red y una clave de sesión de la aplicación para cifrar los datos. Hay dos métodos posibles que el dispositivo puede utilizar para obtener estas claves, activando la conexión con OTAA o ABP. A continuación te mostramos cómo trabajar con ambas configuraciones, así como sus ventajas y desventajas. Desde Industrial Shields, te proporcionamos algunos ejemplos con los que trabajar con controladores industriales para automatización Arduino.
Requisitos
Controlador Arduino de Industrial Shields M-Duino LoRaWAN PLC
OTAA
¿Qué es OTAA?
La activación por aire (OTAA) es un método de autenticación en el que la clave de sesión de red y la clave de sesión de aplicación se generan en cada nueva conexión. Cuando se conecta utilizando una solicitud conjunta, un dispositivo recibe un Appeui, un Deveui y la AppKey que se utilizarán para generar la Clave de Sesión de Red y la Clave de Sesión de Aplicación.
En el método OTAA las claves son generadas en cada nueva conexión, haciéndolo más seguro ya que las claves también son borradas cuando la conexión termina. Además, el dispositivo puede ser fácilmente cambiado a una nueva red y las claves no pueden ser tan fácilmente interceptadas. Sin embargo, el dispositivo puede almacenar las claves y decidir cuándo es necesaria una petición de unión.
ABP
¿Qué es ABP?
La Activación por Personalización (ABP) es un método de autenticación en el que la Clave de Sesión de Red y la Clave de Sesión de Aplicación se programan por defecto en el dispositivo. Como las claves están preprogramadas, no es necesario establecer una conexión de unión cada vez que se requiera una nueva conexión.
Tener las claves preprogramadas reduce el tiempo de las conexiones, ya que cualquier solicitud de unión es necesaria cuando se conecta al servidor. Sin embargo, el método no puede repetir las claves y debe asegurarse de que son únicas. Aunque las claves pueden ser fácilmente descubiertas incluso antes de que se establezca la conexión.
¿Cómo programarlo?
Para probar la LoRaWAN trabajaremos con The Things Network, así que usaremos una de sus puertas de enlace para hacer la conexión. Asegúrate de tener una cuenta y de haber establecido la configuración previa de la aplicación y la puerta de enlace. Por aplicaciones, nos referimos a lo que sea que sus dispositivos se comunican con en Internet.
En este ejemplo básico enviaremos al servidor algunos datos cada 60 segundos a través de nuestra gateway. Te ayudará a conocer la comunicación LoRaWAN y ver cómo funcionan las conexiones.
En primer lugar, debes descargar e instalar Arduino IDE en tu Placas Industrial Shields. Luego elige la placa M-Duino Family y el modelo con el que estás trabajando. Usaremos una M-Duino LoRa 21+. Si no, por favor configúralo antes de pasar al siguiente paso siguiendo nuestro tutorial.
Después de configurar todo lo anterior, abre los ejemplos de la librería MCCI LoRaWAN LMIC y elige el ttn-otaa or ttn-abp dependiendo de la activación con la que desses trabajar.
Ambas configuraciones tienen un código similar pero con importantes diferencias. Asegúrate de saber con cuál vas a trabajar ya que se necesitan diferentes claves y sería imposible trabajar de otra manera. Las diferencias aparecerán en las primeras líneas del código donde se declaran las definiciones. Consulta las secciones del final para saber qué parámetros deben cambiarse para trabajar con OTAA o ABP.
En las siguientes líneas puedes ver cómo establecer los datos que se enviarán y el intervalo de tiempo en segundos en que el dispositivo enviará los paquetes. Por defecto, enviarás la cadena "Hello, world!" cada minuto.
Es importante ajustar correctamente los pines de Arduino. En tu controlador lógico programable industrial Arduino usarás el pin 12 para el Chip Select y el pin 13 para el Reset. La librería LoRa adaptada por Industrial Shields no utiliza los pines RXTX y DIO ya que las comprobaciones de recepción y transmisión se hacen internamente leyendo los registros de los pines y enviando los datos vía ModBus.
(*En el caso de la Familia Ardbox LoRa, utilizaremos el pin 23 para el Chip Select y el pin 3 para el Reset).
Configura estos parámetros como las siguientes líneas:
static uint8_t mydata[] = "Hello, world!";static osjob_t sendjob;// Schedule TX every this many seconds (might become longer due to duty// cycle limitations).const unsigned TX_INTERVAL = 60;// Pin mappingconst lmic_pinmap lmic_pins = {.nss = 12,.rxtx = LMIC_UNUSED_PIN,.rst = 13,.dio = {LMIC_UNUSED_PIN, LMIC_UNUSED_PIN, LMIC_UNUSED_PIN},};
void do_send(osjob_t* j){// Check if there is not a current TX/RX job runningif (LMIC.opmode & OP_TXRXPEND) {Serial.println(F("OP_TXRXPEND, not sending"));} else {// Prepare upstream data transmission at the next possible time.LMIC_setTxData2(1, mydata, sizeof(mydata)-1, 0);Serial.println(F("Packet queued"));}// Next TX is scheduled after TX_COMPLETE event.}
#if defined(CFG_eu868)LMIC_setupChannel(0, 868100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-bandLMIC_setupChannel(1, 868300000, DR_RANGE_MAP(DR_SF12, DR_SF7B), BAND_CENTI); // g-bandLMIC_setupChannel(2, 868500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-bandLMIC_setupChannel(3, 867100000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-bandLMIC_setupChannel(4, 867300000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-bandLMIC_setupChannel(5, 867500000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-bandLMIC_setupChannel(6, 867700000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-bandLMIC_setupChannel(7, 867900000, DR_RANGE_MAP(DR_SF12, DR_SF7), BAND_CENTI); // g-bandLMIC_setupChannel(8, 868800000, DR_RANGE_MAP(DR_FSK, DR_FSK), BAND_MILLI); // g2-band#else# error Region not supported#endif
Finalmente, el os_runloop_once() debe ser llamado en la función loop() para comprobar y actualizar constantemente la comunicación LoRaWAN. Otras opciones de depuración como el parpadeo de los LEDs pueden ser implementadas para una opción de depuración más visual.
void loop() { unsigned long now; now = millis(); if ((now & 512) != 0) digitalWrite(13, HIGH); else digitalWrite(13, LOW); os_runloop_once(); }
OTTA ejemplo
static const u1_t PROGMEM APPEUI[8]={ FILLMEIN }; static const u1_t PROGMEM DEVEUI[8]={ FILLMEIN }; static const u1_t PROGMEM APPKEY[16] = { FILLMEIN };
Ejemplo ABP
Si trabajas con el ejemplo de ABP, hay que pasar las claves de DevAddr, NetwKey y AppKey. Esos parámetros son privados y deben ser obtenidos a través de la cuenta personal de The Things Network. Recuerda que NetKey y AppKey deben pasarse en formato big-endian. Ponlos en las siguientes líneas reemplazando el texto FILLME:
static const PROGMEM u1_t NWKSKEY[16] = { FILLMEIN };static const u1_t PROGMEM APPSKEY[16] = { FILLMEIN };static const u4_t DEVADDR = FILLMEIN ;
Verificación
Para saber si la conexión ha ido bien, entra en The Things Network y comprueba si algún mensaje ha pasado por la puerta de enlace y ha llegado al servidor.
Asegúrate de que la trama está puesta a 0 ya que, si no, podría provocar un error.