Test des modems radio LoRa / LoRaWAN RN2483. Partie 2, LoRaWAN

La partie précédente a décrit comment connecter les modems RN2483 en mode LoRa. Passons maintenant à la partie suivante, plus complexe - la connexion au réseau LoRaWAN.

Qu'est-ce que LoRaWAN?



LoRaWAN est un réseau "conditionnellement global" composé de terminaux (nœuds) qui envoient des données aux concentrateurs (passerelle). Chaque concentrateur a accès à Internet et envoie les données reçues à un serveur, qui à son tour les envoie aux clients signés. Le réseau, d'une part, est «mondial», car les données peuvent être reçues par n'importe quelle passerelle à proximité, en revanche, elles sont «conditionnellement globales», car cela ne fonctionnera pas sans Internet / intranet (bien que personne ne se soucie d'avoir sa propre passerelle et son propre serveur au sein de l'organisation).

Le modem RN2483 sera utilisé comme «nœud», un service gratuit sera utilisé pour se connecter . Suite sous la coupe.

Le réseau des choses


Le service www.thethingsnetwork.org est une communauté ouverte dont les utilisateurs peuvent créer, enregistrer des appareils et des hubs, expérimenter comment tout cela fonctionne, etc. Comme on dit, gratuitement et sans SMS. Nous l'utiliserons pour les tests.

Tout le monde peut enregistrer à la fois un nœud et une passerelle sur le réseau. Le Things Network est entièrement gratuit, de nombreux passionnés achètent du matériel à leurs frais.
La carte de couverture au moment de la rédaction est la suivante:



Comme vous pouvez le voir, le segment de couverture en langue russe laisse beaucoup à désirer, mais il l'est toujours. Il y a un côté positif à cela - à Londres ou à Amsterdam, vous ne surprendrez personne avec un nouveau concentrateur, mais en Russie - il y a de fortes chances d'être le premier.

Connectez RN2483 à LoRaWAN


Contrairement à une simple connexion p2p, tout est beaucoup plus compliqué dans LoRaWAN - les appareils sont enregistrés sur le réseau, le trafic est crypté avec différentes clés, etc. Parce que le réseau est public et public, les questions de protection des données sont très pertinentes ici.

Il existe 2 types d'authentification dans le réseau LoRaWAN:

- Authentification "over the air" ( OTAA , Over-the-Air Activation). Les appareils s'enregistrent sur le réseau et reçoivent la clé nécessaire au fonctionnement.
- Activation d' ABP (Activation par personnalisation). Les paramètres sont pré-enregistrés dans l'appareil, aucune authentification supplémentaire n'est requise. Ce mode est plus simple, mais il y a aussi un inconvénient - les données sont simplement envoyées à l'air, il n'y a aucune garantie qu'elles ont été reçues par le hub.

Est important: De nombreux concentrateurs monocanaux bon marché ne prennent en charge que le mode ABP, de sorte que la première méthode peut ne pas fonctionner.

1. Enregistrement de l'appareil - OTAA


La première étape consiste à aller sur staging.thethingsnetwork.org et à enregistrer une «application». Je l'ai appelé Raspberry Pi Home. Lors de l'enregistrement de l'application, l'utilisateur reçoit la première clé, qui sera utile à l'avenir.



Ensuite, nous voyons l'onglet Appareils où vous pouvez ajouter notre modem (il peut y en avoir plusieurs). Cliquez sur "enregistrer l'appareil" et sélectionnez le mode OTAA. Une fenêtre apparaît dans laquelle vous devez saisir l'identifiant de l'appareil.


Cet identifiant peut être obtenu en envoyant la commande sys get hweui au modem. Cette inscription est complétée, comme promis, gratuitement et sans SMS.

En ouvrant les paramètres de l'appareil, vous pouvez voir toutes les clés; elles doivent être enregistrées dans le programme.



Pour simplifier le code, j'ai utilisé la bibliothèque python-loranode , le code source pour l'envoi des données est donné ci-dessous. Comme vous pouvez le voir, dans le code, il y a 3 lignes appkey, appeui et deveui, qui sont utilisées pour l'authentification.

Code source
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)


Dans cet exemple, les paquets contenant l'heure actuelle (hhmm) sont envoyés au serveur. C'est pratique pour contrôler quel paquet a été reçu.

2. Enregistrement de l'appareil - ABP


Tout est plus simple ici - nous enregistrons l'appareil en tant qu'ABP, et nous obtenons plusieurs clés qui doivent être enregistrées dans le programme.



Le modem envoie les données «telles quelles», il n'y a aucune garantie que l'authentification a réussi, non.

Pour envoyer des données, vous devez insérer les clés nwkskey, appskey, devaddr dans le code. Le code source est donné ci-dessous.

Code source
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


Test


La dernière étape, une chose reste - prendre un ordinateur portable (ou Arduino ou Raspberry Pi) avec un modem avec vous et aller (aller, voler) à l'endroit où se trouve la zone de couverture de la passerelle la plus proche. Je suis arrivé à la zone de couverture la plus proche pendant environ une demi-heure en tramway, donc le processus n'est pas si long et coûteux.

En cas de réception de données réussie, les paquets seront affichés sur le serveur.



Le serveur lui-même ne fait rien avec les données; vous pouvez configurer votre propre code sur le serveur pour traiter les données reçues. Cet exemple n'est qu'un test, rien n'est fait avec les données, dans une application réelle, elles peuvent être ajoutées à la base de données, envoyer des notifications, etc., tout dépend de la tâche.

Pourquoi est-ce nécessaire?


Idéalement, le réseau LoRaWAN fournit à l'utilisateur un service de transfert de données prêt à l'emploi qui fonctionne tout de suite. Il vous suffit de connecter l'appareil et les données seront envoyées et traitées par le concentrateur le plus proche (bien sûr, si l'utilisateur se trouve dans la zone de couverture du réseau). Le champ d'application est assez étendu, des capteurs pour ouvrir la porte, la température ou le niveau d'eau dans le pays, à une balise GPS sur un animal ou une maquette d'avion.

Plusieurs vidéos (en anglais).

Présentation de l'Alliance LoRa:



The Things Network Introduction:


Cependant, si nous parlons de The Things Network, il s'agit d'un service "amateur", bien sûr ne garantissant pas une connexion permanente. S'il existe des fournisseurs commerciaux LoRaWAN, je ne sais toujours pas.

Et s'il n'y a pas de couverture?


Une question raisonnable peut se poser - que faire si quelques jours en train ou quelques heures en avion jusqu'à la passerelle la plus proche? Cela a son propre avantage - vous pouvez être le premier. Vous pouvez créer votre propre passerelle et l'enregistrer sur le serveur The Things Network, le prix du problème varie en fonction de la fonctionnalité - de> 1000 EUR pour les concentrateurs multicanaux «propriétaires», jusqu'à 15 $ pour les appareils faits maison basés sur SX1276 et Raspberry Pi. Il existe un tableau comparatif des différents routeurs, ceux qui le souhaitent peuvent l'étudier plus en détail.

La dernière option sera examinée dans la partie suivante.

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


All Articles