WeMOS Mail

Fra HTX Arduino
Spring til navigation Spring til søgning
WeMOS WiFi Processor
WeMOS Server Connection - Simpel Server - Flere SSID - ESP8266 - Watchdog - Interrupt
Anvendelse LED-eksempel - AD-eksempel - Mail - POST metode - Web Publicering

Den grundlæggende ide i denne kode er at sende en kommando fra den serielle monitor, og via WeMOS WiFi sende en henvendelse til en webserver[1] med et lille PHP-script, der kan sende en mail, med et indhold bestem af det der er indtastet i Serial Monitor

Forbindelse til WiFi

Selve forbindelsen til WiFi er lavet som beskrevet ved WeMOS Server Connection, og skal blot etablere forbindelsen til WiFi netværket.

For at den samlede kode kan fungere, så skal det netværk der forbindes til have forbindelse til internettet, så man kan komme i kontakt med webserveren med PHP-scriptet.

Opsætning til HTTP-request

For at man kan sende en besked til webserveren, så skal man have adgange til HTTP-request biblioteket, og der skal oprettes at HTTP-objekt.

Dette sker i følgende kode:

#include <ESP8266HTTPClient.h>

HTTPClient http;

int httpCode;

Webserver henvendelse

For at henvende sig til webserveren på simpel vis anvendes GET-metoden. Hvis man skulle gøre det med større sikkerhed, så skulle man anvende POST-metoden[2], og man burde også sikre webserveren med et login - det er ikke gjort i dette eksempel.

Selve webserveren har en http-adresse, der angives i en variabel som vist her:

const String serverAddress = "http://htx-elev.ucholstebro.dk/HX-class/user/";      // Webserverens URL

  String stringToSend = serverAddress;  // Serveradressen der skal henvendes til

På Holstebro HTX har vi webserver på adressen htx-elev.ucholstebro.dk, hvor man kan uploade sine scipts, når holdet er oprettet med de brugere der er på holdet. Serveren har installeret en mailserver, så man kan sende mails fra scriptet. Webserveren er nærmere beskrevet på Beskrivelse af htx-elev Webserver.

Man kan naturligvis også anvende andre webservere, hvis de understøtter PHP og har en mailserver tilknyttet.

Inde på webserveren ligger PHP-filen, som skal tilføjes henvendelsen som vist her:

  stringToSend += "sendMail.php?send="; // Filnavnet og parameter-navn

Der tilføjes også navnet på parameteren (send).

Endelig tages et input fra den serielle monitor, og der sikres at det kun er selve det indtastede man tager med. Dette tilføjes henvendelsen:

    String param = Serial.readStringUntil('\n');  // Læs en hel streng
    param.trim();                         // Fjern mellemrum og linjeskift fra start og slut
    stringToSend += param;                // Indholdet der skal sendes

Herefter foretages selve henvendelsen til webserveren med en HTTP-henvendelse:

    http.setTimeout(2000);                                 // Use 2 seconds timeout for HTTP connection
    http.begin(stringToSend);                              // Start HTTP connection and send HTTP header

Connection response

Henvendelsen til webserveren giver en respons, som man skal tjekke for at se om henvendelsen gik godt.

Dette returnerer en kode:

    httpCode = http.GET();                                 // Get response from HTTP request

Henvendelsen giver også en respons, der her udskrives til seriel monitor

    if(httpCode > 0)                                       // httpCode will be negative on error
    {      
      Serial.printf("[HTTP] GET... code: %d\n", httpCode); // Response from server is not an error
      if(httpCode == HTTP_CODE_OK) {                       // Response from server is HTTP CODE 200
        String payload = http.getString();
        Serial.println(payload);
      }
    } else {
      Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }
    http.end();

Efter endt henvendelse lukkes forbindelsen igen.

Eksempel på hele koden

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>

HTTPClient http;

int httpCode;

const String serverAddress = "http://htx-elev.ucholstebro.dk/HX-hold/user/";      // Webserverens URL

const char* ssid = "ssid-name";
const char* password = "ssid-password";

WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);



  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");

  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.print("Use this URL : ");
  Serial.print("http://");
  Serial.print(WiFi.localIP());
  Serial.println("/");

}

void loop() {
  String stringToSend = serverAddress;  // Serveradressen der skal henvendes til
  if (Serial.available()) {
    stringToSend += "sendMail.php?send="; // Filnavnet og parameter-navn

    String param = Serial.readStringUntil('\n');  // Læs en hel streng
    param.trim();                         // Fjern mellemrum og linjeskift fra start og slut
    stringToSend += param;                // Indholdet der skal sendes

    http.setTimeout(2000);                                 // Use 2 seconds timeout for HTTP connection
    http.begin(stringToSend);                              // Start HTTP connection and send HTTP header

    httpCode = http.GET();                                 // Get response from HTTP request

    if (httpCode > 0)                                      // httpCode will be negative on error
    {
      Serial.printf("[HTTP] GET... code: %d\n", httpCode); // Response from server is not an error
      if (httpCode == HTTP_CODE_OK) {                      // Response from server is HTTP CODE 200
        String payload = http.getString();
        Serial.println(payload);
      }
    } else {
      Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }
    http.end();
  }
}

PHP-kode

Inde på webserveren placeres et lille PHP-script, der ser ud som følger. Scriptet udnytter PHP's mail-funktion[3].

<?php
/* 
 * Mail example
 * Bent Arnoldsen, Holstebro HTX 2018
 *
 * Aktiveres med domæne/path/sendMail.php?send=Alarm
 */
if (isset($_GET['send'])) {
	if ($_GET['send'] == "Alarm") {
		mail("mail@domain.dk", "Mail fra Alarmsystem", "Der er Alarm");
	} else if ($_GET['send'] == "Open") {
		mail("mail@domain.dk", "Mail fra Alarmsystem", "Der er Open");
	} else {
		mail("mail@domain.dk", "Mail fra Alarmsystem", "Ikke specificeret");
	}
}
?>
<html>
<h2>Mail-System</h2>
</html>

Referencer