Suite numérique: envoyer une série de messages

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

  • envoyer une série de messages espacés dans le temps

Ce tutoriel présuppose que vous avez déjà suivi le tutoriel “Hello world!” : Se connecter au réseau LoRaWAN et envoyer son premier message.

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

Envoyer une suite numérique

Nous allons envoyer successivement les 14 premiers nombres d’une suite célèbre, la suite de Fibonacci. Ils ont l’avantage d’être tous inférieurs à 256 et donc de tenir en un seul octet.

décimal binaire
0 0000 0000
1 0000 0001
2 0000 0010
144 1001 0000
233 1110 1001
fibonacci = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]

Envoi de plusieurs messages

L’important, quand on envoie plusieurs messages, est de prévoir à l’avance de respecter le duty cycle.

Ici, nous avons décidé d’utiliser le data rate n°5, c’est-à-dire un spreading factor de 7. Comme nous allons envoyer des nombres qui occupent 1 octet chacun et que la trame LoRaWAN occupe 13 octets, nous pouvons calculer quel est le temps minimum que nous devons attendre entre deux messages, par exemple avec le tableur LoRa duty cycle & fair use calculator.

Celui-ci nous indique un temps de 4,6 secondes, nous allons donc émettre toutes les 10 secondes et nous serons certains de ne jamais dépasser notre duty cycle.

index = 0
while index < len(fibonacci):
    num = fibonacci[index]
    print("num={} ({}b)".format(num,  out.send(bytes([num]))))
    index = index + 1
    time.sleep(10)

Consultation des messages

Sur l’interface Wavebricks, je peux alors voir apparaître un nouveau message toutes les 10 secondes dans le journal de messages du dispositif.

../_images/suite-highlighted.png

Code complet

from network import LoRa
import socket
import time
import struct
import binascii

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

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

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


fibonacci = [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233]

index = 0
while index < len(fibonacci):
    num = fibonacci[index]
    print("num={} ({}b)".format(num,  out.send(bytes([num]))))
    index = index + 1
    time.sleep(10)