Dans un article récent, je vous ai présenté la carte breakout SigFox de SNOC. La récupération des données transmises se faisait en callback. Ici je vais vous expliquer comment récupérer vos données avec l’API SigFox.
[stextbox id= »warning » caption= »Attention VPS temporaire »]Le serveur VPS (Virtual Private Server) framboise314 hébergé par web4all est utilisé pour différentes expérimentations. Il est possible que d’ici quelque temps les pages citées dans cet article ne soient plus accessibles.[/stextbox]
Au sommaire :
Afficher les données envoyées par un Raspberry Pi avec l’API SigFox
Rappel du fonctionnement en callback
Lorsqu’on utilise le callback, le Raspberry Pi envoie un message à la carte SigFox. La carte transmet les 12 octets maxi) par radio au réseau SigFox. A réception du message le serveur SigFox transfère instantanément chaque paquet de données vers un serveur désigné par l’utilisateur. Il fait un appel à une page web et en lui passant ces informations en GET ou en POST…
C’est ce qu’on appelle un « callback » car le serveur SigFox appelle « en retour » le serveur VPS qu’on lui a désigné ici. Si vous êtes intéressé(e) par cette technique, reportez vous à l’article précédent.
Principe de fonctionnement avec l’API SigFox
Ici le fonctionnement est un peu différent comme nous allons le voir :
- Le Raspberry Pi envoie les données à la carte breakout SigFox qui les transmet par radio à l’antenne SigFox la plus proche. Les différents messages sont envoyés selon la programmation de l’utilisateur (maxi 140 messages par jour soit environ un toutes les 10 minutes). Ils sont stockés sur le serveur SigFox et peuvent être consultés en ligne sur ce serveur :
- A un moment quelconque, un utilisateur souhaite afficher dans son navigateur les données envoyées par le Raspberry Pi. Il se connecte sur la page web du serveur VPS framboise314 (http://vps.goblink.fr/testapi.php). Cette page web PHP contient un appel à l’API SigFox.
- L’appel au serveur SigFox est envoyé, avec les identifiants (login/password) de l’utilisateur.
- Le Serveur Sigfox construit un bloc json (Javascript Object Notation) contenant les messages reçus par le serveur et stockés chez SigFox. Le message est renvoyé vers le VPS framboise314.
- La page web testapi.php reçoit le bloc de données au format json. Le programme PHP décode les informations contenues dans le bloc de données, et les affiche sous forme d’un tableau qui est renvoyé vers le navigateur du poste de l’utilisateur.
Maintenant que nous avons vu le principe d’utilisation de l’API SigFox, je vous propose de détailler sa mise en œuvre.
L’API SigFox
Création d’un compte d’API
Pour utiliser l’API (Application Programming Interface) SigFox, il faut disposer d’un compte. La première opération consiste donc à obtenir les identifiants pour cette API.
Sur votre page SigFox, rendez vous dans l’onglet USER. Votre utilisateur SigFox s’affiche. Cliquez à l’extrémité droite de la ligne sur le groupe (ici François MOCQ EVK).
Vous arrivez sur la page de votre groupe sur laquelle figurent des informations relatives à votre abonnement. Dans le menu apparu dans la colonne gauche de la page, cliquez sur API ACCESS.
Vous arrivez sur la page d’accès à l’API. La première fois cette page est vide. Cliquez en haut à droite sur le bouton New.
Donnez un nom à l’accès API (j’ai choisi… feamboise314 🙂 La timezone doit être correcte Déplacez dans la partie droite des fenêtres Custom roles les rôles que vous souhaitez attribuer. Puis cliquez sur le bouton Ok sous la fenêtre.
Votre accès à l’API est créé. Vos identifiants sont affichés. Sauvegardez les précieusement.
Remarquez à la fin de la première ligne un lien vers API documentation. Ça ne fait pas de mal d’aller s’y balader un peu 😉
Maintenant que nous avons les clés pour discuter avec le serveur de SigFox, je vous propose de regarder comment on va s’adresser à lui.
Un premier test
Maintenant qu’on a les identifiants on va essayer de se connecter sur le site de SigFox à cette adresse : https://backend.sigfox.com/api/devices/VOTRE_MODULE/messages
Vous remplacerez VOTRE_MODULE par le numéro de votre propre module SigFox.
Lorsque vous arrivez sur la page une fenêtre s’ouvre et vous devez saisir les login/mot de passe à rallonge que vous avez obtenu auparavant.
En retour vous obtenez les relevés des messages de votre module SigFox.
C’est dans ce format json que vous allez recevoir les informations venant du site SigFox. Heureusement, on dispose des outils nécessaires dans PHP pour traiter ces informations 🙂
La page à afficher
Le cahier des charges
Je souhaite afficher les informations contenues dans les messages SigFox sur une page web. Celle-ci contiendra un logo de framboise314 (bin oui 😉 ) puis un tableau listera les différents messages qui étaient stockés sur le serveur SigFox.
Je précise que je ne suis pas un développeur web, et que j’ai développé la page web avec mes connaissances en PHP et CSS. On peut (certainement) faire mieux. Vous avez le point de départ, si vous voulez stocker les infos dans une base de données, tracer de jolies courbes… Libre à vous ! Pour ma part je m’arrête là 😀
La page web PHP
Le programme utilise CURL pour accéder au serveur SigFox. Ensuite le bloc json récupéré est « détricoté » et une boucle balaye chaque message et l’affiche dans un tableau.
L’éditeur de WordPress est un garnement qui enlève subrepticement des espaces utilisés pour l’indentation ou remplace en douce des signes comme > par >
Après avoir galéré un moment pour essayer de le dompter, j’ai choisi de vous proposer le programme sous forme d’image. Il suffit de cliquer sur l’image pour télécharger le programme.
[stextbox id= »alert » caption= »Avertissement : »]Un bon conseil de Joël @joelvim sur twitter : Ne mettez pas les login/mot de passe dans le programme. Je rappelle que ces progs sont simplement des démos de faisabilité et pas des exemples 😉
Autre conseil de Joël : Utiliser les callbacks pour récupérer les msg, et l’API en backup quand le serveur n’a pas pu tous les récupérer (en cas d’arrêt par ex.) [/stextbox]
François, arrange un peu ta cravate…
Pour que la page reçue soit un peu plus jolie j’ai ajouté une pincée de CSS. Vous verrez le lien qui charge style.css en haut de la page PHP. Mettez ce fichier CSS dans le même dossier sur votre page PHP.
table { margin: auto; border-width:1px; border-style:solid; border-color:black; border-collapse:collapse } td { border-width:1px; border-style:solid; border-color:blue; padding: 5px; vertical-align:middle; width:20%; } th { color: grey; background-color: bisque; align: center; } tr:nth-child(odd) /*Toutes les lignes impaires : la 1e, la 3e, la 5e, etc.*/ { background-color: white; } tr:nth-child(even) /*Toutes les lignes paires : la 2e, la 4e, la 6e, etc.*/ { background-color: linen; }
Ce fichier CSS enjolivera un peu le tableau, en le centrant et en ajoutant un peu de couleur.
Envoi d’un message SigFox
Pour les tests j’ai envoyé deux messages à partir de putty sur le Raspberry Pi. On retrouve ces deux messages en haut du tableau (ci dessous).
La page web affichant les messages
Les lignes qui affichent 6 chiffres contiennent :
- La température de la carte SigFox (en dixièmes de degré) sur 3 chiffres
- La température du SoC du Raspberry Pi (en dixièmes de degré) sur 3 chiffres
Exemple : 291515 signifie 29.1 °C pour la carte SigFox et 51.5°C pour le Soc
Les lignes qui contiennent 14 chiffres contiennent :
- La température de la carte SigFox (en dixièmes de degré) sur 3 chiffres
- La température du SoC du Raspberry Pi (en dixièmes de degré) sur 3 chiffres
- La tension d’alimentation de la carte SigFox lors de l’émission (en centième de volt) sur 4 chiffres
- La tension d’alimentation de la carte SigFox lors de l’émission précédente (en centième de volt) sur 4 chiffres
Exemple : 27848332303205 signifie 27.8 °C pour la carte SigFox et 48.3°C pour le Soc. Les tensions d’alimentation sont : 3.23v et 3.205v.
Vous pouvez télécharger le programme qui envoie ces informations toutes les 15 minutes depuis le Raspberry Pi. Il est dérivé du programme de SNOC (sur github) et fourni sans garantie 😉
Une meilleure qualité de liaison
Les plus observateurs d’entre vous auront remarqué que la qualité de liaison est moyenne, sauf sur les deux lignes en haut du tableau (les plus récentes).
Les tests de la carte étaient faits sur un bureau, l’antenne posée à plat, loin d’une fenêtre.
Pour les derniers tests j’ai tout simplement dégagé l’antenne du matériel présent sur le bureau (un sacré bazar 😉 )
Le plus simple était de la fixer avec un morceau de ruban adhésif sur la vitre d’une fenêtre. Ceci assure un meilleur rayonnement des ondes radio et fournit une sérieuse amélioration du SNR (signal-to-noise ratio = rapport signal sur bruit).
On voit que le rapport signal sur bruit a augmenté de plus de 20 dB, ce qui représente (à la louche) une amélioration de… 100 fois !
Conclusion
Après l’utilisation du callback dans le premier article, cette suite vous permettra d’accéder à vos données d’une autre façon, en utilisant l’API SigFox.
L’utilisation qui en est faite ici est basique, avec un affichage dans un tableau. A vous de jouer pour faire de jolis graphiques, afficher des jauges etc… N’hésitez pas à mettre un lien dans les commentaires pour faire admirer vos réalisations (et peut-être donner des idées à d’autres ?).
Merci pour cette série d’article sur les technologies liées à SIGFOX.
Est-il possible d’avoir une vision sur le code coté Raspberry ?
Merci
Bonjour
ça se prépare
je rajoute le prog dans un moment…
j ‘ai continué a rajouter des infos… (la tension mesurée)
cordialement
François
ps : c’est fait !
Merci pour cette réactivité !
Et encore bravo pour le travail de rédaction.
Sigfox permet-il se recevoir aussi des informations basiques (du VPS vers raspberry) ?
bonjour
oui tout à fait
c’est un callback avec une réponse.
j’ai comme projet de piloter la luminosité d’une LED via SigFox (faut bien commencer par quelque chose 😉 )
Mais j’avance petit à petit… je découvre en même temps
cordialement
François
Bonjour,
Très didactique ! Merci !
Vous utilisez une boucle qui permet de lister l’intégralité des messages de l’IOT.
Quelle boucle utiliser si je souhaite afficher uniquement les 10 derniers résultats ?
Merci
Adèle
Bonjour Adèle
le programme affiche directement les infos reçues.
Vous pourriez ranger ces infos dans un tampon et n’afficher que les 10 premières lignes
cordialement
François
Bonjour François,
Merci pour cette réponse, je ne suis pas très avancée en programmation php, auriez-vous un petit bout de code à me proposer pour m’aider ?
Par avance merci François.
Adèle
Bonjour Adèle
voyez par ex https://stackoverflow.com/questions/3045619/how-to-store-values-from-foreach-loop-into-an-array
pour envoyer le résultat de la boucle dans un tableau
reste plus qu’à afficher les n premières lignes du tableau…
comme ici https://stackoverflow.com/questions/11927260/printing-contents-of-array-on-separate-lines si vous ne voulez pas faire de boucle…
cordialement
François
Merci François pour votre aide précieuse !
Adèle
Bonjour François,
Très bon tutoriel. Merci !
J’arrive à me connecter manuellement à l’API (https://backend.sigfox.com/api/devices/…) avec mes accès perso. Je vois donc le JSON des messages envoyés par mon appareil.
Par contre, impossible de les récupérer via php. Ma variable « $data » est vide (ce qui pose d’ailleurs un problème dans le parcours de la boucle).
Pourtant je suis sur que les variables $ulr, $password et $user sont correctes…
A quoi pensez-vous que cela peut être dû ?
Merci d’avance et excellente journée,
François
Bonjour
difficile à dire à distance
Le code fonctionnait quand j ai écrit l article
Il y a peut être eu des modifs
Essayez d avancer pas par pas en imprimant les infos pour pouvoir déterminer
Cordialement
Francois
Mettre ce code pour la partie CURL:
$user = « utilsateur: mot de passe »;
$url = »https://backend.sigfox.com/api/devices/xxxxxxx/messages »;
$timeout = 10;
$ch = curl_init();
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
if (preg_match(‘
^https://
i’, $url)){
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
}
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// Définition de la méthode d’authentification du serveur
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_USERPWD, $user);
$result=curl_exec($ch);
curl_close($ch);
$data = (json_decode($result, true));
merci 🙂
Bonjour à tous,
En premier lieu je tiens à vous remercier pour le tuto qui m’a jusque là été très utile.
En suite j’ai une petit demande d’aide, dans le cadre d’un projet je souhaiterai envoyer les datas transmises par un arduino+sigfox vers une db firebase via je suppose un callback. Et c’est là que ça coince car malgré plusieurs essais je n’y arrive pas.
Auriez-vous déjà tenté cette opération et si oui pourriez-vous me transmettre les configuration des différentes étapes.
D’avance merci.
Jérôme
Bonjour,
Merci pour ce tuto qui est très utile pour le débutant que je suis dans ce domaine.
Le script PHP ne retourne aucun résultat en ce qui me concerne.
Je l’ai bien paramétré, l’URL retourne bien les données mais le CURL_init ne retourne que Ressource id#2
Aucune data n’est décodé.
Auriez vous une idée de la cause ?
Merci
Pascal
Hello,
En complement, pour utiliser l’API de sigfox un peu plus simplement lors de la prise en main, il existe une version swagger doc accessible ici : https://sigfox-api.ingeniousthings.fr
Le code source est disponible sur github en GPLv3