Commande : envoi d’un message descendant vers un dispositif¶
À l’issue de ce tutoriel, vous serez capables de:
- envoyer un message depuis l’extérieur du Réseau IoT Expérimental de l’Eurométropole de Strasbourg vers un dispositif connecté au réseau
- recevoir un message descendant sur un dispositif
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 le message¶
L’envoi d’un message vers un dispositif se fait par une API REST. Il est nécessaire de récupérer l’identifiant REST du dispositif, soit dans l’interface Wavebricks soit par une requête REST :
GET /api/v1/devices/find?dev_eui=5F4170704555495F HTTP/1.1
Host: api.wavebricks.com
HTTP/1.1 200 OK
Content-Type: application/json
{"id":"TU9OX0VVSV8="}
On envoie le contenu du message dans un objet JSON :
POST /api/v1/devices/TU9OX0VVSV8/messages HTTP/1.1
Host: api.wavebricks.com
Content-Type: application/json
{"format":"raw", "paylaod":1}
HTTP/1.1 200 OK
Recevoir le message¶
Pour pouvoir recevoir le message descendant, on demande au dispositif d’être en permanence à l’écoute :
lora = LoRa(mode=LoRa.LORAWAN, power_mode=LoRa.ALWAYS_ON)
Attention, cette écoute permanente est pertinente pour un objet connecté à une source d’énergie (cf. Choisir entre économie d’énergie et disponibilité).
Pour éviter de devoir décider nous-même du délai à attendre, on rend la socket bloquante (ainsi la méthode recv
ne retourne qu’une fois les données reçues) :
out.setblocking(True)
On peut alors lire les données reçues :
print(out.recv(1))
Code complet¶
from network import LoRa
import socket
import struct
import binascii
# use the LoRaWAN stack, always listening
lora = LoRa(mode=LoRa.LORAWAN, power_mode=LoRa.ALWAYS_ON)
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)
out.setblocking(True)
# receive 1 byte
print(out.recv(1))