Prueba de módems de radio LoRa / LoRaWAN RN2483. Parte 2, LoRaWAN

La parte anterior describe cómo conectar módems RN2483 en modo LoRa. Ahora pasemos a la siguiente parte, más compleja: conectarse a la red LoRaWAN.

¿Qué es LoRaWAN?



LoRaWAN es una red "condicionalmente global" que consta de dispositivos finales (nodos) que envían datos a los concentradores (puerta de enlace). Cada centro tiene acceso a Internet y envía los datos recibidos a un servidor, que a su vez los envía a los clientes firmados. La red, por un lado, es "global", porque los datos pueden ser recibidos por cualquier puerta de enlace cercana, por otro lado, es "condicionalmente global", porque no funcionará sin Internet / intranet (aunque nadie se molesta en tener su propia puerta de enlace y servidor dentro de la organización).

El módem RN2483 se usará como el "nodo", se usará un servicio gratuito para conectarse . Continúa debajo del corte.

La red de las cosas


El servicio www.thethingsnetwork.org es una comunidad abierta cuyos usuarios pueden crear, registrar dispositivos y centros, experimentar cómo funciona todo, etc. Como dicen, gratis y sin SMS. Lo usaremos para probar.

Cualquiera puede registrar tanto un nodo como una puerta de enlace en la red. The Things Network es completamente gratis, muchos entusiastas compran equipos por su propia cuenta.
El mapa de cobertura al momento de escribir es el siguiente:



Como puede ver, el segmento de cobertura en ruso deja mucho que desear, pero aún lo es. Hay un lado positivo en esto: en Londres o Amsterdam no sorprenderá a nadie con un nuevo concentrador, pero en Rusia hay muchas posibilidades de ser el primero.

Conecte RN2483 a LoRaWAN


A diferencia de una conexión p2p simple, todo es mucho más complicado en LoRaWAN: los dispositivos se registran en la red, el tráfico se cifra con varias claves, etc. Porque la red es pública y pública, los problemas de protección de datos son muy relevantes aquí.

Hay 2 tipos de autenticación en la red LoRaWAN:

- Autenticación “por aire” ( OTAA , Activación por aire). Los dispositivos se registran en la red y reciben la clave necesaria para la operación.
- Activación de ABP (Activación por personalización). La configuración está prerregistrada en el dispositivo, no se requiere autenticación adicional. Este modo es más simple, pero también hay un signo negativo: los datos simplemente se envían al aire, no hay garantía de que el centro los haya recibido.

Es importante: Muchos hubs baratos de un solo canal solo admiten el modo ABP, por lo que el primer método puede no funcionar.

1. Registro del dispositivo - OTAA


El primer paso es ir a staging.thethingsnetwork.org y registrar una "solicitud". Lo llamé Raspberry Pi Home. Al registrar la aplicación, el usuario recibe la primera clave, que es útil en el futuro.



A continuación, vemos la pestaña Dispositivos donde puede agregar nuestro módem (puede haber varios). Haga clic en "registrar dispositivo" y seleccione el modo OTAA. Aparece una ventana en la que debe ingresar el identificador del dispositivo.


Este identificador se puede obtener enviando el comando sys get hweui al módem. Este registro se completa, como se prometió, de forma gratuita y sin SMS.

Al abrir los parámetros del dispositivo, puede ver todas las claves; deben estar registradas en el programa.



Para simplificar el código, utilicé la biblioteca python-loranode , el código fuente para enviar datos se proporciona a continuación. Como puede ver, en el código hay 3 líneas appkey, appeui y deveui, que se utilizan para la autenticación.

Código fuente
from loranode import RN2483Controller
from commands import *
import time

# LoRaController OTAA based join and message test
if __name__ == "__main__":
    set_debug_level(Level.DEBUG)
    
    port = "COM3"
    appkey = "58FF3007CAED02xxxxxxxxxxxxxxxxxxxx"
    appeui = "70B3D57Exxxxxxxxxxxxxx"
    deveui = "0004A30xxxxxxxxxxx"

    # Test controller
    lc = RN2483Controller(port)
    if lc.test():
        printd("[+] Connected to LoRa RN2483 device", Level.INFO)
        lc.serial_sr(CMD_GET_VERSION)
        lc.serial_sr(CMD_GET_HWEUI)
        lc.get_freq()
    else:
        printd(clr(Color.YELLOW, "[-] Failed to get version from LoRa device"), Level.WARNING)

    lc.set_pwr(15)
    lc.set_adr(False)
    lc.serial_sr(CMD_SET_SF, "sf7") # sf12, sf7

    # Join and send a message
    if lc.join_otaa(appkey, appeui, deveui):
        printd("[+] Connected to gateway", Level.INFO)
        
        # Data-1
        printd("[+] Sending packet #1", Level.INFO)
        timeStr = time.strftime("%H%M", time.gmtime())
        if lc.send(timeStr, ack=False):
            printd(clr(Color.GREEN, "[+] Send-1 succeeded"), Level.CRITICAL)
        else:
            printd(clr(Color.RED, "[+] Send-1 failed"), Level.CRITICAL)
        time.sleep(15)

        # Data-2
        printd("[+] Sending packet #2", Level.INFO)
        timeStr = time.strftime("%H%M", time.gmtime())
        if lc.send(timeStr, ack=False):
          printd(clr(Color.GREEN, "[+] Send-2 succeeded"), Level.CRITICAL)
        else:
          printd(clr(Color.RED, "[+] Send-2 failed"), Level.CRITICAL)
        time.sleep(15)

        del lc
        exit()

    del lc
    printd(clr(Color.RED, "[-] Test failed"), Level.CRITICAL)


En este ejemplo, los paquetes que contienen la hora actual (hhmm) se envían al servidor. Esto es conveniente para controlar qué paquete se recibió.

2. Registro del dispositivo - ABP


Aquí todo es más simple: registramos el dispositivo como ABP y obtenemos varias claves que deben registrarse en el programa.



El módem envía los datos "tal cual", no hay garantía de que la autenticación se haya realizado correctamente, no.

Para enviar datos, debe insertar las claves nwkskey, appskey, devaddr en el código. El código fuente se da a continuación.

Código fuente
from loranode import RN2483Controller
import platform
from commands import *
import time

# LoRaController ABP based join and ACK test
if __name__ == "__main__":
    set_debug_level(Level.DEBUG)

    port = "COM3"
    nwkskey = "58AA52E96035Axxxxxxxxxxxxxxxxxxxx"
    appskey = "381B1C9206E9BE9xxxxxxxxxxxxxxxxxxx"
    devaddr = "B639xxxx"
    
    lc = None
    
    try:
      # Test controller
      lc = RN2483Controller(port)
      if lc.test():
        printd("[+] Connected to LoRa RN2483 device", Level.INFO)

        lc.serial_sr(CMD_GET_VERSION)
        lc.serial_sr(CMD_GET_HWEUI)
        lc.get_freq()
      else:
        printd(clr(Color.YELLOW, "[-] Failed to get version from LoRa device"), Level.WARNING)

    except Exception, e:
      print "Error: " + str(e)

    if lc is None:
      printd(Color.YELLOW, "Error: cannot connect to device")
      exit()

    lc.set_adr(False)
    lc.set_pwr(15)
    lc.serial_sr(CMD_MAC_PAUSE)
    lc.serial_sr(CMD_SET_SF, "sf12") # sf12, sf7
    lc.serial_sr(CMD_MAC_RESUME)

    # Join and send a message
    if lc.join_abp(nwkskey, appskey, devaddr):
        printd("[+] Connected to gateway", Level.INFO)
        
        # Data-1
        printd("[+] Sending packet #1", Level.INFO)
        timeStr = time.strftime("%H%M", time.gmtime())
        if lc.send(timeStr, ack=False):
          printd(clr(Color.GREEN, "[+] Send-1 succeeded"), Level.CRITICAL)
        else:
          printd(clr(Color.RED, "[+] Send-1 failed"), Level.CRITICAL)
        time.sleep(15)

        # Data-2
        printd("[+] Sending packet #2", Level.INFO)
        timeStr = time.strftime("%H%M", time.gmtime())
        if lc.send(timeStr, ack=False):
          printd(clr(Color.GREEN, "[+] Send-2 succeeded"), Level.CRITICAL)
        else:
          printd(clr(Color.RED, "[+] Send-2 failed"), Level.CRITICAL)
        time.sleep(15)

        del lc
        exit()

    printd(clr(Color.RED, "[-] Test failed"), Level.CRITICAL)
    del lc


Prueba


El último paso, queda una cosa: llevar una computadora portátil (o Arduino o Raspberry Pi) con un módem con usted e ir (ir, volar) al lugar donde se encuentra el área de cobertura de la puerta de enlace más cercana. Llegué al área de cobertura más cercana durante aproximadamente media hora en tranvía, por lo que el proceso no es tan largo y costoso.

En caso de recepción exitosa de datos, los paquetes se mostrarán en el servidor.



El servidor en sí no hace nada con los datos; puede configurar su propio código en el servidor para procesar los datos recibidos. Este ejemplo es solo una prueba, no se hace nada con los datos, en una aplicación real se pueden agregar a la base de datos, enviar notificaciones, etc. Todo depende de la tarea.

¿Por qué es esto necesario?


Idealmente, la red LoRaWAN proporciona al usuario un servicio de transferencia de datos listo para usar que funciona de manera inmediata. Solo necesita conectar el dispositivo y los datos serán enviados y procesados ​​por el centro más cercano (por supuesto, si el usuario está en el área de cobertura de la red). El alcance de la aplicación es bastante extenso, desde sensores para abrir la puerta, temperatura o nivel de agua en el país, hasta una baliza GPS en un animal o modelo de un avión.

Varios videos (en inglés).

Introducción a LoRa Alliance:



Introducción a la red de Things:


Sin embargo, si hablamos de The Things Network, entonces este es un servicio "amateur", por supuesto que no garantiza una conexión permanente. Si hay proveedores comerciales de LoRaWAN, todavía no lo sé.

¿Qué pasa si no hay cobertura?


Puede surgir una pregunta razonable: ¿qué hacer si un par de días en tren o un par de horas en avión hasta la puerta de enlace más cercana? Esto tiene su propio plus: puedes ser el primero. Puede crear su propia puerta de enlace y registrarla en el servidor de The Things Network, el precio del problema varía según la funcionalidad: desde> 1000EUR para concentradores multicanal "propietarios", hasta $ 15 para dispositivos caseros basados ​​en SX1276 y Raspberry Pi. Hay una tabla comparativa de diferentes enrutadores, aquellos que lo deseen pueden estudiarlo con más detalle.

La última opción se considerará en la siguiente parte.

Source: https://habr.com/ru/post/es398247/


All Articles