Bonjour,
J’ai une caméra dans une maison secondaire ou il y a l’internet ORANGE, le souci est que l’adresse IP n’est pas fixe.
Je cherche un petit programme pour mettre dans un ESP8266 afin de transmettre un email vers une adresse GMAIL par exemple avec l’adresse IP publique.
Merci d’avance.
Je n'ai pas de programme tout fait, as tu essayé les exemples d'une librairie (ex EMailSender)?
Personnellement j'essayerais plus de passer par un service noIP(ex noip.com).
Bonsoir Terwal,
Merci de pour ta réponse mais je reste sur une électronique.
je préfère ![]()
Je ne n'ai pas proposer de passer sur autre chose.
Je te disais que plutôt d'envoyer un email, de mettre a jour le ddns, avoir l'ip de chez toi disponible sans devoir lire le dernier emails, simplement en rentrant un nom de domaine à la place de l'IP externe dans les services que tu utilises.
Désolé mon domaine c'est surtout l'électronique, malheureusement je ne comprend rien à ce que tu dis désolé.
Oui, je vois ça
.
As tu regardé ce que propose noip.con ?
Pour décrire plus en détail, je suppose que tu as besoin d'accès à quelque chose chez toi de l'extérieur, donc avec l'IP publique que ton opérateur t'a attribué(ex 81.82.83.84).
mais là ou tu utilise cette adresse (ex 81.82.83.84), tu peux utiliser un nom de domaine si tu en a un(ex mondomaine.noip.com)
Pour cela au lieu de t'envoyer un e-mail, tu fait une requête HTTP via ton ESP8266 sur l'url de noip avec tes identifiants, du coup noip, ce charge de faire correspond ton nom de domaine à la nouvelle IP que ton fournisseur d'accès t'a attribué.
Bonjour Terwal,
Alors je ne l’ai pas dit mais j’ai 2 programmes pour ESP8266, qui fonctionnent (Je précise, car j’ai testé les deux).
J’ai essayé de les fusionnaient mais sans succès, je ne suis pas assez expert en programmation.
Je te les joins au cas ou tu pourrais le faire.
Merci d’avance.
Envoi_Gmail.ino (1,8 Ko)
Ip_Publique.ino (2,4 Ko)
fusionner pardon pour les fautes ![]()
Salut,
solution hors ESP : ta box propose vraisemblablement un service de type DynDNS. Cela te permet de t'adresser à ton réseau interne non pas par ton IP publique mais un nom de domaine (il y en a des gratuits)
Oui, c'est ce que je lui ais proposer ![]()
Je vais regardais, mais tu utilises des delay, qu'il faudra faire sauter
Bonsoir,
Je préfère toujours utiliser mon ESP 8266.
tu réponds à qui ?
A ProfesseurMephisto
![]()
Bonjour Terwal,
Ah tu réussi à fusionner les deux programme.
bon week-end.
Salut,
sans garantit de bon fonctionnement, car je n'ai pas testé
mais quelque chose comme ça:
#include <Arduino.h>
#include <ESP8266WiFi.h>
const bool debug = true;
const int loopDelay = 60 * 1000;
//WiFi connection
const char *ssid = "xxxxx"; // your wifi SSID
const char *password = "xxxxx"; // Your WiFi password
const char* host = "smtp.free.fr";
const int SmtpPort = 25;
bool connectToWiFi(int timeout = 60000);
bool isIpFyAvailable();
void getPublicIP(int timeout = 5000);
void log(String message, int8 part = -1);
WiFiClient wifiClient;
String ipfyAddress = String("api.ipify.org");
unsigned long abortTime;
String ip;
void setup() {
delay(2000); // for things to catch up
Serial.begin(115200);
log("");
log("Starting up...");
// -- Connect to Wi-Fi
if (!connectToWiFi()) {
delay(30000); // wait for 30 seconds and reboot
ESP.restart();
}
// -- Make sure IpiFy is available
if (!isIpFyAvailable()) {
log("Hmmm... IpiFy is not available! Aborting...");
return;
}
}
void loop() {
String oldIP = ip;
// make sure WiFi is connected
if (WiFi.status() != WL_CONNECTED)
connectToWiFi();
// get the IP
if (wifiClient.connected())
getPublicIP();
if (!ip.equalsIgnoreCase(oldIP)) sendEmail();
log(ip);
delay(loopDelay);
}
bool connectToWiFi(int timeout) {
abortTime = millis() + timeout;
WiFi.begin(ssid, password);
log("Connecting to " + String(ssid) + " ...");
while (WiFi.status() != WL_CONNECTED && (abortTime > millis())) {
delay(1000);
log(".", 1);
}
if (abortTime > millis()) {
log("connected at:", 1);
Serial.println(WiFi.localIP());
return true;
} else {
log(" timedout :(", 2);
return false;
}
}
bool isIpFyAvailable() {
return wifiClient.connect(ipfyAddress, 80);
}
void getPublicIP(int timeout) {
abortTime = millis() + timeout;
wifiClient.println("GET / HTTP/1.1");
wifiClient.println("Host: " + ipfyAddress);
wifiClient.println();
delay(5000);
while (wifiClient.available()) {
if (abortTime > millis()) {
log("!!! Wifi Client Timedout!");
wifiClient.stop();
return;
}
ip = wifiClient.readStringUntil('\n');
}
}
/**
* Send an e-mail on SMTP protocol
*/
void sendEmail() {
WiFiClient client;
log("connecting to ");
log(host);
if (!client.connect(host, SmtpPort)) {
log("connection failed");
return;
}
//simple séquence de commandes sans analyse des retours,
//SMTP est un protocole, il faufrait traiter les réponses !!
client.println("xxxxx"); // identifiant , sans @free.fr
delay(500);
client.println("MAIL FROM:<xxxxx>");
delay(500);
client.println("RCPT TO:<xxxxx>");
delay(500);
client.println("DATA");
delay(1000);
client.println("From: <xxxxx>"); // dans le message
client.println("Subject: attention... message ");
client.println("TO: <xxxxx>"); // dans le message
delay(100);
client.println("second test");
client.println("emis par ESP8266");
client.println();
client.println(".");
delay(1000);
client.println("quit");
// Read all the lines of the reply from server and print them to Serial
while (client.available()) {
String line = client.readStringUntil('\r');
log(line);
}
client.stop();
log("");
log("closing connection");
}
/**
* Print message to Serial
*
* @message message to print
* @part [-1, 0, 1, 2] -1: println. 0: Start of a new line, 1: middle part of the line, 2: end of the line
*/
void log(String message, int8 part) {
if (debug) {
if (part == -1)
Serial.println("[PIP] " + message);
else if (part == 0)
Serial.print("[PIP] " + message);
else if (part == 1)
Serial.print(message);
else if (part == 2)
Serial.println(message);
}
}
Salut,
alors merci déjà pour ton aide.
il y a 2 choses qui ne fonctionne pas, il n'envoi pas l'adresse IP PUBLIC, l'envoi de l'email se fait bien je le reçois, je me suis rendu compte que l'email arrivait dans ma boite Gmail avant que l'adresse IP PUBLIC n'apparaisse sur le l'IDE Arduino
je te met ce que me donne l'interface série de l'IDE ci-dessous.
[PIP] Starting up...
[PIP] Connecting to XXXXX ...
......connected at:192.XXX.X.XXX
[PIP] connecting to
[PIP] smtp.free.fr
[PIP] 220 smtp5-g21.free.fr ESMTP Postfix
[PIP]
502 5.5.2 Error: command not recognized
[PIP]
250 2.1.0 Ok
[PIP]
250 2.1.5 Ok
[PIP]
354 End data with .
[PIP]
250 2.0.0 Ok: queued as D18195FE03
[PIP]
221 2.0.0 Bye
2 eme souci c'est qu'il répète l'adresse IP PUBLIC je pense par rapport au délai :
const int loopDelay = 60 * 1000; que tu as mis, mais il ne répète pas l'email (Voir interface série IDE Arduino).
[PIP]
[PIP] closing connection
[PIP] 88.169.54.41
[PIP] 88.169.54.41
[PIP] 88.169.54.41
[PIP] 88.169.54.41
[PIP] 88.169.54.41
C'est pas loin d'être bon ![]()
Bon dimanche.
[quote="clbeauvais, post:16, topic:1222711"]
il y a 2 choses qui ne fonctionne pas, il n'envoi pas l'adresse IP PUBLIC, l'envoi de l'email se fait bien je le reçois[/quote]
Alors je ne dirais pas que cela ne fonctionne pas ![]()
J'ai fusionné deux programmes, je n'ai ajouté aucune fonctionnalité.
Je te laisse modifier le code, pour passer la variable qui contient ton IP en paramètre de la fonction "sendEmail" et de faire un "println" au bon endroit.
Si tu n'y arrive vraiment pas, on pourra le faire ensemble ![]()
J'ai laissé l'instruction log qui affiche ton IP internet après l'appel de la fonction "sendEmail"
Même si cela me surprend, c'est toujours possible.
pas sûre de tout comprendre ce que tu as voulu dire.
Mais oui, j'ai repris ton code tel quels, d'ailleurs il y a un petit bug que j'ai introduit, mais qui ne corresponds pas à ton soucis.
Ton code récupère l'IP et l'affichage en boucle puisque dans la fonction "loop".
Le "delay" va temporiser la réexécution de la fonction, pour que cela ne se reproduit pas trop souvent.
Si tu veux afficher, l'IP uniquement lorsque tu envois l'e-mail, il faut faire les deux à l'intérieur du IF.
du coup pour corriger mon bug, il faut les trois instructions qui suivent le "if (wifiClient.connected())" soit dans le if et du coup dans le else, peut être afficher sur le port série, que l'on n'est pas connecté.
Bonsoir,
Alors comment dire… je suis nul en programmation, mais assez bon en électronique vue que c’est mon métier.
Je n’ai rien compris à tes explication mais cela ne m’étonne pas.
Je te propose une chose si tu veux, j’ai fais une électronique pour à la fois programmer et une alarme pour un ami.
Je me propose de t’en envoyer un exemplaire pour te remercier déjà de ton aide mais aussi cela sera plus simple pour vérifier le programme.
Tu me dis ce que tu en penses ?
Tu trouveras ci-dessous la documentation du circuit que j’ai réalisé.
C'est l'occasion de progresser, la programmation étant, beaucoup plus simpliste que l'électronique, cela ne devrait pas être un programme pour toi ![]()
Pas besoin de me motiver, si vraiment la programmation ne t'intéresse pas, je ferais les petites modifications, dont tu as besoin.
PS: je n'ai pas vu la documentation, c'est de l'image dont tu parle ?
Salut,
Alors je ne suis pas ici pour motiver personne, mais pour trouve une solution à mon problème, après des circuits comme cela j’en ai plusieurs, donc cela ne me pose pas de problèmes de le partager avec la personne qui m’aide.
J’aimerai bien connaitre la programmation, mais j’ai déjà pas mal à faire en électronique est je me suis déjà penché sur la programmation mais cela ne fait pas « tilt » dans mon esprit (Chacun son truc). Je trouve qu’associer l’électronique avec la programmation c’est top.
Tu trouveras le schéma du module ci-dessous.

_2021-08-26.pdf|attachment (62,5 Ko)
