Atelier 3 : Envoyer et Recevoir de la Data depuis et vers Sigfox

Posté le 15/06/2016

Nous avons maintenant réalisé un objet communicant via la carte Raspberry et le module Sigfox . Cependant, notre réseau de communication cellulaire Sigfox possède ses propres contraintes : la charge utile (payload) des messages est limitée à 12 octets, en montant, et 8 en descendant. Il est difficile de faire passer par ce canal autant d’informations que nous le souhaiterions.

L'alternative est la compression afin de présenter un maximum de données en un minimum d’octets.

Configuration de Code à envoyer vers le Cloud

Il est possible d'obtenir des float pour nos variables environnementales. Nous limiterons leur précision, pour respecter les contraintes de taille de message.

Pour cela, nous allons utiliser une structure de type union en stockant 2 variables de différents types  (float et tableau de byte) sur la même adresse mémoire. Il sera ainsi plus simple de coder la température sur une taille de 4 octets. Pour l’humidité, étant donné qu’il s’agit d’un pourcentage, la limite sera d'un octet.

N'utilisant que 5 octets, l'espace est encore disponible pour ajouter des capteurs.

// Sigfox
uint8_t dataSigfox[12];
uint8_t size;
union
{
  uint8_t  value1[4];
  float    value2;
}t_union;

uint8_t status;
 
float h = dht.TemperatureHumidityRead(dhtPin, 'H'); 
float t = dht.TemperatureHumidityRead(dhtPin, 'T'); 

printf("***  Measures   ***\n"); 
printf("Humidity : %f\n", h); 
printf("Temperature : %f\n", t); 
printf("Send to Sigfox\n");

// fill data array
t_union.value2 = t; 
dataSigfox[0] = t_union.value1[3];
dataSigfox[1] = t_union.value1[2];
dataSigfox[2] = t_union.value1[1];
dataSigfox[3] = t_union.value1[0];
 
dataSigfox[4] = (uint8_t) h;
size = 5;

// Final Frame to send in "data"
printf("Final Frame to send: 0x%X\n", dataSigfox);
 
// Sending packet to Sigfox
status = Sigfox.send(dataSigfox,size);

La méthode Sigfox.send permet d'envoyer ces octets à Sigfox.

Pour lancer un envoi simple en UPLINK vers Sigfox, il suffit de deux lignes :

pi@raspberrypi:~/sigfox $ make TARGET=06-send-sigfox-uplink
pi@raspberrypi:~/sigfox $ sudo ./06-send-sigfox-uplink
***  Switch Sigfox ON   ***
***  Measures   ***
Humidify : 75 %
Temperature : 22°C
*** Sending data to Sigfox ***
*** Sigfox packet sent ***

Le traitement de l’information côté Sigfox

Le backend Sigfox n'est qu’une étape, au fur et à mesure les valeurs reçues devront être routées dans Sigfox vers leur destination finale. Mockbin sera une première étape avant de se lancer dans un backend plus compliqué.

Mockbin est l'outil parfait pour simuler un backend REST. Sa fonctionnalité apparaît dans le décodage des octets envoyés à Sigfox pour faire apparaitre nos données « en clair ».

Première étape, créez le callback dans le backend Sigfox.

callbacks1

Cliquez sur Kit Libellium le nom de votre module, cette interface apparaîtra :

callbacks2

Le callback est de type DATA, BIDIR (soit une communication bidirectionnelle).

Nous allons traiter une charge utile de type custom. Ce champ aidera à décoder notre tableau d’octets. Nous allons coder la température, comme déjà mentionné, sur 4 octets (32 bits) et l'humidité sur 1 octet (8bits). La documentation est relativement claire et notre charge utile est donc du type temperature::float:32 humidity::uint:8

Callback3

En laissant cet onglet ouvert, passons maintenant côté Mockbin, pour créer une terminaison à notre callback. Dans un premier temps, un simple backend REST suffira.

Mock-Callback

La terminaison REST est prête. L'adresse doit être entrée dans le callback. En connaissance des règles et normes du web, la requête HTTP POST sera utilisée pour pousser les données. Le corps de la requête sera composé d’un mélange de données issues de Sigfox (device, station, rssi,... )  et de données issues de la charge utile Custom (température, humidité). Dans le corps de notre JSON, les variables Sigfox sont à mettre entre { }. Il est aussi possible d’utiliser ces variables dans les URLs et donc de les construire selon une véritable grammaire REST.

Callback4

Le moment est venu de poster le premier vrai message de données à Sigfox.

Démarrez votre Pi et lancez le programme ad-hoc. Vous devriez, dans l’ordre, constater dans votre terminal RPi que le message a bien été envoyé, puis voir apparaitre le message et son indicateur Callback au vert dans Sigfox, et enfin voir vos données en clair dans Mockbin !

Messages

Mock

Les données en DOWNLINK

L'inconvénient de Mockbin est qu'il n’est pas possible d’éditer une terminaison Mockbin existante. Nous allons donc en recréer une à chaque usage applicatif bidirectionnel.

Côté Sigfox, nous allons créer notre callback BIDIRectionnel, et activer le downlink sur l’écran principal. A noter qu'il est maintenant possible d'utiliser le flag {ack} dans la charge utile, mais également que si une réponse est renvoyée en ne respectant pas ce format, ou ayant moins de 8 octets, Sigfox vous laissera le message suivant : INVALID PAYLOAD.

Si tout a été correctement effectué, 2 flèches vertes devraient apparaître.

Down 1

Dernière étape, le code sur le Raspberry Pi. Peu de changement sont à prévoir au niveau de l’envoi des données. Seule la méthode d’envoi Sigfox.send doit être remplacée par Sigfox.sendACKqui attend une réponse du portail Sigfox avant de déconnecter le modem. Dans le cadre d’un échange bidirectionnel Sigfox, cette réponse peut être mettre une trentaine de secondes à venir.

Dans l'hypothèse où les bibliothèques Cooking Hacks sont utilisées telles quelles, le modem reçoit une réponse, mais il n'est pas possible d'en exploiter le contenu.

Pour tester directement le programme :

pi@raspberrypi:~/sigfox $ make TARGET=07-send-sigfox-bidir
pi@raspberrypi:~/sigfox $ sudo ./07-send-sigfox-bidir
***  Switch Sigfox ON   ***
***  Measures   ***
Humidity : 75 %
Temperature : 22°C
*** Sending data to Sigfox ***
*** Sigfox packet sent ***
*** Sigfox downlink packet received ***

Conclusion

Un objet complet et communicant et construit (en Sigfox), capable de mesurer son environnement (via ses capteurs) et d'envoyer et recevoir des messages en temps réel.

La prochaine étape sera d'étudier la plate-forme Cloud AWS, dans le prochain atelier ...