Tutoriel - STM32_WifiESP

Librairie C pour STM32 permettant de piloter un module ESP01 (ESP8266 AT) via USART DMA. Elle facilite la connexion WiFi, le serveur web embarqué, le MQTT et la synchronisation NTP, avec une API simple et modulaire.

Code source sur GitHub

1. Introduction

STM32_WifiESP permet d’ajouter facilement une connectivité WiFi, un serveur web, du MQTT et la synchronisation NTP à n’importe quel projet STM32, en utilisant un module ESP01 (ESP8266 en mode AT) et l’USART DMA. La librairie est conçue pour être simple à intégrer et modulaire.

2. Architecture détaillée du driver STM32_WifiESP

Le driver STM32_WifiESP est organisé en modules indépendants : chaque fonctionnalité (WiFi, HTTP, MQTT, NTP) possède son propre fichier source et header. Le module principal (STM32_WifiESP) gère l’initialisation, la communication bas niveau (USART/DMA) et les utilitaires communs. Vous pouvez n’inclure que les modules nécessaires à votre application.

Exemple d’utilisation typique

  1. Initialisation : Appel à esp01_init() pour initialiser le driver avec l’USART, le DMA et les buffers.
  2. Connexion WiFi : Utilisation des fonctions du module WIFI pour se connecter à un réseau.
  3. Serveur web ou MQTT : Démarrage du serveur HTTP ou du client MQTT selon le besoin.
  4. Ajout de routes ou de callbacks : Ajout de routes HTTP personnalisées ou de callbacks MQTT pour gérer les interactions.

3. Prérequis et compatibilité

Compatibilité Matérielle

  • Toutes les familles de microcontrôleurs STM32 supportant HAL et disposant d'un USART + DMA.
  • Module ESP01 (ESP8266) avec firmware AT officiel (Celui installé par défaut sur l'ESP01).

Prérequis Logiciels

  • STM32CubeIDE.
  • HAL STM32 configuré pour l’USART utilisé.
  • La librairie STM32_WifiESP présente dans le répertoire STM32_WIFI-WEB-MQTT-NTP_BY_ESP.

4. Configuration de la communication avec l'ESP01

Pour utiliser le module ESP01, il faut configurer l'USART et le DMA dans STM32CubeMX (fichier .ioc).

Voici les paramètres recommandés pour l'USART :

Si on souhaite modifier les pins par défaut de l'USART, il faut le faire avant d'activer l'USART dans CubeMX.

Configuration CubeMX USART1 ESP01

On active ensuite l'USART dans CubeMX, on laisse les paramètres par défaut.

  • Baudrate : 115200
  • Data bits : 8
  • Stop bits : 1
  • Parity : None
  • Flow control : None
DMA CubeMX USART1 ESP01

Pour le DMA, on configure l'USART1 RX avec les paramètres suivants :

  • DMA Request : RX
  • Mode : Circular
  • Data width : Byte
  • Priority : Medium
  • Direction : Peripheral to Memory

5. Montage matériel STM32 & ESP01

Le module ESP01 fonctionne en 3,3V et n’est pas tolérant au 5V. Il est donc indispensable d’utiliser un STM32 en 3,3V. Voici deux exemples de montage :

Montage direct STM32 3,3V & ESP01
Montage direct STM32 3,3V & ESP01 (sans adaptation de niveau)
Montage avec adaptation de niveau logique
Montage avec adaptation de niveau logique (STM32 5V & ESP01 3,3V)

Vérifiez toujours la tension de fonctionnement de votre carte STM32 : un branchement direct en 5V sur l’ESP01 l'endommagerait définitivement.

6. Fichiers de la librairie

  • STM32_WifiESP.h/.c : Driver bas niveau (USART, AT, debug, reset, helpers génériques)
  • STM32_WifiESP_WIFI.h/.c : Fonctions WiFi haut niveau (scan, connexion, DHCP, IP, etc.)
  • STM32_WifiESP_HTTP.h/.c : Serveur web HTTP, parsing, routage, réponses
  • STM32_WifiESP_MQTT.h/.c : Client MQTT (connexion, publish, subscribe, callback)
  • STM32_WifiESP_NTP.h/.c : Synchronisation NTP, gestion date/heure

7. Installation et Intégration

  1. Créez un dossier nommé STM32_WifiESP dans le répertoire Drivers de votre projet STM32 et copiez-y les fichiers STM32_WifiESP.h et STM32_WifiESP.c.
  2. Ajoutez les chemins d'inclusion : dans les propriétés de votre projet STM32CubeIDE, dans C/C++ General, > Paths and Symbols > Onglet Includes, dans GNU ajoutez le chemin vers le dossier STM32_WifiESP.

N'oublier pas d'activer le float dans les propriétés du projet pour afficher le nombres flottants dans le printf et scanf si besoin.

8. Fonctionnalités par module

  • Bas niveau : Initialisation, reset, logs, gestion du buffer DMA, envoi de commandes AT, helpers de parsing et conversion.
  • WiFi : Scan réseaux, connexion/déconnexion, DHCP, IP, MAC, RSSI, hostname, ping, état TCP/IP.
  • HTTP : Serveur web multi-route, parsing requêtes, routage, réponses HTML/JSON, statistiques, gestion des connexions.
  • MQTT : Connexion broker, publication, abonnement, ping, callback messages, gestion du client MQTT.
  • NTP : Configuration serveur NTP, synchronisation automatique, parsing date/heure, gestion DST.

9. Debug et bonnes pratiques

  • Activez #define ESP01_DEBUG 1 dans STM32_WifiESP.h pour les logs USART
  • Libérez toujours les buffers alloués par esp01_send_raw_command_dma (sauf si la fonction s’en occupe déjà)
  • Utilisez les fonctions de parsing fournies pour éviter les erreurs de formatage
  • Testez les fonctions de base avant d’intégrer des fonctionnalités avancées

10. Exemples et tests fournis

  • Test_Driver.c : Test des fonctions bas niveau (AT, reset, logs, RAM, etc.).
  • Test_Module_WIFI_(AP).c : Test complet du mode Point d’Accès WiFi.
  • Test_Module_WIFI_(STA).c : Test complet du mode Station WiFi.
  • Test_Serveur_WEB.c : Démonstration serveur web multi-route.
  • Test_Send_MQTT.c : Publication MQTT.
  • Test_Receive_MQTT.c : Réception MQTT (abonnement/callback).
  • Test_NTP.c : Synchronisation NTP.
  • Test_Terminal AT.c : Terminal AT interactif.
Comment utiliser rapidement un exemple ?
  1. Ouvrez le fichier de test souhaité (ex : Test_Serveur_WEB.c).
  2. Copiez tout son contenu dans votre main.c (remplacez le contenu existant).
  3. Adaptez les #define (SSID, mot de passe WiFi, broche LED, etc.) en haut du fichier selon votre configuration matérielle.
  4. Configurez vos USART dans STM32CubeMX (USART pour l'ESP01 et éventuellement pour la console série), puis générez le code.
  5. Compilez et flashez votre carte STM32 : le programme de test sera alors fonctionnel et prêt à l'emploi.
Astuce : Cette méthode permet de valider rapidement le fonctionnement du driver et de la librairie sur votre carte, avant d'intégrer les fonctions dans votre propre projet.

11. Liste des fonctions utilisateurs du cœur du driver

Astuce : Pour toute nouvelle fonctionnalité, inspirez-vous des fonctions existantes : validez les paramètres, utilisez les helpers de parsing, gérez les erreurs avec les macros, et logguez les étapes importantes pour faciliter le debug.

11.1. Fonctions principales (initialisation, gestion du module, buffer, etc.)

Prototype Explication détaillée
                            
/**
 * @brief  Initialise le driver ESP01 (UART, DMA, buffers, test communication).
 * @param  huart_esp   UART utilisé pour l'ESP01
 * @param  huart_debug UART pour debug (logs)
 * @param  dma_rx_buf  Buffer DMA RX
 * @param  dma_buf_size Taille du buffer DMA
 * @retval ESP01_Status_t Code de statut (OK, erreur, etc.)
 */
esp01_init(UART_HandleTypeDef *huart_esp, UART_HandleTypeDef *huart_debug, uint8_t *dma_rx_buf, uint16_t dma_buf_size);
                            
                        
Initialise le driver ESP01 : configure l’UART, le DMA, les buffers et vérifie la communication avec le module. À appeler en tout premier dans le main(). Retourne un statut d’erreur précis si un problème matériel ou de communication est détecté.
/**
 * @brief  Vide le buffer RX UART (DMA).
 * @param  timeout_ms Timeout en ms
 * @retval ESP01_Status_t
 */
esp01_flush_rx_buffer(uint32_t timeout_ms);
Vide le buffer RX UART (DMA) pour éviter de traiter d’anciennes données. À utiliser avant d’envoyer une nouvelle commande AT ou après un reset.
/**
 * @brief  Envoie une commande AT brute via DMA et attend un motif.
 * @param  cmd         Commande AT à envoyer
 * @param  resp        Buffer de réponse
 * @param  resp_size   Taille du buffer réponse
 * @param  wait_pattern Motif à attendre dans la réponse
 * @param  timeout_ms  Timeout en ms
 * @retval ESP01_Status_t
 */
esp01_send_raw_command_dma(const char *cmd, char *resp, size_t resp_size, const char *wait_pattern, uint32_t timeout_ms);
Envoie une commande AT brute via DMA et attend une réponse contenant un motif donné (ex : "OK"). Permet d’envoyer n’importe quelle commande AT personnalisée et de récupérer la réponse complète.

11.2. Wrappers exposant une commande AT à l’utilisateur (et helpers associés)

Chaque wrapper correspond à une commande AT ou à une fonctionnalité du module ESP01, et dispose d’un programme de test dédié dans Test_Driver.c. Ce fichier permet de valider individuellement chaque commande, de visualiser les réponses et de s’assurer du bon fonctionnement du driver sur votre matériel.

Commande AT Global Get Set Exe Description Fonction du driver Helper associé
AT 0 0 0 1 Teste la communication AT esp01_test_at
ATE0 0 0 0 1 Désactive l’écho
ATE1 0 0 0 1 Active l’écho
AT+RST 0 0 0 1 Redémarre le module esp01_reset
AT+GMR 0 0 0 1 Informations de version esp01_get_at_version esp01_display_firmware_info
AT+CMD 0 1 0 0 Liste les commandes AT supportées esp01_get_cmd_list
AT+GSLP 0 0 1 0 Entre en mode deep sleep esp01_deep_sleep
AT+SYSTIMESTAMP 0 1 1 0 Horodatage système
AT+SLEEP 0 1 1 0 Mode de sommeil esp01_get_sleep_mode / esp01_set_sleep_mode esp01_sleep_mode_to_string
AT+RESTORE 0 0 0 1 Restaure les paramètres par défaut esp01_restore
AT+SYSRAM 0 1 0 0 Utilisation actuelle de la RAM esp01_get_sysram esp01_sysram_to_string
AT+SYSFLASH 0 1 1 0 Paramètres de partition flash utilisateur esp01_get_sysflash esp01_sysflash_to_string / esp01_display_sysflash_partitions
AT+RFPOWER 0 1 1 0 Puissance RF maximum esp01_get_rf_power / esp01_set_rf_power esp01_rf_power_to_string
AT+USEROTA 0 0 1 0 Mise à jour OTA utilisateur esp01_user_ota
AT+USERWKMCUCFG 0 0 1 0 Configure le wakeup MCU utilisateur esp01_set_user_wkmcucfg
AT+USERMCUSLEEP 0 0 1 0 Met le MCU utilisateur en veille esp01_set_user_mcusleep
AT+SYSMSG 0 1 1 0 Affichage des messages système
AT+SYSROLLBACK 0 0 0 1 Rollback firmware
AT+SYSLOG 0 1 1 0 Journaux de débogage AT esp01_get_syslog / esp01_set_syslog esp01_syslog_to_string
AT+SYSSTORE 0 1 1 0 Mode de stockage des paramètres esp01_get_sysstore esp01_sysstore_to_string
AT+SLEEPWKCFG 0 0 1 0 Sources de réveil du sleep
AT+SYSREG 0 0 1 0 Lit/écrit les registres système
AT+USERRAM 0 1 1 0 RAM utilisateur esp01_get_userram esp01_userram_to_string
AT+UART 0 1 1 0 Paramètres UART esp01_get_uart_config / esp01_set_uart_config esp01_uart_config_to_string

11.3. Terminal / console AT

Le programme de test Test_Terminal AT.c permet d’interagir en direct avec le module ESP01 : il est idéal pour tester manuellement n’importe quelle commande AT, observer le retour brut du module, et ainsi affiner ou développer les fonctions de parsing adaptées. C’est un outil précieux pour le debug, l’exploration des réponses et la validation des nouveaux wrappers ou helpers.

Prototype Explication détaillée
/**
 * @brief  Initialise le terminal AT interactif sur l'UART de debug.
 * @param  huart_debug UART utilisé pour la console PC
 */
void esp01_terminal_begin(UART_HandleTypeDef *huart_debug);
Initialise le terminal AT interactif : configure l’interface console sur l’UART de debug (généralement reliée au PC), et lance l’interruption de réception (IT RX) pour permettre la saisie en temps réel. L’utilisateur peut alors envoyer des commandes AT depuis un terminal série (ex : PuTTY, TeraTerm) et voir les réponses de l’ESP01 instantanément.
/**
 * @brief  Callback appelée à la réception d’un caractère sur la console.
 * @param  huart UART de la console
 */
void esp01_console_rx_callback(UART_HandleTypeDef *huart);
Callback de réception console : à appeler dans l’interruption RX de l’UART console (HAL_UART_RxCpltCallback ou équivalent). Cette fonction récupère chaque caractère tapé sur le terminal PC, le stocke dans un buffer local, gère l’édition de la ligne (effacement, retour chariot, etc.), et déclenche l’envoi de la commande AT complète à l’ESP01 lorsque l’utilisateur valide (Entrée). Elle assure aussi l’écho des caractères sur le terminal, la gestion des touches spéciales (Backspace, etc.), et relance l’IT RX pour le caractère suivant. C’est le cœur de l’interactivité du terminal AT.
/**
 * @brief  Tâche principale du terminal AT, à appeler en boucle.
 */
void esp01_console_task(void);
Tâche principale du terminal : à placer dans la boucle principale du programme. Cette fonction surveille l’état du terminal : elle vérifie si une commande AT complète a été saisie et envoyée, attend la réponse de l’ESP01, puis affiche la réponse sur le terminal PC. Elle gère aussi les timeouts, les erreurs de communication, l’affichage des messages d’état, et réinitialise le buffer de saisie pour la commande suivante. Elle permet ainsi une expérience utilisateur fluide et réactive lors de l’utilisation du terminal AT.

11.4. Helpers (conversion, affichage, formatage humain)

Ces fonctions utilitaires facilitent la conversion, l’affichage ou le formatage des données (par exemple : taille mémoire, valeurs numériques, etc.). Elles évitent de réécrire du code déjà existant et permettent de garder une cohérence dans la présentation des informations, tout en respectant la philosophie DRY (Don’t Repeat Yourself) de la librairie.

  • char *esp01_format_size(size_t bytes, char *output, size_t size);

11.5. Outils de parsing

Ces fonctions servent à extraire facilement des valeurs (entiers, chaînes, booléens) depuis les réponses AT ou les buffers. Elles sont conçues pour éviter les erreurs de parsing et accélérer le développement, en réutilisant des routines fiables et testées.

  • ESP01_Status_t esp01_parse_int_after(const char *text, const char *pattern, int32_t *result);
  • ESP01_Status_t esp01_parse_string_after(const char *text, const char *pattern, char *output, size_t size);
  • bool esp01_extract_quoted_value(const char *src, const char *motif, char *out, size_t out_len);
  • ESP01_Status_t esp01_parse_bool_after(const char *resp, const char *tag, bool *out);
  • uint8_t esp01_split_response_lines(const char *input_str, char *lines[], uint8_t max_lines, char *lines_buffer, size_t buffer_size, bool skip_empty);

11.6. Outils utilitaires (buffer, inline, validation)

Ces utilitaires regroupent des fonctions d’aide pour la gestion des buffers, la validation des pointeurs, la copie sécurisée de chaînes, etc. Leur usage permet d’éviter les bugs classiques (dépassement de buffer, pointeur NULL…) et d’écrire un code plus sûr et maintenable, toujours dans l’esprit de réutilisation et de robustesse de la librairie.

  • const char *esp01_get_error_string(ESP01_Status_t status);
  • ESP01_Status_t esp01_wait_for_pattern(const char *pattern, uint32_t timeout_ms);
  • void _esp_trim_string(char *str);
  • static inline ESP01_Status_t esp01_safe_strcpy(char *dst, size_t dst_size, const char *src);
  • static inline ESP01_Status_t esp01_check_buffer_size(size_t needed, size_t avail);
  • static inline bool esp01_is_valid_ptr(const void *ptr);
  • static inline ESP01_Status_t esp01_safe_strcat(char *dst, size_t dst_size, const char *src);

12. Détail des modules fonctionnels

12.1. Module WIFI

Le module WIFI fournit toutes les fonctions haut niveau pour gérer la connexion réseau de l’ESP01 : scan des réseaux, gestion des modes (station, point d’accès, mixte), configuration DHCP/IP, connexion/déconnexion, gestion du hostname, ping, récupération d’IP/MAC, etc. Il s’appuie sur le driver bas niveau et expose une API claire, inspirée des commandes AT, pour piloter le WiFi depuis le STM32.

Tableau des wrappers et helpers (commandes AT)

Commande AT Wrapper principal Helper associé Description
AT+CWMODE? esp01_get_wifi_mode esp01_wifi_mode_to_string Récupère le mode WiFi courant
AT+CWMODE= esp01_set_wifi_mode esp01_wifi_mode_to_string Définit le mode WiFi
AT+CWLAP esp01_scan_networks esp01_parse_cwlap_line, esp01_network_to_string Scan des réseaux WiFi à proximité
AT+CWJAP= esp01_connect_wifi, esp01_connect_wifi_config - Connexion à un réseau WiFi (simple/avancé)
AT+CWQAP esp01_disconnect_wifi esp01_cwqap_to_string Déconnexion du WiFi
AT+CWDHCP= esp01_set_dhcp - Active/désactive le DHCP
AT+CWDHCP? esp01_get_dhcp - Récupère l’état du DHCP
AT+CIPSTA? esp01_get_current_ip, esp01_get_ip_config - Récupère l’adresse IP/config IP
AT+CIPSTAMAC? esp01_get_mac - Récupère l’adresse MAC
AT+CWHOSTNAME= esp01_set_hostname - Définit le hostname
AT+CWHOSTNAME? esp01_get_hostname - Récupère le hostname
AT+PING esp01_ping - Ping une adresse réseau
AT+CIPSTATUS esp01_get_tcp_status esp01_tcp_status_to_string Statut TCP
AT+CWSTATE? esp01_get_wifi_state esp01_cwstate_to_string État WiFi
AT+CIPAP? esp01_get_ap_config esp01_ap_config_to_string Config AP
AT+CWSAP= esp01_start_ap_config, esp01_set_ap_config - Configure un AP (simple/complet)
AT+CWJAP? esp01_get_connection_info esp01_parse_cwjap_response Infos connexion WiFi
AT+CWJAP? esp01_get_wifi_connection - État de connexion WiFi (brut)
AT+CWJAP? esp01_get_connection_status esp01_connection_status_to_string Statut connexion WiFi
AT+CIPMUX? esp01_get_connection_mode - Mode de connexion (simple/multi)
AT+CWJAP_CUR? esp01_get_connected_ap_info - Infos AP connecté
AT+CWLIF esp01_list_ap_stations esp01_ap_station_to_string Liste stations connectées à l’AP
AT+CWQIF esp01_ap_disconnect_all, esp01_ap_disconnect_station - Déconnexion stations AP

Fonctions avancées et utilitaires détaillées

Prototype Explication détaillée
ESP01_Status_t esp01_connect_wifi_config(ESP01_WifiMode_t mode, const char *ssid, const char *password, bool use_dhcp, const char *ip, const char *gateway, const char *netmask);
Connexion avancée à un réseau WiFi : permet de choisir le mode (STA, AP, mixte), d’activer/désactiver le DHCP ou de configurer une IP statique, gateway et masque réseau. Idéal pour les applications industrielles ou embarquées nécessitant une configuration réseau précise.
ESP01_Status_t esp01_get_ip_config(char *ip_buf, size_t ip_len, char *gw_buf, size_t gw_len, char *mask_buf, size_t mask_len);
Récupère la configuration IP complète : IP, gateway, masque. Utile pour vérifier la configuration réseau après connexion ou pour debug.
ESP01_Status_t esp01_set_ap_config(const char *ssid, const char *password, uint8_t channel, uint8_t encryption, uint8_t max_conn, uint8_t ssid_hidden);
Configure un point d’accès (SoftAP) complet : SSID, mot de passe, canal, type d’encryptage, nombre max de connexions, visibilité du SSID. Permet de transformer l’ESP01 en hotspot WiFi avancé.
ESP01_Status_t esp01_list_ap_stations(esp01_ap_station_t *stations, uint8_t max_stations, uint8_t *found);
Liste les stations connectées à l’AP (SoftAP) : remplit un tableau de structures avec l’IP et la MAC de chaque client connecté.
ESP01_Status_t esp01_ap_disconnect_all(void);
ESP01_Status_t esp01_ap_disconnect_station(const char *mac);
Déconnecte toutes les stations de l’AP, ou une station spécifique (par MAC). Pratique pour gérer dynamiquement les accès au réseau local créé par l’ESP01.
ESP01_Status_t esp01_get_rssi(int *rssi);
Récupère le niveau de signal WiFi (RSSI) : utile pour surveiller la qualité de la connexion ou pour des applications de diagnostic réseau.
ESP01_Status_t esp01_parse_cwlap_line(const char *line, esp01_network_t *network);
ESP01_Status_t esp01_network_to_string(const esp01_network_t *net, char *buf, size_t buflen);
Helpers pour parser et afficher les résultats de scan WiFi : extraction des infos d’une ligne brute AT+CWLAP, formatage lisible pour affichage/log.
ESP01_Status_t esp01_parse_cwjap_response(const char *resp, char *ssid, size_t ssid_size, char *bssid, size_t bssid_size, uint8_t *channel, int *rssi, uint8_t *enc_type);
Helper pour extraire toutes les infos d’une connexion WiFi à partir de la réponse brute du module (SSID, BSSID, canal, RSSI, encryption…)
const char *esp01_encryption_to_string(int code);
const char *esp01_rf_power_to_string(int rf_dbm);
Helpers pour convertir les codes d’encryptage ou la puissance RF en chaînes lisibles (pour logs, debug, affichage utilisateur).

Structures et types principaux

  • esp01_network_t : décrit un réseau WiFi détecté (SSID, MAC, RSSI, canal, encryption…)
  • ESP01_WifiMode_t : mode WiFi (STA, AP, STA+AP)
  • esp01_ap_station_t : station connectée à l’AP (IP, MAC)

Conseils d’intégration et tests

  • Initialisez toujours le module ESP01 avec esp01_init() avant d’utiliser les fonctions WiFi.
  • Utilisez Test_Module_WIFI_(STA).c pour valider la connexion en mode station, et Test_Module_WIFI_(AP).c pour tester le mode point d’accès.
  • En cas de problème, vérifiez le câblage (voir section montage) et le terminal AT (section 10.3).
  • Pour des usages avancés (IP statique, hostname, multi-connexions), reportez-vous aux fonctions avancées de l’API ci-dessus.

Pour aller plus loin

  • Voir les helpers de parsing et d’affichage pour exploiter les résultats des scans et des statuts.
  • Consultez le code source et les headers pour la liste exhaustive des fonctions et options.

12.2. Module HTTP (serveur web)

Le module HTTP transforme l’ESP01 en serveur web embarqué : il permet d’écouter sur un port TCP, de parser les requêtes HTTP, de router les URLs vers des handlers C, et de générer dynamiquement des réponses HTML, JSON ou texte. Il gère les connexions multiples, le décodage des headers, la gestion des routes, et facilite la création d’interfaces web pour piloter ou superviser votre STM32 à distance.

Tableau des wrappers et helpers (commandes AT)

Commande AT Wrapper principal Helper associé Description
AT+CIPSERVER esp01_http_start_server - Démarre le serveur HTTP
AT+CIPSERVER=0 esp01_http_stop_server - Arrête le serveur HTTP
AT+CIPMUX esp01_set_multiple_connections - Active/désactive multi-connexion
AT+CIPSTATUS esp01_http_get_server_status - Statut du serveur HTTP
AT+CIPCLOSE esp01_http_close_connection - Ferme une connexion HTTP
AT+CIPSEND esp01_send_http_response - Envoie une réponse HTTP

Fonctions avancées et utilitaires détaillées

Prototype Explication détaillée
ESP01_Status_t esp01_http_init(void);
Initialise le module HTTP : efface les routes, réinitialise les stats et les connexions. À appeler au démarrage.
void esp01_http_loop(void);
Boucle principale de gestion HTTP : à appeler régulièrement dans la boucle principale pour traiter les requêtes entrantes et gérer les connexions.
ESP01_Status_t esp01_add_route(const char *path, esp01_route_handler_t handler);
Ajoute une route HTTP (URL) et associe un handler C appelé à chaque requête correspondante. Permet de créer des pages dynamiques ou des API REST.
ESP01_Status_t esp01_parse_http_request(const char *raw_request, http_parsed_request_t *parsed);
Parse une requête HTTP brute reçue sur le port TCP : extrait la méthode, l’URL, la query string, etc. Remplit une structure http_parsed_request_t pour un traitement facile côté application.
ESP01_Status_t esp01_send_http_response(int conn_id, int status_code, const char *content_type, const char *body, size_t body_len);
Envoie une réponse HTTP complète (code, headers, body) sur une connexion donnée. Permet de générer dynamiquement des pages HTML, JSON, etc.
ESP01_Status_t esp01_send_json_response(int conn_id, const char *json_data);
Envoie une réponse JSON sur la connexion demandée (Content-Type: application/json).
ESP01_Status_t esp01_send_404_response(int conn_id);
Envoie une réponse 404 Not Found sur la connexion demandée.
void esp01_clear_routes(void);
Efface toutes les routes HTTP enregistrées (utile pour reconfigurer dynamiquement le serveur).
int esp01_get_active_connection_count(void);
bool esp01_is_connection_active(int conn_id);
Permet de surveiller et gérer les connexions actives côté serveur.

Structures et types principaux

  • http_parsed_request_t : requête HTTP parsée (méthode, chemin, query string, validité…)
  • esp01_route_t : route HTTP (chemin + handler associé)
  • connection_info_t : informations sur une connexion HTTP active
  • http_request_t : requête HTTP brute reçue (conn_id, IP, port, validité…)
  • esp01_stats_t : statistiques HTTP (requêtes, réponses, temps…)

Conseils d’intégration et tests

  • Utilisez Test_Serveur_WEB.c pour valider la configuration et le routage HTTP.
  • Adaptez les routes et handlers à vos besoins (API REST, pages HTML, etc.).
  • Surveillez le nombre de connexions simultanées : l’ESP01 a une limite (voir ESP01_MAX_CONNECTIONS).
  • Pour le debug, affichez les requêtes reçues et les réponses envoyées côté STM32.

Pour aller plus loin

  • Consultez le code source pour les options avancées (authentification, CORS, POST multipart…)
  • Vous pouvez servir des pages statiques ou générer dynamiquement du contenu (JSON, HTML, etc.).

12.3. Module MQTT

Le module MQTT permet à l’ESP01 de se connecter à un broker MQTT, de publier des messages, de s’abonner à des topics, de recevoir des messages via callback, et de gérer le polling/ping. Il expose une API haut niveau pour la communication IoT, compatible avec la plupart des brokers (Mosquitto, HiveMQ, etc.), et gère la QoS, le keepalive, et la gestion des topics.

Tableau des wrappers et helpers (commandes AT)

Commande AT Wrapper principal Helper associé Description
AT+MQTTCONN esp01_mqtt_connect - Connexion au broker MQTT
AT+MQTTPUB esp01_mqtt_publish - Publication d’un message
AT+MQTTSUB esp01_mqtt_subscribe - Souscription à un topic
AT+MQTTPING esp01_mqtt_ping - Ping MQTT (keepalive)
AT+MQTTDISC esp01_mqtt_disconnect - Déconnexion du broker

Fonctions avancées et utilitaires détaillées

Prototype Explication détaillée
ESP01_Status_t esp01_mqtt_connect(const char *broker_ip, uint16_t port, const char *client_id, const char *username, const char *password);
Connexion au broker MQTT avec gestion du client ID, des identifiants et du port. Supporte l’authentification si besoin.
ESP01_Status_t esp01_mqtt_publish(const char *topic, const char *message, uint8_t qos, bool retain);
Publication d’un message sur un topic : supporte la QoS (0/1/2) et le flag retain.
ESP01_Status_t esp01_mqtt_subscribe(const char *topic, uint8_t qos);
Souscription à un topic MQTT avec gestion de la QoS.
void esp01_mqtt_set_message_callback(mqtt_message_callback_t cb);
Définit le callback utilisateur appelé à chaque réception de message MQTT (topic, message).
void esp01_mqtt_poll(void);
Fonction de polling à appeler régulièrement pour traiter les messages entrants et maintenir la connexion.
ESP01_Status_t esp01_mqtt_ping(void);
Envoie un ping MQTT (PINGREQ) pour maintenir la connexion active (keepalive).
ESP01_Status_t esp01_mqtt_disconnect(void);
Déconnexion propre du broker MQTT.

Structures et types principaux

  • mqtt_client_t : structure du client MQTT (statut, IP broker, port, client ID, keepalive…)
  • mqtt_message_callback_t : prototype de callback pour la réception de messages

Conseils d’intégration et tests

  • Utilisez Test_Send_MQTT.c et Test_Receive_MQTT.c pour valider la publication et la réception.
  • Adaptez le client ID et les topics à votre application.
  • Appelez esp01_mqtt_poll() régulièrement pour garantir la réception des messages et le maintien de la connexion.
  • Surveillez le statut de connexion (g_mqtt_client.connected) pour gérer les reconnexions.

Pour aller plus loin

  • Consultez le code source pour les options avancées (QoS 1/2, gestion des erreurs, reconnexion automatique…)
  • Compatible avec la plupart des brokers MQTT standards (Mosquitto, HiveMQ, etc.).

12.4. Module NTP

Le module NTP permet à l’ESP01 de synchroniser automatiquement l’horloge du STM32 avec un serveur de temps NTP (Network Time Protocol) sur Internet ou le réseau local. Il facilite la récupération de la date et de l’heure précises, la gestion du fuseau horaire, du passage à l’heure d’été/hiver (DST), et l’intégration d’une horloge temps réel fiable dans les applications embarquées.

Tableau des wrappers et helpers (commandes AT)

Commande AT Wrapper principal Helper associé Description
AT+CNTP esp01_set_ntp_server - Configure le serveur NTP (adresse, fuseau, DST)
AT+CNTP? esp01_get_ntp_config esp01_ntp_config_to_string Récupère la configuration NTP courante
AT+SYNCTIME esp01_sync_time - Déclenche une synchronisation NTP immédiate
AT+TIME? esp01_get_time esp01_parse_time_response Récupère la date/heure courante (UTC ou locale)

Fonctions avancées et utilitaires détaillées

Prototype Explication détaillée
ESP01_Status_t esp01_set_ntp_server(const char *server, int timezone, int dst);
Configure le serveur NTP, le fuseau horaire (timezone, en heures) et l’activation du passage à l’heure d’été/hiver (DST). À appeler au démarrage ou pour changer de serveur.
ESP01_Status_t esp01_get_ntp_config(char *server, size_t server_len, int *timezone, int *dst);
Récupère la configuration NTP courante : adresse du serveur, fuseau horaire, état DST. Permet de vérifier ou d’afficher la config active.
ESP01_Status_t esp01_sync_time(void);
Déclenche une synchronisation immédiate avec le serveur NTP configuré. Utile pour forcer la mise à jour de l’horloge à tout moment.
ESP01_Status_t esp01_get_time(esp01_time_t *time, bool local_time);
Récupère la date et l’heure courante depuis l’ESP01 : remplit une structure esp01_time_t (année, mois, jour, heure, minute, seconde, etc.). Le paramètre local_time permet d’obtenir l’heure locale ou UTC.
ESP01_Status_t esp01_parse_time_response(const char *resp, esp01_time_t *time);
Helper pour parser la réponse brute AT+TIME? et remplir la structure esp01_time_t avec les champs date/heure extraits.
const char *esp01_ntp_config_to_string(const char *server, int timezone, int dst, char *buf, size_t buflen);
Formate la configuration NTP courante en chaîne lisible (pour logs, debug, affichage utilisateur).

Structures et types principaux

  • esp01_time_t : structure date/heure complète (année, mois, jour, heure, minute, seconde, jour semaine, validité…)

Conseils d’intégration et tests

  • Appelez esp01_set_ntp_server() au démarrage pour configurer le serveur, le fuseau et le DST selon votre région.
  • Utilisez esp01_sync_time() après la connexion WiFi pour garantir une horloge à jour.
  • Testez la synchronisation et la récupération de l’heure avec Test_NTP.c.
  • Pour des applications critiques, vérifiez la validité du champ valid dans esp01_time_t après chaque synchronisation.

Pour aller plus loin

  • Vous pouvez utiliser plusieurs serveurs NTP pour la redondance (voir pool.ntp.org).
  • Adaptez le fuseau horaire dynamiquement selon la localisation de l’appareil.
  • Consultez le code source pour des helpers de parsing ou de conversion supplémentaires.