-
Notifications
You must be signed in to change notification settings - Fork 2
/
WifiManager.cpp
157 lines (138 loc) · 5.22 KB
/
WifiManager.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include "WifiManager.h"
WifiManager::WifiManager(Application *c)
{
lconfig=c;
}
// ------------------------------------------------------------------------------------------------------------------------------------------------------
// Méthodes de connexion Wifi
// ------------------------------------------------------------------------------------------------------------------------------------------------------
void WifiManager::disconnect()
{
WiFi.disconnect();
}
// Initialisation du point d'accès
void WifiManager::initAP()
{
WiFi.mode(WIFI_AP); //WIFI_AP_STA); // Mode point d'accès
IPAddress ip(192, 168, 1, 1);
IPAddress gateway(1, 2, 3, 1);
IPAddress subnet(255, 255, 255, 0);
WiFi.softAPConfig(ip, gateway, subnet);
IPAddress apip = WiFi.softAPIP();
uint8_t mac[WL_MAC_ADDR_LENGTH];
WiFi.softAPmacAddress(mac);
String macID = String(mac[WL_MAC_ADDR_LENGTH - 2], HEX) +
String(mac[WL_MAC_ADDR_LENGTH - 1], HEX);
macID.toUpperCase();
String AP_NameString = "ESP8266 " + macID;
const char WiFiAPPSK[] = "password";
char AP_NameChar[AP_NameString.length() + 1];
memset(AP_NameChar, 0, AP_NameString.length() + 1);
for (int i=0; i<AP_NameString.length(); i++)
AP_NameChar[i] = AP_NameString.charAt(i);
WiFi.softAP(AP_NameChar, WiFiAPPSK);
DEBUG_PRINTLN(F("Wifi AP mode"));
lconfig->AddLog(F("Wifi AP mode"));
}
// Initialisation du Wifi
void WifiManager::initWifi()
{
// Si le ssid n'est pas ESP8266 (le fichier de sauvegarde contient des données de connexions sauvegardées)
if (lconfig->Wssid == "ESP8266")
{
initAP(); // Initialisation du point d'accès
}
else // Sinon le fichier de sauvegarde n'a pas de données de connexion sauvegardées
{
// Conversion String en char*
char* ssid = new char[lconfig->Wssid.length()+1];
strcpy(ssid, lconfig->Wssid.c_str());
// Conversion String en char*
char* pwd = new char[lconfig->Wpass.length()+1];
strcpy(pwd, lconfig->Wpass.c_str());
WiFi.mode(WIFI_STA);
WiFi.disconnect(); // Fermeture d'une eventuelle connexion
digitalWrite(LED_BUILTIN, HIGH); // Eteindre la LED
// Si la connexion a fonctionné alors on sauvegarde les données de connexion dans la mémoire
if (connexion(ssid, pwd, 20)) // 20 = 20 secondes avant l'estimation de l'echec
{
//saveWifiCredentials(ssid, pwd);
lconfig->AddLog("Connected to network");
}
else // Sinon on lance le point d'accès WiFi pour que l'utilisateur se connecte et modifie les données de connexion
{
WiFi.disconnect();
initAP();
}
}
}
void WifiManager::parseBytes(const char* str, char sep, byte* bytes, int maxBytes, int base) {
for (int i = 0; i < maxBytes; i++) {
bytes[i] = strtoul(str, NULL, base); // Convert byte
str = strchr(str, sep); // Find next separator
if (str == NULL || *str == '\0') {
break; // No more separators, exit
}
str++; // Point to next character after separator
}
}
// Connexion au Wifi : retourne true si reussi, sinon false
bool WifiManager::connexion(char *ssid, char *pwd, int expiration)
{
bool aRetourner = false;
// IP config test
DEBUG_PRINT(F("Chosen IP: "));
DEBUG_PRINTLN(lconfig->Ip);
//lconfig->AddLog("IP: "+lconfig->Ip);
if (lconfig->Ip!="0.0.0.0" && lconfig->Ip!="")
{
byte ip[4];
parseBytes(lconfig->Ip.c_str(), '.', ip, 4, 10);
byte gat[4];
parseBytes(lconfig->Gat.c_str(), '.', gat, 4, 10);
byte dns[4];
parseBytes(lconfig->Dns.c_str(), '.', dns, 4, 10);
WiFi.config(ip, dns, gat);
}
WiFi.begin(ssid, pwd); // Initialisation de la connexion
DEBUG_PRINT(F("Working to connect"));
int timeout = 0; // Temps d'attente de la connexion avant echec
// Attendre la connexion, si ellsee prends plus de 10 secondes, impossible de se connecter
while (WiFi.status() != WL_CONNECTED && timeout < expiration) {
// Clignotement de la LED pour notifier la volonté de connexion et incrémentation du timer d'expiration
digitalWrite(LED_BUILTIN, LOW);
timeout++;
delay(500);
DEBUG_PRINT(F("."));
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
}
if (timeout < expiration) // Si la connexion a reussi
{
digitalWrite(LED_BUILTIN, LOW); // Allumer la LED pour notifier que la carte est connectée
DEBUG_PRINT(F("IP address: "));
DEBUG_PRINTLN(WiFi.localIP());
lconfig->AddLog("IP address: "+WiFi.localIP());
aRetourner = true;
}
else // Si la connexion a échoué
{
digitalWrite(LED_BUILTIN, HIGH); // Eteindre la LED pour notifier l'echec de connexion
}
return aRetourner;
}
// Retourne les informations de connexion de la carte
String WifiManager::getWiFiInfo()
{
String adresseIP = ipToString(WiFi.localIP());
String aRetourner = WiFi.SSID() + ";" + adresseIP + ";" + lconfig->Wssid + ";" + lconfig->Wpass + ";";
// String aRetourner = lconfig->Wssid + ";" + lconfig->Wpass + ";";
return aRetourner;
}
// Convertit un objet adresse ip en chaîne de caractères affichable
String WifiManager::ipToString(IPAddress ip) {
String s = "";
for (int i = 0; i < 4; i++)
s += i ? "." + String(ip[i]) : String(ip[i]);
return s;
}