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

../_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 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))