Mon point de départ a été ce billet du blog Runtime Projects, qui présente une modification de l'exemple WiFiClient.ino (disponible dans l'IDE Arduino lorsque l'ESP8266 y a été installé) pour récupérer le flux RSS de l'agence Reuters.
Lors de mes tentatives d'utiliser ce sketch pour récupérer d'autres flux RSS, j'ai pu constater une certaine diversité dans le monde des serveurs RSS. Par exemple, plusieurs d'entre eux exigent une connexion sécurisée sur le port 443, alors que d'autres prévoient une connexion non sécurisée sur le port 80. Certains flux de données comportent des sauts de lignes, alors que d'autres n'en comportent pas. Dans la plupart des cas, un titre est identifié par la balise title ; mais dans certains cas (plus rares), ce sera plutôt la balise title type="text".
J'ai donc tenté d'écrire un sketch relativement universel qui procédera de façon légèrement différente selon le serveur RSS qu'on désire interroger.
Au début du skech, nous fournissons des informations concernant le flux RSS à consulter. Par défaut, mon sketch utilise le fil de nouvelles de Radio-Canada, en français. Nous souhaitons extraire uniquement les grands titres, qui sont encadrés par la balise "title", sans conserver les résumés plus détaillés, les images, les liens, etc. De plus, puisque ce serveur exige que la connexion soit sécurisée, nous avons ajouté une instruction pour le préprocesseur: "#define SECURISE" (cette instruction servira plus loin dans le programme).
Un mot sur la variable fingerprint: sa valeur est différente d'un site à l'autre et, malheureusement, il faut parfois la mettre à jour au bout de quelques semaines.
Pour trouver sa valeur, vous entrez l'adresse du flux rss sécurisé dans un navigateur web et vous cliquez sur l'icône en forme de cadenas qui indique qu'il s'agit d'une connexion sécurisée...
... puis vous cliquez sur "Certificat". Parmi les informations fournies, vous localisez l'empreinte SHA-1, et vous recopiez son contenu dans la variable fingerprint du sketch.
Avant d'aller plus loin dans le sketch, jetons immédiatement un oeil sur les caractéristiques d'un serveur RSS radicalement différent: le flux RSS du blog "Électronique en Amateur".
Contrairement au serveur précédent, celui-ci n'exige pas de connexion sécurisée. De plus, il retourne un flux qui comporte des fins de ligne, ce qui nous permettra d'analyser les données ligne par ligne (d'où l'instruction de préprocesseur: #define FIN_DE_LIGNE). Pour compliquer les choses encore davantage, les titres sont annoncés par la balise title type="text" plutôt que simplement title. Notez que lorsque nous utilisons la possibilité de lire l'information ligne par ligne, nous devons également fournir la balise de fermeture (dans la constante baliseFin).
Au lignes 58 à 65, vous pouvez constater ce qui différencie la connexion à un serveur qui est sécurisé et un serveur qui ne l'est pas:
Les lignes 91 à 108 concernent uniquement un flux qui comporte des indications de fin de ligne (et qui a été déclaré comme tel avec la mention "#define FIN_DE_LIGNE"). Nous lisons l'information une ligne à la fois, grâce à l'instruction "ligne = client.readStringUntil('\r');".
Le reste consiste à détecter la présence de la balise "title" au moyen de la fonction "indexOf()" qui retourne sa position dans la chaîne de caractères (ou -1 si elle ne si trouve pas). S'il s'agit bien d'un titre, nous affichons dans le moniteur série la partie de la chaîne de caractères qui se trouve entre les deux balises.
J'ai préféré utiliser une stratégie différente, qui se trouve aux lignes 110 à 117. L'information est lue jusqu'au symbole "<" qui indique le début d'une balise. On vérifie ensuite si notre chaîne de caractères contient bien la balise title et, si c'est le cas, on affiche dans le moniteur série la portion de texte qui se trouve après cette balise.
La capture d'écran ci-dessous montre le résultat lorsqu'on consulte le flux RSS de mon blog...
La suite logique de ce projet consistera probablement à présenter cette information sur un afficheur plutôt que dans le moniteur série.
Yves Pelletier (Twitter, Facebook)
Aucun commentaire:
Enregistrer un commentaire