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
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) :
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.
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)