Raspberry PI Tutorial

Solutions IoT personnalisées – Créer un système de publication HTTP

Par Thomas, le 13 novembre 2020
Solutions IoT personnalisées - Créer un système de publication HTTP

Auparavant, nous avons examiné HTTP vs MQTT pour les appareils IoT et sommes arrivés à la conclusion que MQTT est la meilleure méthode pour notre application Internet des objets (IoT) personnalisée. Cependant, dans ce projet, nous aborderons d’abord un système HTTP POST simple pour présenter comment connecter un ESP32 à un site Web et soumettre des données à une page PHP qui agira en tant que récepteur pour les appareils IoT.

Solutions IoT personnalisées Partie 1 – Introduction à l’Internet des objets

Solutions IoT personnalisées, partie 2 – ESP32 vs ESP8266

Solutions IoT personnalisées, partie 3 – HTTP vs MQTT

Solutions IoT personnalisées, partie 4 – Créer un système de publication HTTP

IoT personnalisé, partie 5 – Comment faire des requêtes HTTP GET

Qu’est-ce que HTTP?

solutions iot personnalisées - créez un système de publication http qu'est-ce que http

Avant de pouvoir commencer à utiliser HTTP, nous devons d’abord savoir ce que c’est et comment cela fonctionne. HTTP est un acronyme qui signifie HyperText Transfer Protocol et est la principale méthode de communication qui anime presque tous les sites Web du monde entier. Si vous regardez le début de nombreuses URL de sites Web, vous verrez HTTP ou HTTPS, la version sécurisée de HTTP, au début. Le premier fait, et le plus important, de HTTP est que tout est envoyé sous forme de texte et non de binaire, ce qui signifie que toutes les données représentant des nombres sont converties sous forme de texte. Par exemple, un seul octet binaire peut représenter des nombres entre 0 et 255 mais si le nombre 255 (0xFF en hexadécimal) devait être envoyé, il nécessiterait un minimum de trois octets car il serait envoyé sous forme de trois caractères; 2, 5 et 5.

La meilleure façon de penser à la connexion physique entre un client et un serveur est comme s’il s’agissait d’un terminal série. Une connexion à un serveur HTTP est établie et à partir de là, le client peut envoyer un flux de texte. Le serveur lit ce texte, interprète les données, puis crée une réponse. La réponse elle-même est également du texte et celle-ci est renvoyée au client pour interprétation. Un navigateur interpréterait les données comme une page Web, mais dans notre cas, le client (qui est notre appareil IoT) interprétera les données comme une commande de réponse.

Structure HTTP

Comme ce projet concernera l’envoi de données d’un appareil IoT vers un site Web personnalisé, nous utiliserons la commande POST. Cette commande est utilisée par un périphérique client pour soumettre des données à un serveur, mais pour que la commande POST fonctionne correctement, nous devons également inclure des métadonnées supplémentaires qui aideront le serveur à comprendre ce que nous envoyons. Ces métadonnées comprendront le format des données que nous envoyons (dans ce cas, l’URL encodée), la longueur des données et la version de HTTP que nous utiliserons. Alors, à quoi ressemblera notre message d’en-tête et que fait chaque partie?

POST /page.php HTTP/1.0
Host: WEBSITE OR IP ADDRESS
Content-Type: application/x-www-form-urlencoded      
Content-Length: LENGTH_AS_NUMBER

DATA_TO_SEND

Première ligne – POST /page.php HTTP / 1.0

La première ligne du message comprend la commande POST qui indique au serveur que nous allons soumettre des données. Après la commande se trouve la page de ce serveur qui recevra nos données et dans ce cas, la page sera page.php. La dernière partie de cette ligne indique quelle version de HTTP est utilisée et, dans ce cas, nous utiliserons HTTP V1.0.

Deuxième ligne – Hôte: SITE WEB OU ADRESSE IP

La deuxième ligne indique l’hôte auquel nous essayons d’accéder et correspond au nom du site Web (avec le préfixe www) ou à l’adresse IP. Par exemple, si nous devions soumettre des données à Google, cette ligne pourrait être www.google.com ou l’adresse IP.

Troisième ligne – Type de contenu: application / x-www-form-urlencoded

La troisième ligne de l’en-tête indique au serveur quel type de données est envoyé. Il peut s’agir d’un large éventail de valeurs différentes, mais dans ce cas, nous envoyons toutes les données au format URL encodé. Bien que cela puisse sembler déroutant, cela signifie simplement que nous pouvons utiliser des commandes PHP sur la page en cours d’accès pour recevoir les données entrantes du périphérique IoT (cela sera clarifié plus tard).

Quatrième ligne – Longueur du contenu: LENGTH_AS_NUMBER

La quatrième ligne indique au serveur le nombre de caractères de long des données vers le serveur. Par exemple, si les données de notre appareil IoT étaient «Bonjour», la valeur de la longueur du contenu serait 5. Notez que ce nombre est dans formulaire de texte et non binaire. ce qui signifie que cette entrée est une chaîne.

Cinquième ligne – Ligne vide

Cette ligne est essentielle au message et doit être envoyée pour que le serveur lise correctement les données qui suivent. La ligne est vide MAIS comprend une paire de sauts de ligne de retour chariot (en hexadécimal, c’est 0x0D 0x0A) et est l’une des principales raisons pour lesquelles les valeurs binaires ne sont jamais envoyées via HTTP dans les messages en clair. Lorsque nous traitons cela en C sur l’ESP32, il suffit d’utiliser la fonction println () pour y parvenir.

Sixième ligne – Données

Cette ligne correspond aux données que nous envoyons au serveur sous forme de texte. La longueur de ce message DOIT correspondre à la valeur fournie par la ligne de longueur de contenu et la ligne de données ne se termine par aucun caractère spécial.

Message de réponse

Lorsque notre appareil IoT envoie des données à un serveur à l’aide de la commande POST, il recevra un message du serveur avant que le serveur ne ferme la connexion. Ce message contiendra des métadonnées sur le serveur, notamment l’heure actuelle, le type de serveur et la langue des données renvoyées. Mais pour notre appareil IoT, nous sommes principalement concernés par le code de réponse. Il existe de nombreux codes de réponse et la plupart des gens qui ont utilisé Internet les auront vus au moins une fois dans leur vie! Avez-vous déjà trouvé cette redoutable page 404? Ou que diriez-vous du code d’erreur 500? Ce sont des codes de réponse HTTP et indiquent si un message a été exécuté avec succès ou s’il y a eu un problème. Cet exemple ne regardera pas les données reçues et les ignorera simplement, mais peut être utile si vous créez une fonction qui doit gérer des situations d’erreur. Cet exemple examinera cependant la dernière section du message pour voir si le serveur a terminé son message et cela est indiqué par deux sauts de ligne de retour chariot.

Structure des messages

L’envoi de données vers une page PHP à l’aide de la commande POST nécessite qu’elle ait un format spécifique. Dans notre cas, nous utilisons le format d’encodage URL, ce qui signifie que nous envoyons à la page PHP une chaîne de texte comprenant les noms des variables et leurs valeurs. Dans cet exemple, nous enverrons une fausse lecture de température de 10 degrés et se fait en envoyant le texte suivant comme message:

temperature=10

Lorsqu’il est reçu par le code PHP, il créera un tableau POST spécial qui nous permettra d’accéder à la valeur de la température (cela sera examiné après le code client).

Code client

Maintenant que nous comprenons comment les données sont envoyées à un serveur HTTP et ce qu’il faut recevoir par la suite, il est temps de regarder le code qui sera exécuté sur notre ESP32 à l’aide de l’IDE Arduino.

#include <WiFi.h>

// Wi-Fi details here
const char* ssid     = "Bird-Net";
const char* password = "06426705";

// Website that we will connect to here
const char* host = "mycustomiotplatform.atwebpages.com";
const int httpPort = 80;

// Some variable declarations here
String message;
String serverMessage;
unsigned char tempBuffer[256];

// Setup function 
void setup()
{
  Serial.begin(115200);
  delay(10);

  // We start by connecting to a WiFi network
  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
}


// Main loop code
void loop()
{
  // Use WiFiClient class to create TCP connections
  WiFiClient client;

  // Prevent too many data sends!
  delay(2000);
  
  // Attempt to connect to the HTTP server
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }

  // Create a message to send to the server
  message = "temperature=10";

  // Now that we are connected, lets make the HTTP header message
  client.println("POST /page.php HTTP/1.0");
  client.println("Host: " + (String)host);
  client.println("Content-Type: application/x-www-form-urlencoded");
  client.println("Content-Length: " + (String)message.length());
  client.println();
  client.print(message);

  // Now wait for the response
  serverMessage = "";

  while (serverMessage.indexOf("rnrn") == -1)
  {
    
    // Clear the buffer and ensure it is full of zeros
    memset(tempBuffer, 0, sizeof(tempBuffer));
    
    // Read data into a tempoary buffer
    client.read(tempBuffer, sizeof(tempBuffer));
    
    // Transfer the contents of the buffer into our string 
    serverMessage += (char*)tempBuffer;
  }

  // Print the string to the console to show what we received
  Serial.println(serverMessage);
}

Code serveur

Le code côté serveur est une simple page PHP à laquelle accède le client et les données qui lui sont soumises. Avant de voir comment cela fonctionne, examinons d’abord ce code pour apprécier sa simplicité.

<?php
	// Extract data from the IoT device message
	$temperatureReading = $_POST["temperature"];
	
	// Get data the data was sent
	$time = date('m/d/Y h:i:s a', time());
	
	// Append the received data into a text file on the server
	file_put_contents('iot/temperature.txt', strval($time) . ':' . $temperatureReading . "n", FILE_APPEND);	
?>

La première ligne de code du script PHP prend la valeur de la lecture de température en accédant au tableau POST spécial qui inclut toutes les données publiées par l’appareil IoT. La deuxième ligne de code obtient l’heure actuelle du serveur et est importante car nous voulons enregistrer les valeurs d’heure qui ont été envoyées au serveur par l’appareil IoT. La troisième ligne ajoute l’heure actuelle à la lecture de la température et l’enregistre dans un fichier texte. Notez qu’il s’agit d’un fichier append et fusionnera les données à la fin du fichier au lieu d’écraser le tout. De cette façon, nous pouvons garder un journal de toutes les données qui ont été soumises historiquement.

Mettre tous ensemble

exemple de publication http simple

Pour que cet exemple fonctionne, vous devrez utiliser l’IDE Arduino avec l’ESP32 et y flasher le programme. Assurez-vous de modifier les informations d’identification Wi-Fi pour qu’elles correspondent à vos réseaux Wi-Fi et assurez-vous également de changer l’hôte pour votre propre site Web privé qui peut être hébergé par la plupart des domaines gratuits. Le script PHP doit être enregistré dans un fichier appelé page.php et celui-ci doit se trouver dans le répertoire le plus haut de votre site Web:

www.yourhost.com/page.php

Le système créé ici nous permet désormais d’envoyer simultanément des données à un serveur PHP depuis n’importe quel nombre d’appareils dans le monde. Cependant, cette communication n’est qu’un moyen et manque de nombreuses fonctionnalités importantes telles que les noms d’utilisateur et les mots de passe. Ainsi, dans le prochain projet maker, nous apprendrons à faire des requêtes GET pour recevoir des données stockées afin de pouvoir créer un serveur IoT plus complet en utilisant HTTP.

Thomas

Thomas

Fan de Raspberry Pi de la première heure, je suis l'évolution de ces micro-pc depuis maintenant 5 ans. En plus de l'actualité je propose de nombreux tutoriels pour vous aider à exploiter pleinement votre nano-ordinateur côté domotique ou retro-gaming.