Go Down

Topic: Hilfe bei Codeanpassung (Dashbutton soll URL aufrufen) (Read 140 times) previous topic - next topic

FNBalu

Hallo zusammen.
Ich habe einen Webschalter mittels ESP07.

Wenn ich im Browser vom Rechner die IP aufrufe, in diesem Fall 192.168.10.25, dann komme ich auf die Webseite. Dort kann ich dann mit der Maus das Relais schalten.
Machbar ist dies aber auch mittels 192.168.10.25/?relais=1

Nun möchte ich einen sogenannten Notrufbutton erstellen.
Es soll ein ESP-02 (wegen der externen Antenne, sonst identisch ESP-01) im Deepleep mittels Batterie warten. Bei Reset soll er sich ins W-Lan einloggen und genau diese URL aufrufen.
Ich habe das Gefühl mit dem Fragezeichen etc gibts Probleme.

In der ct gab es mal ein passendes Script.


Abgewandelt sähe das dann bei mir so aus:
Da das Script mal auf einen Raspi connecten sollte, habe ich die Fingerprint Geschichte entfernt.

Code: [Select]
#include <ESP8266WiFi.h>

/************************* WiFi Access Point *********************************/

#define WLAN_SSID       "raspi-iot"
#define WLAN_PASS       "cttest1234"
#define LED             2


/************************** Global State *************************************/

// WiFiFlientSecure for SSL/TLS support
WiFiClientSecure client;

/*************************** Sketch Code ************************************/

void setup() {
  Serial1.begin(115200);
  Serial1.println();
  Serial1.println("Initializing outputs...");
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
  Serial1.println("Starting Wifi connection...");
  WiFi.begin(WLAN_SSID, WLAN_PASS);
  int failcounter = 300;
  Serial1.print("Waiting for a connection");
  while (WiFi.status() != WL_CONNECTED) {
    delay(100);
    Serial1.print(".");
    if (failcounter <= 0) {
      Serial1.println();
      Serial1.println("Giving up.");
      blinkError();
      shutdown();
    }
    failcounter--;
  }
  Serial1.println();
  digitalWrite(LED, HIGH);
  Serial1.println("Wifi connected.");
  // connect to host
  const char* host = "192.168.10.25";
  int port         = 80;
  if (client.connect(host, port)) {
    Serial1.print("Connection to ");
    Serial1.print(host);
    Serial1.println(" established.");

    // send GET request
    Serial1.println("Sending a message to the server:");
    client.print(String("GET /") + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n" +
                 "\r\n");
    Serial1.println(String("GET /") + " HTTP/1.1\r\n" +
                 "Host: " + host + "\r\n" +
                 "Connection: close\r\n" +
                 "\r\n");
    blinkSent();
    delay(500);
    // get response
    int success = 0;
    failcounter = 10000;
    while (client.connected()) {
      if (client.available()) {
        String line = client.readStringUntil('\n');
        Serial1.println("Server response: " + line);
        if (line[0] == 'O' && line[1] == 'K') {
          digitalWrite(LED, LOW);
          success = 1;
        }
      }
      if (failcounter <= 0) {
        blinkError();
        shutdown();
      }
      failcounter--;
    }
    if (success) {
      blinkSuccess();
    } else {
      Serial1.println("Got no success message.");
      blinkError();
    }
    // close connection
    Serial1.println("Successfully closing the connection.");
    client.stop();
    shutdown();
  } else {
    Serial1.print("Unable to connect to ");
    Serial1.print(host);
    Serial1.println(". Sorry.");
    shutdown();
  }
}

void loop() {
  // this should never be reached.
}

void verifyFingerprint() {
  if (! client.verify(FINGERPRINT, CERT_NAME)) {
    Serial1.println("ERROR: Incorrect certificate signature!");
    // Connection insecure!
    blinkError();
    shutdown();
  }
}

void blinkSuccess() {
  for (int i = 4; i < 50; i=(5*i) >> 2) {
    digitalWrite(LED, HIGH);   // turn the LED off
    delay(10*i);               // wait
    digitalWrite(LED, LOW);    // turn the LED on
    delay(10*i);               // wait
  }
}

void blinkError() {
  for (int i = 0; i < 28; i++) {
    digitalWrite(LED, HIGH);   // turn the LED off
    delay(125);                        // wait
    digitalWrite(LED, LOW);    // turn the LED on
    delay(125);                        // wait
  }
}

void blinkSent() {
  for (int i = 0; i < 2; i++) {
    digitalWrite(LED, LOW);   // turn the LED on
    delay(200);                        // wait
    digitalWrite(LED, HIGH);    // turn the LED off
    delay(200);                        // wait
  }
}

void shutdown() {
  Serial1.println("Shutting down.");
  Serial1.println("Going to sleep.");
  ESP.deepSleep(0);
  Serial1.println("Sleep failed.");
  while(1) {
    blinkError();
  }
}



Nun habe ich gelesen, das man String url = "/?relais=1" einbauen könnte, jegliche versuche laufen dabei ins leere.

In dem Script wird auch die Ausgabe abgefragt. Theoretisch wird eine 1 von der Webseite ausgegeben oder eine 0 beim Ausschalten.

Könnt Ihr mir da helfen???


Er soll aufwachen, sich ins Wlan verbinden, die Url aufrufen bzw das Relais schalten, ist dies erfolgt schön blinken und danach schlafen gehen.

Selbiges baue ich analog dazu dann zum abschalten nach, aber das ist dann wohl das kleinste übel.

TriB

Hi FNBalu,

sicher dass Du ein "GET" brauchst um einen Wert zu übermitteln?
Da sehe ich eher ein "POST". Auch gibt es imho keine Probleme mit dem Fragezeichen. Das trennt sauber die URL von den Parametern. Kann man simpel zusammensetzen:


Code: [Select]

const String Parameter = "?code=loremIpsumDolorSinAmet==";
client.println("POST https://" + String(host) + String(folder) + Parameter + " HTTP/1.1");   
client.print("Host: ");   
client.println(host);       
client.println("User-Agent: arduino/1.0");
String messagebody = JsonValue();
client.println("Content-Type: application/json");
client.print("Content-Length: ");
client.println(String(messagebody.length()));
client.println();
client.print(messagebody);

In meinem Fall werde ich von einer URL erstmal weitergeleitet (Redirect), weshalb ich host, folder und die letztendlichen Parameter getrennt voneinander verarbeite. Dort kannst Du aber natürlich in einem Rutsch
192.168.10.25/?relais=1
hinterlegen.

Um das WiFi zu beschleunigen, kann man noch
Code: [Select]
WiFi.setAutoConnect(true);
setzen. Dann merkt sich der Chip die SSID und das Passwort.

noiasca

eigentlich brauchst den URL nur ergänzen.
Wenn es unbedingt die String Klasse sein muss, dann könnte es so aussehen:

Code: [Select]

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

(ungeprüft).
Aufpassen auf die Leerschritte.
GET für den Aufruf einer Resource am Webserver ist aus meiner Sicht korrekt.
how to react on postings:
- post helped: provide your final sketch, say thank you & give karma.
- post not understood: Ask as long as you understand the post
- post is off topic (or you think it is): Stay to your topic. Ask again.
- else: Ask again.

FNBalu

Hallo Ihr Beiden.

Zuerst einmal vielen Dank für Euer Mitwirken.

Ich habe selbstverständlich Beides ausprobiert. Nur leider will es nicht funktionieren.
Aufgefallen ist mir auch noch am Script von der ct, dass dort über Serial1 stand, das habe ich mal korrigiert.

Ins Wlan verbindet er sich, das sehe ich am W-Lan Controller und auch das er eine 192.168.10.194 IP bekommen hat.
Aber viel mehr scheint da nicht zu sein.

Gibt es vielleicht Probleme da es eine IP ist und keine Adresse ala www.google.de?
Da könnte ich über den Router sonst wohl noch was abfangen und umleiten.

gregorss

Gibt es vielleicht Probleme da es eine IP ist und keine Adresse ala www.google.de?
Das ist eigentlich nicht möglich.

Gruß

Gregor
Mir wird übel. (Uwe)

Go Up