Comunication entre 2 ESP Resolus

Bonjour a tous,

Dans le but de compléter mon projet, je désir faire communiquer 2 ESP8266 entre eux mais pas exclusivement non plus.

J'explique : j'ai crée une appli sur Android qui se connecte sur mon ESP 12F pour ouvrir et fermer mes volets.

Cela fonctionne ! c'est deja sa lolll

J'ai de l'autre mon système d'alarme fait maison qui fonctionne aussi !!!! sa c'est super !

Je veux que quant mon alarme est en fonction le soir mon alarme envoie une commande style

192.168.0.1/?msg=on1

et que mon esp 12F ferme mes volet

Mon probleme se trouve ici :

client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");

je ne comprend pas la structure donc moi j' y écrit ceci :

client.print(" HTTP/1.1\r\n" +
"Host: " + "192.168.0.1/?msg=on1 + "\r\n" +
"Connection: close\r\n\r\n");

Bien évidement sa ne fonctionne pas non plus !!

Quelqu'un peut il m'aider c'est un nouveau sujet pour moi !

Ceci est le code sur L'ESP qui control les volets

#include <ESP8266WiFi.h>               
#include <WiFiClient.h>               
#include <ESP8266WebServer.h>         
#include <ESP8266mDNS.h>         
#include <ArduinoOTA.h>     
#include <Wire.h> >
#include "SSD1306.h"
const char* ssid = "V_________";      
const char* password = "D________";      
String volet1 ="stop";
String volet2 ="stop";
String volet3 ="stop";
// instanciation de l'ecran 
// l'adresse I2C (ici 0x3C) peut être différente en fonction du module que vous utilisez
SSD1306  display(0x3c, 4, 5); 
ESP8266WebServer server(80);
void setup(void){


  
  pinMode(16, OUTPUT);
  pinMode(14, OUTPUT);
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(2, OUTPUT);
  pinMode(15, OUTPUT);
  digitalWrite(16, HIGH);
  digitalWrite(14, HIGH);
  digitalWrite(12, HIGH);
  digitalWrite(13, HIGH);
  digitalWrite(2, HIGH);
  digitalWrite(15, HIGH); 

  display.init();
  display.flipScreenVertically();
  display.setFont(ArialMT_Plain_10);
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  // on demande la connexion au WiFi  
  WiFi.begin(ssid, password);

  // on attend d'etre connecte au WiFi avant de continuer
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);

    display.clear();
    // on ecrit le message a l'ecran
    display.drawString(64, 22,".");
    display.display();
    delay(250);
    display.clear();
    // on ecrit le message a l'ecran
    display.drawString(64, 22,"X");
    display.display();
  }

   ArduinoOTA.begin();
  ArduinoOTA.onStart([]() {
    display.clear();
    display.setFont(ArialMT_Plain_10);
    display.setTextAlignment(TEXT_ALIGN_CENTER_BOTH);
    display.drawString(DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2 - 10, "OTA Update");
    display.display();
  });

  ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
    display.drawProgressBar(4, 32, 120, 8, progress / (total / 100) );
    display.display();
  });

  ArduinoOTA.onEnd([]() {
    display.clear();
    display.setFont(ArialMT_Plain_10);
    display.setTextAlignment(TEXT_ALIGN_CENTER_BOTH);
    display.drawString(DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2, "Restart");
    display.display();
  });

  // Align text vertical/horizontal center
  display.clear();
  display.setTextAlignment(TEXT_ALIGN_CENTER_BOTH);
  display.setFont(ArialMT_Plain_10);
  display.drawString(DISPLAY_WIDTH/2, DISPLAY_HEIGHT/2, "Ready for OTA:\n" + WiFi.localIP().toString());
  display.display();
  delay (5000);
  
  // on affiche l'adresse IP qui nous a été attribuee
  display.clear();
    // on ecrit le message a l'ecran
    display.drawString(60, 10,"IP address: " + WiFi.localIP().toString());


 
    display.display();
  // on definit ce qui doit etre fait lorsque la route "/" est appelee  
  
  server.on("/", [](){
    // on recupere le parametre msg dans l'url
    String message=server.arg("msg");

   if (message == "STATE"){
       server.send(200, "text/plain", volet1);
   }
   


   
   if (message == "on1"){
    digitalWrite(2, LOW);
    digitalWrite(16, HIGH);
   volet1 = "1 UP";
   }
   if (message == "st1"){
    digitalWrite(2, HIGH);
    digitalWrite(16, HIGH);
    volet1 = "1 STOP";
   }
    if (message == "of1"){
    digitalWrite(16, LOW);
    digitalWrite(2, HIGH);
    volet1 = "1 DOWN";
   }
    if (message == "off2"){
    digitalWrite(12, LOW);
    digitalWrite(13, HIGH);
    volet2 = "2 DOWN";
   } 
   if (message == "stop2"){
    digitalWrite(12, HIGH);
    digitalWrite(13, HIGH);
    volet2 = "2 STOP";
   }
    if (message == "on2"){
    digitalWrite(13, LOW);
    digitalWrite(12, HIGH);
    volet2 = "2 UP";
   }
   if (message == "off3"){
    digitalWrite(14, HIGH);
    digitalWrite(15, LOW);
    volet3 = "3 DOWN";
   } 
   if (message == "stop3"){
    digitalWrite(14, HIGH);
    digitalWrite(15, HIGH);
    volet3 = "3 STOP";
   }
    if (message == "on3"){
    digitalWrite(15, HIGH);
    digitalWrite(14, LOW);
    volet3 = "3 UP";
   }
    display.clear();
    // on ecrit le message a l'ecran
    display.drawString(60, 10,"IP address: " + WiFi.localIP().toString());
    display.drawString(60, 30, message );
    display.drawString(60, 40, volet1 );
    display.drawString(60, 50, volet2 );
    display.drawString(60, 60, volet3 );
    display.display();
    // on repond au client
    server.send(200, "text/plain", "#" + message );
    
  });
  server.begin();

}
void loop(void){

  ArduinoOTA.handle();
  server.handleClient();
  
}

Et ceci le code que j'essaie de faire pour envoyer une commande au 1°

#include <ESP8266WiFi.h>

byte ledPin = 2;
char ssid[] = "V_______";           // SSID of your home WiFi
char pass[] = "D________";            // password of your home WiFi

unsigned long askTimer = 0;

IPAddress server(192,168,0,8);       // the fix IP address of the server
WiFiClient client;

void setup() {
  Serial.begin(115200);               // only for debug
  WiFi.begin(ssid, pass);             // connects to the WiFi router
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println("Connected to wifi");
  Serial.print("Status: "); Serial.println(WiFi.status());    // Network parameters
  Serial.print("IP: ");     Serial.println(WiFi.localIP());
  Serial.print("Subnet: "); Serial.println(WiFi.subnetMask());
  Serial.print("Gateway: "); Serial.println(WiFi.gatewayIP());
  Serial.print("SSID: "); Serial.println(WiFi.SSID());
  Serial.print("Signal: "); Serial.println(WiFi.RSSI());
  pinMode(ledPin, OUTPUT);
}

void loop () {
  client.connect(server, 80);   // Connection to the server
  digitalWrite(ledPin, LOW);    // to show the communication only (inverted logic)
  Serial.println(".");
  client.println("/?msg=on1\r");  // sends the message to the server
  String answer = client.readStringUntil('\r');   // receives the answer from the sever
  Serial.println("from server: " + answer);
  client.flush();
  digitalWrite(ledPin, HIGH);
  delay(20000);                  // client will trigger the communication after two seconds
}

Merci :wink:

bonjour,

vous avez peut être oublié une guillemet :
regardez l'emplacement des guillemets dans la ligne host:...

vous avez :

client.print(" HTTP/1.1\r\n" +
               "Host: " + "192.168.0.1/?msg=on1 + "\r\n" + 
               "Connection: close\r\n\r\n");

il me semble qu'il faut :

client.print(" HTTP/1.1\r\n" +
               "Host: " + "192.168.0.1/?msg=on1 "+ "\r\n" + 
               "Connection: close\r\n\r\n");
[code]

Je vais vérifier mais je crois que se n'est ici qu'une erreur de retranscription car j'aurais une erreur de compile !!!

Bonjour,

Dans le premier cas

client.print(String("GET ") + url + " HTTP/1.1\r\n" +
              "Host: " + host + "\r\n" + 
              "Connection: close\r\n\r\n");

La première partie de l'expression est un String peut utiliser l'opérateur + (je ne vais pas détailler, mais en gros l'opérateur + est défini pour ajouter une c string).
Donc tout se passe bien

Dans le 2eme cas

client.print(" HTTP/1.1\r\n" +
              "Host: " + "192.168.0.1/?msg=on1 + "\r\n" + 
              "Connection: close\r\n\r\n");

Il y a uniquement des c string et l'opérateur + ne fonctionne pas sur les c string

Donc il y a deux solutions (pour simplifier car il y en a de nombreuses autre

  • la mauvaise: tu convertis en String
client.print(String(" HTTP/1.1\r\n") +
              "Host: " + "192.168.0.1/?msg=on1 + "\r\n" + 
              "Connection: close\r\n\r\n");
  • la meilleure: comme tu n'as que des strings constantes le compilateur peut les concaténer (tu supprimes les +)
client.print(" HTTP/1.1\r\n"
              "Host: " "192.168.0.1/?msg=on1" "\r\n" 
              "Connection: close\r\n\r\n");

OKI !! sa c'est pour la partie Structure.
Maintenant pourquoi dois je faire HTTP/1.1 etc... et pas direct 192.168.0.1/?msg= on1 ?

Est ce propre a l' HTML ? ou HTTP? je ne suis pas tres HTML donc ....

Oki merci donc ce qui doit être écrit serais ceci :

client.print("HTTP/1.1\r\n Host: 192.168.0.1/?msg=on1 \r\n Connection: close\r\n\r\n");

C'est bien sa ?? la syntaxe serais aussi correcte ?

Faut il des guillemets en plus ?

Merci de l'aide :wink:

Oki super Merci Pepe et les autres, j'essaye se soir je vais un peu m'attarder sur le Protocol http histoire d'en connaitre un peu plus !

Tu devrais éviter de mettre tes mots de passe en clair!

Merci c'est corriger allalala la distraction !!!

Bonjour,

La façon de faire de pepe est la plus optimisée.
Il faut cependant que la requête soit correcte et commence bien par le mot clef "GET". J'ai compris que l'IP de votre serveur ( le "host") est 192.168.0.8. La requête GET correspondante est donc :

client.print( F("GET /?msg=on1 HTTP/1.1\r\n Host: 192.168.0.8 \r\n Connection: close\r\n\r\n" ) );

Attention, les espaces après GET et avant HTTP sont importants. Idem pour la ligne vide à la fin.

Bonne bidouille,

MicroQuettas

Merci beaucoup MicroQuettas,

J'essaye ce soir ou se weekend !

S'est un sujet tout a fait particulier qui mérite un tuto sur se site car la prog des ESP est peut-être facile pour certain mais le protocole HTTP est un sujet complètement différent de l'IDE mais qui complète les besoins vis a vis des ESP.
J'ai regarder sur Wikipedia par rapport au protocole http mais les exemples n’étais pas suffisamment claire.

Merci pour votre aide je reviendrai vers vous si cela fonctionne ou pas !!

Bonjour,
Un petit cours HTML pas mal

Merci a tous,

Cela fonctionne :wink:

Le poste peut être mis en résolus.

Merci aussi icare je vais regarder de ce pas.

Merci encore au groupe :wink: