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.
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 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.
Cliquez sur Kit Libellium le nom de votre module, cette interface apparaîtra :
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
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.
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.
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 !
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.
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.sendACK, qui 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 ***
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 ...