Raspberry Pi 3 Flask : Réception d'une requête HTTP POST d'ESP32

 

Introduction

Dans ce tutoriel, nous verrons comment configurer un serveur Flask simple sur le Raspberry Pi et lui envoyer des requêtes HTTP POST depuis l'ESP32. Ensuite, nous accéderons au corps de la requête sur le Raspberry Pi.

Si vous recherchez un tutoriel similaire mais pour envoyer des requêtes HTTP GET depuis l'ESP32 à la place, veuillez vérifier ici . Pour un tutoriel détaillé sur la façon d'envoyer des requêtes HTTP POST depuis l'ESP32, veuillez consulter ce post précédent.

La version de Python utilisée dans ce tutoriel était la 3.5.3 et elle a été testée sur un  Raspberry Pi 3 modèle B+ , exécutant la  version 4.9  de Raspbian, installé à l'aide  de NOOBS.  De plus, un  module ESP32 de DFRobot  intégré dans une  carte de développement ESP32 a  été utilisé.


The Python code

Le code Python de ce tutoriel est très similaire à ce que nous avons couvert auparavant. Comme d'habitude, nous commençons par importer la classe Flask depuis le module flask, pour configurer l'ensemble du serveur HTTP.

De plus, nous devrons importer l' objet de requête à partir du module flask, afin de pouvoir accéder ultérieurement au corps de la requête envoyée par le client.

Après les importations, nous devons créer une instance de la classe Flask .

1
2
3
from flask import Flask, request
 
app = Flask(__name__)

Maintenant que nous avons notre objet app, nous pouvons procéder à la configuration des routes du serveur. Nous aurons une seule route appelée "/post" , puisque nous allons la tester par rapport aux requêtes POST. Naturellement, vous pouvez l'appeler comme vous voulez, tant que vous utilisez le point de terminaison que vous avez défini dans le code client.

De plus, nous limiterons également les méthodes HTTP réelles acceptées par cette route. Vous pouvez consulter un guide plus détaillé sur la façon de le faire sur ce  post précédent.

Cela garantira que la fonction de gestion de l'itinéraire ne sera exécutée que lorsque le client fera une demande POST.

1
2
@app.route('/post', methods = ["POST"])
def post():

La fonction de gestion de l'itinéraire sera très simple. Nous allons juste accéder au corps de la requête pour l'imprimer puis retourner une réponse vide au client. Notez qu'il est courant que la réponse d'une requête POST ne contienne aucun contenu, car un code de réponse HTTP de succès est, dans de nombreux cas, suffisant pour que le client sache que l'opération a été exécutée.

Ainsi, pour obtenir le corps de la demande réelle, nous avons simplement besoin d'accéder au membre de données de l'objet de la demande . Nous imprimerons simplement le résultat afin de pouvoir confirmer ultérieurement qu'il correspond au contenu envoyé par le client.

Après cela, comme déjà mentionné, nous renvoyons la réponse au client, avec un corps vide.

1
2
print(request.data)
return ''

Pour finaliser et commencer à écouter les requêtes entrantes, nous devons appeler la méthode run sur notre objet app. En première entrée, nous passons l' IP '0.0.0.0' , pour indiquer que le serveur doit écouter toutes les adresses IP disponibles du Raspberry Pi, et en deuxième entrée, nous passons le port où le serveur écoutera.

Le code Python complet pour le Raspberry Pi est présenté ci-dessous.

1
2
3
4
5
6
7
8
9
10
11
from flask import Flask, request
 
app = Flask(__name__)
 
@app.route('/post', methods = ["POST"])
def post():
 
    print(request.data)
    return ''
 
app.run(host='0.0.0.0', port= 8090)


The Arduino code

Nous commençons par les inclusions des bibliothèques dont nous aurons besoin à la fois pour connecter l'ESP32 à un réseau sans fil et également pour effectuer les requêtes HTTP POST. Il s'agit respectivement des bibliothèques Wifi.h et HTTPClient.h .

Il faudra également déclarer les identifiants pour se connecter au réseau WiFi, plus précisément le nom du réseau et le mot de passe.

Ensuite, dans la fonction de configuration d'Arduino, on s'occupe de connecter l'ESP32 au réseau WiFi.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <WiFi.h>
#include <HTTPClient.h>
 
const char* ssid = "yourNetworkName";
const char* password =  "yourNetworkPassword";
 
void setup() {
 
  Serial.begin(115200);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
 
  Serial.println("Connected to the WiFi network");
 
}

Les requêtes HTTP POST seront effectuées sur la fonction de boucle principale Arduino. Pour pouvoir effectuer les requêtes, nous aurons besoin d'un objet de classe HTTPClient.

1
HTTPClient http;

Maintenant, nous devons appeler la méthode begin sur notre objet HTTPClient , pour initialiser la requête. En entrée de la méthode, nous devons transmettre le point de terminaison auquel nous voulons envoyer la requête.

Le point de terminaison de destination sera composé de l'adresse IP du serveur, du port sur lequel il écoute et de la route que nous voulons atteindre. Le port a été spécifié dans le code Python et il s'agit de 8090 . La route est « /post », qui a également été spécifiée dans le code Python.

Pour obtenir l'adresse IP locale du Raspberry Pi, le plus simple est d'ouvrir une ligne de commande et d'envoyer la commande ifconfig , comme expliqué plus en détail ici .

Tenez également compte du fait que l'ESP32 et le Raspberry Pi doivent être connectés au même réseau WiFi pour que le code présenté dans ce didacticiel fonctionne.

Puisque nous envoyons une requête POST, nous devons spécifier le type de contenu du corps, afin que le serveur sache comment l'interpréter. Dans cet exemple d'introduction, nous n'enverrons qu'une chaîne "Hello World", ce qui signifie que nous pouvons définir le type de contenu en tant que texte brut.

Le type de contenu est envoyé dans la requête sous forme d'en-tête, que nous pouvons spécifier en appelant la méthode addHeader de l'objet HTTPClient . Cette méthode reçoit en première entrée le nom de l'en-tête et en deuxième entrée sa valeur.

1
http.addHeader("Content-Type", "text/plain");

Pour envoyer la requête proprement dite, nous devons appeler la méthode POST sur l' objet HTTPClient , en passant en entrée le corps de la requête, sous forme de chaîne.

Notez que cette méthode renvoie en sortie le code de réponse HTTP au cas où la requête est envoyée avec succès. Sinon, si une erreur interne se produit, il renvoie un nombre inférieur à zéro qui peut être utilisé pour la vérification des erreurs.

1
int httpResponseCode = http.POST("POSTING from ESP32");

En cas de succès, on imprime simplement le code HTTP retourné, histoire de confirmer que la requête a bien été reçue par le serveur Flask.

1
Serial.println(httpResponseCode);

Pour finaliser, nous appelons la méthode end sur le HTTPClient, pour libérer les ressources.

1
http.end(); //Free resources

Vous pouvez vérifier le code final ci-dessous. Notez qu'il inclut des vérifications supplémentaires pour s'assurer que nous envoyons la demande uniquement si l'ESP32 est toujours connecté au réseau WiFi, et également pour confirmer que la demande HTTP Post a été envoyée avec succès et qu'aucune erreur interne ne s'est produite.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <WiFi.h>
#include <HTTPClient.h>
 
const char* ssid = "yourNetworkName";
const char* password =  "yourNetworkPassword";
 
void setup() {
 
  Serial.begin(115200);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi..");
  }
 
  Serial.println("Connected to the WiFi network");
 
}
 
void loop() {
 
 if(WiFi.status()== WL_CONNECTED){   //Check WiFi connection status
 
   HTTPClient http;  
 
   http.begin("http://192.168.1.92:8090/post");
   http.addHeader("Content-Type", "text/plain");            
 
   int httpResponseCode = http.POST("POSTING from ESP32");   //Send the actual POST request
 
   if(httpResponseCode>0){
 
    Serial.println(httpResponseCode);
 
   }else{
 
    Serial.println("Error on sending POST");
 
   }
 
   http.end();  //Free resources
 
 }else{
 
    Serial.println("Error in WiFi connection");  
 
 }
 
  delay(10000);  //Send a request every 10 seconds
 
}


Tester le code

Pour tester le code, exécutez d'abord le code Python pour démarrer le serveur. Après cela, compilez et téléchargez le code Arduino sur l'ESP32, en utilisant l'IDE Arduino.

Une fois la procédure terminée, ouvrez le moniteur série Arduino IDE. Une fois que l'ESP32 est connecté au réseau WiFi, il doit commencer à envoyer les requêtes au serveur Flask et à imprimer le code d'état du résultat, comme indiqué ci-dessous à la figure 1.

ESP32 Résultat de l'envoi de HTTP POST à ​​Flask Server sur le RPI 3.png

Figure 1 – Code d'état HTTP renvoyé par le serveur à l'ESP32.

Si vous revenez à l'invite Python où le serveur Flask est en cours d'exécution, vous devriez obtenir un résultat similaire à la figure 2, où il affiche les messages envoyés par l'ESP32 en cours d'impression.

Le serveur Raspberry Pi Flask reçoit la publication HTTP d'ESP32

Figure 2 – Messages ESP32 imprimés sur le serveur Flask, s'exécutant sur le Raspberry Pi.

 


Commentaires

Posts les plus consultés de ce blog

Comment fonctionne l'optimise d'Adam

RESEAU DE NEURONE CONVOLUTIF

Comment utiliser les diagrammes PlantUML dans Visual Studio Code pour Windows 10