Testen von LoRa / LoRaWAN RN2483-Funkmodems. Teil 2, LoRaWAN

Im vorherigen Teil wurde beschrieben, wie RN2483-Modems im LoRa-Modus angeschlossen werden. Fahren wir nun mit dem nächsten, komplexeren Teil fort - der Verbindung zum LoRaWAN-Netzwerk.

Was ist LoRaWAN?



LoRaWAN ist ein "bedingt globales" Netzwerk, das aus Endgeräten (Knoten) besteht, die Daten an Hubs (Gateway) senden. Jeder Hub hat Zugriff auf das Internet und sendet die empfangenen Daten an einen Server, der sie wiederum an signierte Kunden sendet. Das Netzwerk ist einerseits „global“, weil Daten können von jedem nahe gelegenen Gateway empfangen werden, andererseits sind sie "bedingt global", weil Ohne Internet / Intranet funktioniert es nicht (obwohl sich niemand die Mühe macht, ein eigenes Gateway und einen eigenen Server in der Organisation zu haben).

Das RN2483-Modem wird als "Knoten" verwendet, ein kostenloser Dienst wird zum Herstellen einer Verbindung verwendet . Fortsetzung unter dem Schnitt.

Das Netzwerk der Dinge


Der Dienst www.thethingsnetwork.org ist eine offene Community, deren Benutzer Geräte und Hubs erstellen, registrieren, experimentieren können, wie alles funktioniert usw. Wie gesagt, kostenlos und ohne SMS. Wir werden es zum Testen verwenden.

Jeder kann sowohl einen Knoten als auch ein Gateway im Netzwerk registrieren. Das Things Network ist völlig kostenlos, viele Enthusiasten kaufen Geräte auf eigene Kosten.
Die Abdeckungskarte zum Zeitpunkt des Schreibens



sieht wie folgt aus: Wie Sie sehen können, lässt das russischsprachige Abdeckungssegment zu wünschen übrig, ist es aber immer noch. Dies hat eine positive Seite - in London oder Amsterdam werden Sie niemanden mit einem neuen Konzentrator überraschen, aber in Russland besteht die Chance, der Erste zu sein.

Verbinden Sie RN2483 mit LoRaWAN


Im Gegensatz zu einer einfachen P2P-Verbindung ist in LoRaWAN alles viel komplizierter - Geräte werden im Netzwerk registriert, der Datenverkehr wird mit verschiedenen Schlüsseln verschlüsselt usw. Weil Das Netzwerk ist öffentlich und öffentlich, Datenschutzfragen sind hier sehr relevant.

Es gibt zwei Arten der Authentifizierung im LoRaWAN-Netzwerk:

- Authentifizierung „über Funk “ ( OTAA , Over-the-Air-Aktivierung). Geräte registrieren sich im Netzwerk und erhalten den für den Betrieb erforderlichen Schlüssel.
- Aktivierung von ABP (Aktivierung durch Personalisierung). Die Einstellungen sind im Gerät vorregistriert, eine zusätzliche Authentifizierung ist nicht erforderlich. Dieser Modus ist einfacher, aber es gibt ein Minus - die Daten werden einfach in die Luft gesendet, es gibt keine Garantie dafür, dass sie vom Hub empfangen wurden.

Ist wichtig: Viele billige Einkanal-Hubs unterstützen nur den ABP-Modus, sodass die erste Methode möglicherweise nicht funktioniert.

1. Geräteregistrierung - OTAA


Der erste Schritt besteht darin, auf staging.thethingsnetwork.org eine „Anwendung“ zu registrieren. Ich nannte es Raspberry Pi Home. Bei der Registrierung der Anwendung erhält der Benutzer den ersten Schlüssel, der in Zukunft nützlich sein wird.



Als nächstes sehen wir die Registerkarte Geräte, auf der Sie unser Modem hinzufügen können (es können mehrere vorhanden sein). Klicken Sie auf "Gerät registrieren" und wählen Sie den OTAA-Modus. Ein Fenster wird angezeigt, in dem Sie die Kennung des Geräts eingeben müssen.


Diese Kennung erhalten Sie, indem Sie den Befehl sys get hweui an das Modem senden. Diese Registrierung wird wie versprochen kostenlos und ohne SMS durchgeführt.

Durch Öffnen der Geräteparameter können Sie alle Tasten sehen, die im Programm registriert sein müssen.



Um den Code zu vereinfachen, habe ich die Python-Loranode-Bibliothek verwendet . Der Quellcode zum Senden von Daten ist unten angegeben. Wie Sie sehen können, enthält der Code 3 Zeilen appkey, appeui und deveui, die zur Authentifizierung verwendet werden.

Quellcode
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)


In diesem Beispiel werden Pakete mit der aktuellen Zeit (hhmm) an den Server gesendet. Dies ist praktisch, um zu steuern, welches Paket empfangen wurde.

2. Geräteregistrierung - ABP


Hier ist alles einfacher - wir registrieren das Gerät als ABP und erhalten mehrere Schlüssel, die im Programm registriert werden müssen.



Das Modem sendet Daten "wie sie sind", es gibt keine Garantie dafür, dass die Authentifizierung erfolgreich war, nein.

Um Daten zu senden, müssen Sie die Schlüssel nwkskey, appskey, devaddr in den Code einfügen. Der Quellcode ist unten angegeben.

Quellcode
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


Testen


Im letzten Schritt bleibt eine Sache - einen Laptop (oder Arduino oder Raspberry Pi) mit einem Modem mitzunehmen und zu dem Ort zu gehen (gehen, fliegen), an dem sich der Versorgungsbereich des nächsten Gateways befindet. Ich bin mit der Straßenbahn etwa eine halbe Stunde lang zum nächstgelegenen Versorgungsgebiet gekommen, daher ist der Vorgang nicht so lang und teuer.

Bei erfolgreichem Datenempfang werden Pakete auf dem Server angezeigt.



Der Server selbst macht nichts mit den Daten. Sie können Ihren eigenen Code auf dem Server konfigurieren, um die empfangenen Daten zu verarbeiten. Dieses Beispiel ist nur ein Test, es wird nichts mit den Daten gemacht, in einer realen Anwendung können sie der Datenbank hinzugefügt werden, Benachrichtigungen senden usw., alles hängt von der Aufgabe ab.

Warum ist das notwendig?


Im Idealfall bietet das LoRaWAN-Netzwerk dem Benutzer einen sofort einsatzbereiten Datenübertragungsdienst. Sie müssen lediglich das Gerät anschließen, und die Daten werden vom nächsten Hub gesendet und verarbeitet (natürlich, wenn sich der Benutzer im Bereich der Netzwerkabdeckung befindet). Der Anwendungsbereich ist sehr umfangreich, von Sensoren zum Öffnen der Tür, der Temperatur oder des Wasserstandes im Land bis hin zu einem GPS-Leuchtfeuer an einem Tier oder Modell eines Flugzeugs.

Mehrere Videos (auf Englisch).

LoRa Alliance Einführung:



The Things Network Einführung:


Wenn wir jedoch über The Things Network sprechen, handelt es sich um einen "Amateur" -Dienst, der natürlich keine dauerhafte Verbindung garantiert. Ob es kommerzielle Anbieter LoRaWAN gibt, weiß ich noch nicht.

Was ist, wenn keine Abdeckung besteht?


Es kann sich eine vernünftige Frage stellen: Was tun, wenn ein paar Tage mit dem Zug oder ein paar Stunden mit dem Flugzeug zum nächsten Gateway fahren? Dies hat sein eigenes Plus - Sie können der Erste sein. Sie können Ihr eigenes Gateway erstellen und es auf dem The Things Network-Server registrieren. Der Preis des Problems hängt von der Funktionalität ab - von> 1000 EUR für „proprietäre“ Mehrkanal-Hubs bis zu 15 US-Dollar für hausgemachte Geräte auf Basis von SX1276 und Raspberry Pi. Es gibt eine Vergleichstabelle mit verschiedenen Routern. Wer dies wünscht, kann sie genauer untersuchen.

Die letzte Option wird im nächsten Teil behandelt.

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


All Articles