ESP32 - WPA2 Enterprise (802.1x)
Napsal: 05 čer 2018, 15:54
Ahoj, podarilo sa mi ubastliť z troch kódov sketch pre ESP32 dosky, prostredníctvom ktorej je možné sa napojiť na sieť 802.1x, najčastejšie sa s ňou dá stretnúť na unvierzitách (Eduroam), prípadne v korporáciách, väčších firmách. Od štandardných PSK sietí sa odlišuje tým, že vyžaduje okrem hesla do siete aj meno používateľa (a ďalšie mechanizmy na výmenu kľúčov, EAPoL rámce atď..). Každý používateľ má svoje meno (identitu) a heslo a ich kombinácia umožní prístup do siete. Mechanizmus overovania je trošku zložitejší, ESP32 komunikuje len s AP a AP komunikuje s RADIUS serverom, ktorý dosku do siete overuje.
Testoval som pod Eduroam a pod lokálnou sieťou, kde fungoval lokálny RADIUS server. Pri oboch pokusoch o spojenie to bolo úspešné, priemerná doba pripojenia je 4-5 sekúnd, pokým doska preukáže identitu a heslo. Zadávanie certifikátov nebolo potrebné, doska si ich dokázala vyžiadať ako je to napr u Androidu, či Windowsu 8+. Obe 802.1x siete, kde som pripojenie testoval využívali v prvom kroku metódu overenia PEAP a v druhom kroku MsCHAPv2.
Ukážkový sketch obsahuje okrem pripojenia dosky do siete aj pripojenie na externý webserver po HTTP protokole pre overenie konektivity do internetu. Všetko sa vypisuje na Serial monitor. V ukážkovom kóde je nutné zmeniť iba SSID, identitu a heslo, prípadne názov ESP32 dosky v sieti (volitelné).
2018 verzia:
Na test som využil dosku ESP32 Devkit v1 DoIT s čipom WROOM-32.
V prípade, že používate starú verziu pre ESP32 dosky, je možné že tento sketch nebude fungovať z dôvodu zmeny knižníc, pridávam preto aj jemne upravenú verziu pre rok 2017.
2017 verzia:
Testoval som pod Eduroam a pod lokálnou sieťou, kde fungoval lokálny RADIUS server. Pri oboch pokusoch o spojenie to bolo úspešné, priemerná doba pripojenia je 4-5 sekúnd, pokým doska preukáže identitu a heslo. Zadávanie certifikátov nebolo potrebné, doska si ich dokázala vyžiadať ako je to napr u Androidu, či Windowsu 8+. Obe 802.1x siete, kde som pripojenie testoval využívali v prvom kroku metódu overenia PEAP a v druhom kroku MsCHAPv2.
Ukážkový sketch obsahuje okrem pripojenia dosky do siete aj pripojenie na externý webserver po HTTP protokole pre overenie konektivity do internetu. Všetko sa vypisuje na Serial monitor. V ukážkovom kóde je nutné zmeniť iba SSID, identitu a heslo, prípadne názov ESP32 dosky v sieti (volitelné).
2018 verzia:
Kód: Vybrat vše
#include "esp_wpa2.h"
#include <WiFi.h>
String line;
const char* ssid = "magicwifi"; // wifi siet
#define EAP_IDENTITY "identitavsieti" //eap identita
#define EAP_PASSWORD "heslo" //heslo
#define MENOPC "ESP32Devboard"
void setup() {
Serial.begin(115200);
delay(10);
Serial.println();
Serial.print("Pripajam sa na: ");
Serial.println(ssid);
WiFi.disconnect(true);
esp_wifi_sta_wpa2_ent_set_identity((uint8_t *)EAP_IDENTITY, strlen(EAP_IDENTITY));
esp_wifi_sta_wpa2_ent_set_username((uint8_t *)EAP_IDENTITY, strlen(EAP_IDENTITY));
esp_wifi_sta_wpa2_ent_set_password((uint8_t *)EAP_PASSWORD, strlen(EAP_PASSWORD));
esp_wpa2_config_t config = WPA2_CONFIG_INIT_DEFAULT();
esp_wifi_sta_wpa2_ent_enable(&config);
Serial.println("MAC adresa: ");
Serial.println(WiFi.macAddress());
WiFi.begin(ssid); //pripajanie
WiFi.setHostname(MENOPC); //volitelne
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi pripojene");
Serial.println("IP addresa: ");
Serial.println(WiFi.localIP());
}
const char* host = "arduino.php5.sk"; //server na ktory sa pripajame (domena)
void loop() {
delay(5000);
Serial.print("Pripajam sa na server: ");
Serial.println(host);
WiFiClient client;
if (!client.connect(host, 80)) { //pripajanie na server pod HTTP
Serial.println("connection failed");
}
String url = "/rele/rele1.txt"; //request na subor pod serverom
Serial.print("Requesting URL: ");
Serial.println(url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Timeout prebehol, response sa nevratila !");
client.stop();
}
}
while(client.available()) {
line = client.readStringUntil('\n'); //citanie po posledny riadok
Serial.println(line); //ulozenie premennej z response
}
if (line=="VYP"){
Serial.println("Vypnuty spotrebic");
}else if (line=="ZAP"){
Serial.println("Zapnuty spotrebic");
}
Serial.println();
Serial.println("Ukoncene spojenie");
}
V prípade, že používate starú verziu pre ESP32 dosky, je možné že tento sketch nebude fungovať z dôvodu zmeny knižníc, pridávam preto aj jemne upravenú verziu pre rok 2017.
2017 verzia:
Kód: Vybrat vše
#include "esp_wpa2.h"
#include <WiFi.h>
String line;
const char* ssid = "magicwifi"; // wifi siet
#define EAP_IDENTITY "identitavsieti" //eap identita
#define EAP_PASSWORD "heslo" //heslo
#define MENOPC "ESP32Devboard"
void setup() {
Serial.begin(115200);
delay(10);
Serial.println();
Serial.print("Pripajam sa na: ");
Serial.println(ssid);
WiFi.disconnect(true);
esp_wifi_sta_wpa2_ent_set_identity((uint8_t *)EAP_IDENTITY, strlen(EAP_IDENTITY));
esp_wifi_sta_wpa2_ent_set_username((uint8_t *)EAP_IDENTITY, strlen(EAP_IDENTITY));
esp_wifi_sta_wpa2_ent_set_password((uint8_t *)EAP_PASSWORD, strlen(EAP_PASSWORD));
esp_wifi_sta_wpa2_ent_enable();
Serial.println("MAC adresa: ");
Serial.println(WiFi.macAddress());
WiFi.begin(ssid); //pripajanie
WiFi.setHostname(MENOPC); //volitelne
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi pripojene");
Serial.println("IP addresa: ");
Serial.println(WiFi.localIP());
}
const char* host = "arduino.php5.sk"; //server na ktory sa pripajame (domena)
void loop() {
delay(5000);
Serial.print("Pripajam sa na server: ");
Serial.println(host);
WiFiClient client;
if (!client.connect(host, 80)) { //pripajanie na server pod HTTP
Serial.println("connection failed");
}
String url = "/rele/rele1.txt"; //request na subor pod serverom
Serial.print("Requesting URL: ");
Serial.println(url);
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
unsigned long timeout = millis();
while (client.available() == 0) {
if (millis() - timeout > 5000) {
Serial.println(">>> Timeout prebehol, response sa nevratila !");
client.stop();
}
}
while(client.available()) {
line = client.readStringUntil('\n'); //citanie po posledny riadok
Serial.println(line); //ulozenie premennej z response
}
if (line=="VYP"){
Serial.println("Vypnuty spotrebic");
}else if (line=="ZAP"){
Serial.println("Zapnuty spotrebic");
}
Serial.println();
Serial.println("Ukoncene spojenie");
}