“Hello world!” : Se connecter au réseau LoRaWAN et envoyer son premier message

À l’issue de ce tutoriel, vous serez capables de:

  • vous connecter à un réseau LoRaWAN en ABP ou OTAA
  • envoyer un message binaire
  • consulter les derniers messages envoyés par votre dispositif

Matériel

Ce tutoriel est réalisé avec un LoPy commercialisé par Pycom

../_images/photo-lopy.png

Le code du tutoriel peut être directement chargé et exécuté sur le LoPy à l’aide du plugin Pymakr disponible pour plusieurs éditeurs Python (dont Atom) :

../_images/atom-pymakr-highlighted.png

Se connecter au réseau

La connexion au réseau peut se faire de deux manières : soit ABP soit OTAA.

ABP (activation by personalization)

Pour configurer mon dispositif en ABP, je vais dans l’interface Wavebricks et je déclenche l’enregistrement d’un nouveau dispositif. Je reçois alors trois éléments :

  • l’adresse de dispositif (device address, qu’on abrège généralement en DevAddr),
  • la clef de session de réseau (network session key, NetSKey),
  • la clef de session d’application (application session key, AppSKey).

Dans le code de mon dispositif, j’insère une activation by personalization (ABP) qui emploit DevAddr, NetSKey et AppSKey :

DevAddr = struct.unpack(">l", binascii.unhexlify('680b286b'))[0]
AppSKey = binascii.unhexlify('5f578d3ef40805ac45b345edefe5aef1')
NetSKey = binascii.unhexlify('198a9e1defe60804310b93067ae7b50c')

# join by ABP
lora.join(activation=LoRa.ABP, auth=(DevAddr, NetSKey, AppSKey))

OTAA (over the air activation)

Pour configurer mon dispositif en OTAA, je vais dans l’interface Wavebricks et je déclenche la préparation d’une OTAA. Je renseigne :

  • l’identifiant unique d’application (application Extended Unique Identifier, AppEUI),
  • la clef d’application de l’appareil (application key, AppKey).
../_images/otaa-highlighted.png

Dans le code de mon dispositif, j’insère une over the air activation (OTAA) qui emploit AppEUI et AppKey :

app_eui = binascii.unhexlify('5F4170704555495F')
app_key = binascii.unhexlify('5F4170706C69636174696F6E4B65795F')

# join by OTAA
print("Ask OTAA")
lora.join(activation=LoRa.OTAA, auth=(app_eui, app_key), timeout=0)

# wait for network to accept OTAA
for wait_time in [2,4,6,8,10]:
    if not lora.has_joined():
        time.sleep(2)
        print("Waited {}s".format(wait_time))
    else:
        break

Émettre un message binaire

Pour pouvoir émettre, comme pour d’autres protocole réseau, on crée une socket (litt., une prise) LoRa en mode écriture brute (raw) et on configure un taux de donnée, le data rate (DR), qui est un numéro qui désigne une série de paramètres par défaut.

Ici, on utilise le n°5, qui correspond à un spreading factor de 7, une bande passante de 125 kHz et un débit de 5470 bit/s.

out = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
out.setsockopt(socket.SOL_LORA, socket.SO_DR, 5)

Une fois la socket prête, il suffit d’envoyer les données dessus.

Consulter les messages

Une fois le message envoyé, on peut se rendre sur l’interface Wavebricks et consulter le contenu du dernier message envoyé.

../_images/screenshot-1xhello.png

Si on relance plusieurs le dispositif, les messages successifs s’ajouteront au journal de messages dans l’interface.

Code complet (OTAA)

from network import LoRa
import socket
import time
import binascii

# use the LoRaWAN stack
lora = LoRa(mode=LoRa.LORAWAN)

app_eui = binascii.unhexlify('5F4170704555495F')
app_key = binascii.unhexlify('5F4170706C69636174696F6E4B65795F')

# join by OTAA
print("Ask OTAA")
lora.join(activation=LoRa.OTAA, auth=(app_eui, app_key), timeout=0)

# wait for network to accept OTAA
for wait_time in [2,4,6,8,10]:
    if not lora.has_joined():
        time.sleep(2)
        print("Waited {}s".format(wait_time))
    else:
        break

while not lora.has_joined():
    time.sleep(1)

if lora.has_joined():
    # socket setup
    out = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
    out.setsockopt(socket.SOL_LORA, socket.SO_DR, 5)

    # send your first data!
    print(out.send("Hello world!")) # log how many bytes are sent
else:
    print("Could not join by OTAA")

Code complet (ABP)

from network import LoRa
import socket
import struct
import binascii

# use the LoRaWAN stack
lora = LoRa(mode=LoRa.LORAWAN)

DevAddr = struct.unpack(">l", binascii.unhexlify('680b286b'))[0]
AppSKey = binascii.unhexlify('5f578d3ef40805ac45b345edefe5aef1')
NetSKey = binascii.unhexlify('198a9e1defe60804310b93067ae7b50c')

# join by ABP
lora.join(activation=LoRa.ABP, auth=(DevAddr, NetSKey, AppSKey))


# socket setup
out = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
out.setsockopt(socket.SOL_LORA, socket.SO_DR, 5)

# send some data
print(out.send("Hello world!")) # log how many bytes are sent