{"id":379,"date":"2020-03-27T13:31:30","date_gmt":"2020-03-27T13:31:30","guid":{"rendered":"https:\/\/marcjuneau.ca\/?p=379"},"modified":"2020-03-27T15:01:21","modified_gmt":"2020-03-27T15:01:21","slug":"serveur-web-sur-esp32","status":"publish","type":"post","link":"https:\/\/marcjuneau.ca\/?p=379","title":{"rendered":"Serveur WEB sur ESP32"},"content":{"rendered":"<p>Dans ce projet, nous allons cr\u00e9\u00e9 un serveur Web sur le ESP32, qui affichera simplement le message \u00ab\u00a0Mon ESP32 vous dit bonjour\u00a0\u00bb.<\/p>\n\n\n<!--more-->\n\n\n\n<p>Ce projet utilise des concepts de r\u00e9seau tels que : L&rsquo;adressage IP et les \u00e9changes client-serveur. Afin de ne pas alourdir cet article, ces concepts seront pr\u00e9sent\u00e9s dans d&rsquo;autres articles.<\/p>\n<h4>1\u00a0 &#8211; Connexion au Wi-fi<\/h4>\n<p>Pour connecter le ESP32 \u00e0 votre Wi-fi, vous devez conna\u00eetre vote SSID et le mot de passe, en supposant que votre Wifi est prot\u00e9g\u00e9. Le SSID (Service Set Identifier) est le nom de votre r\u00e9seau dans fil. Dans les projets, je vais utiliser le r\u00e9seau <em><strong>devRouteur<\/strong> <\/em>(SSID) et le mot de passe <em><strong>#1234#fafa<\/strong><\/em>, mais vous devrez remplacer ces informations par vos SSID\/Mot de passe.<\/p>\n<p>Voici le code que nous allons utiliser.<\/p>\n<div>\n<pre>#include\u00a0&lt;Arduino.h&gt;<br \/>#include &lt;WiFi.h&gt;<br \/><br \/>\/\/\u00a0Informations\u00a0sur\u00a0le\u00a0r\u00e9seau\u00a0Wi-Fi<br \/>\/\/ Vous devez remplacer les informations pas celles de votre r\u00e9seau<br \/>const char* ssid\u00a0\u00a0\u00a0\u00a0\u00a0= \"devRouteur\";<br \/>const char* password = \"#1234#fafa\";<br \/><br \/>void setup()\u00a0<br \/>{<br \/> \u00a0\/\/\u00a0Nous\u00a0allons\u00a0utiliser\u00a0la\u00a0console\u00a0pour\u00a0afficher\u00a0des\u00a0informations<br \/> \u00a0Serial.begin(9600);<br \/><br \/> \u00a0\/\/D\u00e9but\u00a0de\u00a0la\u00a0connexion\u00a0au\u00a0r\u00e9seau<br \/> \u00a0Serial.print(\"Connection\u00a0au\u00a0r\u00e9seau\u00a0\");<br \/> \u00a0Serial.println(ssid);<br \/>  WiFi.disconnect();<br \/> \u00a0WiFi.begin(ssid,\u00a0password);<br \/><br \/> \u00a0\/\/ Tant que le ESP32 n'est pas connect\u00e9, attendre...<br \/> \u00a0while\u00a0(WiFi.status()\u00a0!=\u00a0WL_CONNECTED)\u00a0<br \/> \u00a0{<br \/> \u00a0\u00a0\u00a0delay(500);<br \/> \u00a0\u00a0\u00a0Serial.print(\".\");<br \/> \u00a0}<br \/><br \/>\u00a0\u00a0\/\/\u00a0Une\u00a0fois\u00a0connect\u00e9,\u00a0on\u00a0affiche\u00a0l'adresse\u00a0IP\u00a0du\u00a0ESP32<br \/> \u00a0Serial.println(\"\");<br \/> \u00a0Serial.println(\"Connect\u00e9\u00a0au\u00a0Wi-fi\");<br \/> \u00a0Serial.println(\"Adresse\u00a0IP\u00a0=\u00a0\");<br \/> \u00a0Serial.println(WiFi.localIP());<br \/>}<br \/><br \/>void\u00a0loop()\u00a0<br \/>{<br \/> \u00a0\/\/\u00a0rien\u00a0pour\u00a0le\u00a0moment.<br \/>}<\/pre>\n<\/div>\n<p>Voici quelques explications sur ce que fait le code.<\/p>\n<pre> \u00a0Serial.begin(9600);<\/pre>\n<p>La console sera utilis\u00e9e afin d&rsquo;afficher l&rsquo;\u00e9tat de la connexion.<\/p>\n<pre> Serial.print(\"Connection\u00a0au\u00a0r\u00e9seau\u00a0\");<br \/>\u00a0Serial.println(ssid);<br \/> WiFi.disconnect();<br \/>\u00a0WiFi.begin(ssid,\u00a0password);<\/pre>\n<p>Affiche un message sur la console pour signifier le d\u00e9but de la connexion. Le Wifi.disconnect() va d\u00e9connect\u00e9 le module s&rsquo;il \u00e9tait d\u00e9j\u00e0 connect\u00e9 au r\u00e9seau. Le Wifi.begin() d\u00e9marre la connexion Wi-fi pour le SSID et le mot de passe configur\u00e9s au d\u00e9but du code.<\/p>\n<pre>while\u00a0(WiFi.status()\u00a0!=\u00a0WL_CONNECTED)\u00a0<br \/>\u00a0{<br \/>\u00a0\u00a0\u00a0delay(500);<br \/>\u00a0\u00a0\u00a0Serial.print(\".\");<br \/> }<\/pre>\n<p>Cette boucle attend que le ESP32 ait r\u00e9ussit la connexion au Wi-Fi. Si cette \u00e9tape n&rsquo;aboutie pas, v\u00e9rifiez le SSID et le mot de passe. Vous pouvez aussi valider les informations du Wi-fi avec un ordinateur, une tablette ou un t\u00e9l\u00e9phone.<\/p>\n<pre>Serial.println(\"\");<br \/>Serial.println(\"Connect\u00e9 au Wi-fi\");<br \/>Serial.println(\"Adresse IP = \");<br \/>Serial.println(WiFi.localIP());<\/pre>\n<p>Ce segment s\u2019ex\u00e9cute uniquement si la connexion \u00e0 r\u00e9ussi. Elle affiche l&rsquo;adresse IP re\u00e7ue sur le r\u00e9seau, ce qui sera n\u00e9cessaire pour afficher la page web du ESP32.<\/p>\n<p>Apr\u00e8s la compilation et le t\u00e9l\u00e9chargement, voici ce que vous devriez observer dans la console.<\/p>\n<pre>Connection au r\u00e9seau devRouteur<br \/>.<br \/>Connect\u00e9 au Wi-fi<br \/>Adresse IP =<br \/>192.168.0.198<\/pre>\n<h4>2\u00a0 &#8211; Cr\u00e9ation du serveur web<\/h4>\n<p>Pour cr\u00e9er un serveur web, il faut cr\u00e9er une instance de la classe WiFiServer. Le param\u00e8tre d&rsquo;entr\u00e9e est le num\u00e9ro du port, qui est 80 par d\u00e9faut pour le http dans les navigateurs.<\/p>\n<pre>WiFiServer server(80);<\/pre>\n<p>Nous allons \u00e9galement cr\u00e9er une instance de la classe String, dans laquelle nous allons \u00e9crire le code html de notre page web.<\/p>\n<pre>String pageHtml = <br \/>\"&lt;HTML&gt; \\n \\<br \/>   &lt;BODY&gt; \\n \\<br \/>     &lt;H1&gt; Mon ESP32 vous dit bonjour &lt;\/H1&gt; \\n \\<br \/>   &lt;\/BODY&gt; \\n \\<br \/>&lt;\/HTML&gt; \\n \";<\/pre>\n<p>Les \\n ne sont pas obligatoires. Ils permettent de structurer le code html avec des fins de ligne. Les \\ \u00e0 la fin permettent d&rsquo;\u00e9crire le contenu de la String sur plusieurs lignes afin de faciliter sa lecture.<\/p>\n<p>Dans la fonction setup(), nous allons d\u00e9marrer le serveur avec la ligne suivante.<\/p>\n<div>\n<pre>serveur.begin();<\/pre>\n<\/div>\n<div>\u00a0<\/div>\n<div>Dans la fonction loop(), nous allons ajouter le code qui va traiter les demandes des clients. Lorsque vous ouvrirez une page web \u00e0 l&rsquo;adresse IP de votre module, votre navigateur se connecte au module et fera une demande afin d&rsquo;obtenir la page HTML.<\/div>\n<div>\u00a0<\/div>\n<pre> \/\/ Regarde s'il y a un client sur le serveur<br \/>  WiFiClient client = serveur.available();<br \/>  if(client)<br \/>  {<br \/>    Serial.println(\"Nouveau Client.\");<br \/>    \/\/ rester dans la boucle tant que le client est connect\u00e9<br \/>    while (client.connected()) <br \/>    { <br \/>     if (client.available()) \/\/ V\u00e9rifie si le client a envoy\u00e9 des donn\u00e9es<br \/>     {<br \/>        char rxData = client.read();  <br \/>        Serial.write(rxData);         <br \/>        if (rxData == '\\n') \/\/ si c'.est la fin de la commande re\u00e7ue<br \/>        {<br \/>          Serial.println(\"\");<br \/>          Serial.println(\"Charge page HTML\");<br \/>          client.println(\"HTTP\/1.1 200 OK\"); \/\/send new page<br \/>          client.println(\"Content-Type: text\/html\");<br \/>          client.println();<br \/>          client.print(pageHtml);     <br \/>          client.stop();<br \/>        }<br \/>     }<br \/>    }<br \/>  }<\/pre>\n<p>\u00c0 chaque passage dans la fonction loop, il y a v\u00e9rification de la pr\u00e9sence d&rsquo;un nouveau client et r\u00e9cup\u00e9ration de sa requ\u00eate. Dans cet exemple, la requ\u00eate est affich\u00e9e dans la console mais son contenu est ignor\u00e9. Dans d&rsquo;autres exemples, nous allons utiliser les donn\u00e9es de la requ\u00eate afin d\u2019interagir avec l&rsquo;utilisateur et l&rsquo;environnement physique du ESP32.\u00a0<\/p>\n<p>Apr\u00e8s r\u00e9ception de la requ\u00eate, le ESP32 retourne sa page HTML puis termine la connexion.\u00a0 Les deux autres transmissions qui pr\u00e9c\u00e8dent la page HTML sont des r\u00e9ponse \u00e0 la requ\u00eate. La premi\u00e8re \u00ab\u00a0HTTP\/1.1 200 OK\u00a0\u00bb dit au client que la requ\u00eate est re\u00e7ue avec succ\u00e8s. La seconde informe sur le format des donn\u00e9es qui suivront.<\/p>\n<p>Voici le code complet pour ce projet :<\/p>\n<div>\n<pre>#include\u00a0&lt;Arduino.h&gt;<br \/>#include &lt;WiFi.h&gt;<br \/><br \/>\/\/\u00a0Informations\u00a0sur\u00a0le\u00a0r\u00e9seau\u00a0Wi-Fi<br \/>\/\/ Vous devez remplacer les informations pas celles de votre r\u00e9seau<br \/>const char* ssid\u00a0\u00a0\u00a0\u00a0\u00a0= \"devRouteur\";<br \/>const char* password = \"#1234#fafa\";<br \/><br \/>\/\/\u00a0Cr\u00e9er\u00a0un\u00a0serveur\u00a0sur\u00a0le\u00a0port\u00a080<br \/>WiFiServer serveur(80);<br \/><br \/>\/\/\u00a0Cr\u00e9er\u00a0une\u00a0string\u00a0pour\u00a0le\u00a0code\u00a0HTML<br \/>String pageHtml =\u00a0<br \/><br \/>\"&lt;HTML&gt;\u00a0\\n\u00a0\\<br \/> \u00a0&lt;BODY&gt;\u00a0\\n\u00a0\\<br \/> \u00a0\u00a0\u00a0&lt;H1&gt;\u00a0Mon\u00a0ESP32\u00a0vous\u00a0dit\u00a0bonjour\u00a0&lt;\/H1&gt;\u00a0\\n\u00a0\\<br \/> \u00a0&lt;\/BODY&gt;\u00a0\\n\u00a0\\<br \/>&lt;\/HTML&gt; \\n \";<br \/><br \/>void\u00a0setup()\u00a0<br \/>{<br \/> \u00a0\/\/\u00a0Nous\u00a0allons\u00a0utiliser\u00a0la\u00a0console\u00a0pour\u00a0afficher\u00a0des\u00a0informations<br \/> \u00a0Serial.begin(9600);<br \/><br \/>\u00a0\u00a0\/\/D\u00e9but\u00a0de\u00a0la\u00a0connexion\u00a0au\u00a0r\u00e9seau<br \/> \u00a0Serial.print(\"Connection\u00a0au\u00a0r\u00e9seau\u00a0\");<br \/> \u00a0Serial.println(ssid);<br \/> \u00a0WiFi.disconnect();<br \/> \u00a0WiFi.begin(ssid,\u00a0password);<br \/><br \/> \u00a0\/\/ Tant que l'\u00e9tat n'est pas connect\u00e9, attendre...<br \/> \u00a0while\u00a0(WiFi.status()\u00a0!=\u00a0WL_CONNECTED)\u00a0<br \/> \u00a0{<br \/> \u00a0\u00a0\u00a0delay(500);<br \/> \u00a0\u00a0\u00a0Serial.print(\".\");<br \/> \u00a0}<br \/><br \/>\u00a0\u00a0\/\/\u00a0Une\u00a0fois\u00a0connect\u00e9,\u00a0on\u00a0affiche\u00a0l'adresse\u00a0IP\u00a0du\u00a0ESP32<br \/> \u00a0Serial.println(\"\");<br \/> \u00a0Serial.println(\"Connect\u00e9\u00a0au\u00a0Wi-fi\");<br \/> \u00a0Serial.println(\"Adresse\u00a0IP\u00a0=\u00a0\");<br \/> \u00a0Serial.println(WiFi.localIP());<br \/><br \/>\u00a0\u00a0serveur.begin();<br \/>}<br \/><br \/>void\u00a0loop()\u00a0<br \/>{<br \/> \u00a0\/\/\u00a0Regarde\u00a0s'il\u00a0y\u00a0a\u00a0un\u00a0client\u00a0sur\u00a0le\u00a0serveur<br \/> \u00a0WiFiClient\u00a0client\u00a0=\u00a0serveur.available();<br \/><br \/> \u00a0if(client)<br \/> \u00a0{<br \/> \u00a0\u00a0\u00a0Serial.println(\"Nouveau\u00a0Client.\");<br \/> \u00a0\u00a0\u00a0\/\/\u00a0rester\u00a0dans\u00a0la\u00a0boucle\u00a0tant\u00a0que\u00a0le\u00a0client\u00a0est\u00a0connect\u00e9<br \/> \u00a0\u00a0\u00a0while\u00a0(client.connected())\u00a0<br \/> \u00a0\u00a0\u00a0{\u00a0<br \/> \u00a0\u00a0\u00a0\u00a0if\u00a0(client.available())\u00a0\/\/\u00a0V\u00e9rifie\u00a0si\u00a0le\u00a0client\u00a0a\u00a0envoy\u00e9\u00a0des\u00a0donn\u00e9es<br \/> \u00a0\u00a0\u00a0\u00a0{<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0char\u00a0rxData\u00a0=\u00a0client.read();\u00a0\u00a0<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.write(rxData);\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if\u00a0(rxData\u00a0==\u00a0'\\n')\u00a0\/\/\u00a0si\u00a0c'.est\u00a0la\u00a0fin\u00a0de\u00a0la\u00a0commande\u00a0re\u00e7ue<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(\"\");<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0Serial.println(\"Charge\u00a0page\u00a0HTML\");<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0client.println(\"HTTP\/1.1\u00a0200\u00a0OK\");\u00a0\/\/send\u00a0new\u00a0page<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0client.println(\"Content-Type:\u00a0text\/html\");<br \/><br \/>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0client.println();<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0client.print(pageHtml);\u00a0\u00a0\u00a0\u00a0\u00a0<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0client.stop();<br \/> \u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}<br \/> \u00a0\u00a0\u00a0\u00a0}<br \/> \u00a0\u00a0\u00a0}<br \/> \u00a0}<br \/>}<\/pre>\n<p>\u00a0<\/p>\n<\/div>\n\n\n","protected":false},"excerpt":{"rendered":"<p>Dans ce projet, nous allons cr\u00e9\u00e9 un serveur Web sur le ESP32, qui affichera simplement le message \u00ab\u00a0Mon ESP32 vous dit bonjour\u00a0\u00bb.<span class=\"more-link\"><a href=\"https:\/\/marcjuneau.ca\/?p=379\">Continue Reading<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":391,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22],"tags":[],"class_list":["entry","author-mjuneau","has-more-link","post-379","post","type-post","status-publish","format-standard","has-post-thumbnail","category-esp32-projets"],"_links":{"self":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts\/379","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=379"}],"version-history":[{"count":11,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts\/379\/revisions"}],"predecessor-version":[{"id":394,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/posts\/379\/revisions\/394"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=\/wp\/v2\/media\/391"}],"wp:attachment":[{"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=379"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/marcjuneau.ca\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}