Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit d977359

Browse filesBrowse files
authored
Added another overloaded WiFiSTAClass::begin() function that provides… (espressif#6398)
Summary The examples demonstrate how to create a WPA2 Enterprise connection, but it requires using various direct esp_idf functions. This patch is intended to create another overloaded version of the WiFi.begin() function that allows a user to create a WPA2 Enterprise connection in much the same way as different kinds of connections. My only question for the core maintainers is whether I should leave those #ifdef's in there. I added them so that it was easy to disable all the code I added via defines from my platformio.ini file, but they technically aren't necessary. Impact This should make it easier for novice users to create WPA2 Enterprise connections. For my university, I didn't need a root certificate or the client certificate or client key, so I haven't been able to debug those scenarios, but I built the begin functions to allow any one of those to be used, if needed. I can confirm that eduroam-style WPA2 Enterprise networks that only require authentication with a username and password works as expected.
1 parent ba8024c commit d977359
Copy full SHA for d977359

File tree

Expand file treeCollapse file tree

3 files changed

+91
-5
lines changed
Filter options
Expand file treeCollapse file tree

3 files changed

+91
-5
lines changed

‎libraries/WiFi/examples/WiFiClientEnterprise/WiFiClientEnterprise.ino

Copy file name to clipboardExpand all lines: libraries/WiFi/examples/WiFiClientEnterprise/WiFiClientEnterprise.ino
+23-5Lines changed: 23 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
#include <WiFi.h> //Wifi library
22
#include "esp_wpa2.h" //wpa2 library for connections to Enterprise networks
33
#define EAP_IDENTITY "login" //if connecting from another corporation, use identity@organisation.domain in Eduroam
4+
#define EAP_USERNAME "login" //oftentimes just a repeat of the identity
45
#define EAP_PASSWORD "password" //your Eduroam password
56
const char* ssid = "eduroam"; // Eduroam SSID
67
const char* host = "arduino.php5.sk"; //external server domain for HTTP connection after authentification
78
int counter = 0;
9+
10+
// NOTE: For some systems, various certification keys are required to connect to the wifi system.
11+
// Usually you are provided these by the IT department of your organization when certs are required
12+
// and you can't connect with just an identity and password.
13+
// Most eduroam setups we have seen do not require this level of authentication, but you should contact
14+
// your IT department to verify.
15+
// You should uncomment these and populate with the contents of the files if this is required for your scenario (See Example 2 and Example 3 below).
16+
//const char *ca_pem = "insert your CA cert from your .pem file here";
17+
//const char *client_cert = "insert your client cert from your .crt file here";
18+
//const char *client_key = "insert your client key from your .key file here";
19+
820
void setup() {
921
Serial.begin(115200);
1022
delay(10);
@@ -13,11 +25,17 @@ void setup() {
1325
Serial.println(ssid);
1426
WiFi.disconnect(true); //disconnect form wifi to set new wifi connection
1527
WiFi.mode(WIFI_STA); //init wifi mode
16-
esp_wifi_sta_wpa2_ent_set_identity((uint8_t *)EAP_IDENTITY, strlen(EAP_IDENTITY)); //provide identity
17-
esp_wifi_sta_wpa2_ent_set_username((uint8_t *)EAP_IDENTITY, strlen(EAP_IDENTITY)); //provide username --> identity and username is same
18-
esp_wifi_sta_wpa2_ent_set_password((uint8_t *)EAP_PASSWORD, strlen(EAP_PASSWORD)); //provide password
19-
esp_wifi_sta_wpa2_ent_enable();
20-
WiFi.begin(ssid); //connect to wifi
28+
29+
// Example1 (most common): a cert-file-free eduroam with PEAP (or TTLS)
30+
WiFi.begin(ssid, WPA2_AUTH_PEAP, EAP_IDENTITY, EAP_USERNAME, EAP_PASSWORD);
31+
32+
// Example 2: a cert-file WPA2 Enterprise with PEAP
33+
//WiFi.begin(ssid, WPA2_AUTH_PEAP, EAP_IDENTITY, EAP_USERNAME, EAP_PASSWORD, ca_pem, client_cert, client_key);
34+
35+
// Example 3: TLS with cert-files and no password
36+
//WiFi.begin(ssid, WPA2_AUTH_TLS, EAP_IDENTITY, NULL, NULL, ca_pem, client_cert, client_key);
37+
38+
2139
while (WiFi.status() != WL_CONNECTED) {
2240
delay(500);
2341
Serial.print(".");

‎libraries/WiFi/src/WiFiSTA.cpp

Copy file name to clipboardExpand all lines: libraries/WiFi/src/WiFiSTA.cpp
+62Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ extern "C" {
4242
#include "lwip/dns.h"
4343
#include <esp_smartconfig.h>
4444
#include <esp_netif.h>
45+
#include "esp_wpa2.h"
4546
}
4647

4748
// -----------------------------------------------------------------------------------------------------------------------
@@ -145,6 +146,67 @@ wl_status_t WiFiSTAClass::status()
145146
return (wl_status_t)xEventGroupClearBits(_sta_status_group, 0);
146147
}
147148

149+
/**
150+
* Start Wifi connection with a WPA2 Enterprise AP
151+
* if passphrase is set the most secure supported mode will be automatically selected
152+
* @param ssid const char* Pointer to the SSID string.
153+
* @param method wpa2_method_t The authentication method of WPA2 (WPA2_AUTH_TLS, WPA2_AUTH_PEAP, WPA2_AUTH_TTLS)
154+
* @param wpa2_identity const char* Pointer to the entity
155+
* @param wpa2_username const char* Pointer to the username
156+
* @param password const char * Pointer to the password.
157+
* @param ca_pem const char* Pointer to a string with the contents of a .pem file with CA cert
158+
* @param client_crt const char* Pointer to a string with the contents of a .crt file with client cert
159+
* @param client_key const char* Pointer to a string with the contants of a .key file with client key
160+
* @param bssid uint8_t[6] Optional. BSSID / MAC of AP
161+
* @param channel Optional. Channel of AP
162+
* @param connect Optional. call connect
163+
* @return
164+
*/
165+
wl_status_t WiFiSTAClass::begin(const char* wpa2_ssid, wpa2_auth_method_t method, const char* wpa2_identity, const char* wpa2_username, const char *wpa2_password, const char* ca_pem, const char* client_crt, const char* client_key, int32_t channel, const uint8_t* bssid, bool connect)
166+
{
167+
if(!WiFi.enableSTA(true)) {
168+
log_e("STA enable failed!");
169+
return WL_CONNECT_FAILED;
170+
}
171+
172+
if(!wpa2_ssid || *wpa2_ssid == 0x00 || strlen(wpa2_ssid) > 32) {
173+
log_e("SSID too long or missing!");
174+
return WL_CONNECT_FAILED;
175+
}
176+
177+
if(wpa2_identity && strlen(wpa2_identity) > 64) {
178+
log_e("identity too long!");
179+
return WL_CONNECT_FAILED;
180+
}
181+
182+
if(wpa2_username && strlen(wpa2_username) > 64) {
183+
log_e("username too long!");
184+
return WL_CONNECT_FAILED;
185+
}
186+
187+
if(wpa2_password && strlen(wpa2_password) > 64) {
188+
log_e("password too long!");
189+
}
190+
191+
if(ca_pem) {
192+
esp_wifi_sta_wpa2_ent_set_ca_cert((uint8_t *)ca_pem, strlen(ca_pem));
193+
}
194+
195+
if(client_crt) {
196+
esp_wifi_sta_wpa2_ent_set_cert_key((uint8_t *)client_crt, strlen(client_crt), (uint8_t *)client_key, strlen(client_key), NULL, 0);
197+
}
198+
199+
esp_wifi_sta_wpa2_ent_set_identity((uint8_t *)wpa2_identity, strlen(wpa2_identity));
200+
if(method == WPA2_AUTH_PEAP || method == WPA2_AUTH_TTLS) {
201+
esp_wifi_sta_wpa2_ent_set_username((uint8_t *)wpa2_username, strlen(wpa2_username));
202+
esp_wifi_sta_wpa2_ent_set_password((uint8_t *)wpa2_password, strlen(wpa2_password));
203+
}
204+
esp_wifi_sta_wpa2_ent_enable(); //set config settings to enable function
205+
WiFi.begin(wpa2_ssid); //connect to wifi
206+
207+
return status();
208+
}
209+
148210
/**
149211
* Start Wifi connection
150212
* if passphrase is set the most secure supported mode will be automatically selected

‎libraries/WiFi/src/WiFiSTA.h

Copy file name to clipboardExpand all lines: libraries/WiFi/src/WiFiSTA.h
+6Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,11 @@
3030
#include "esp_event.h"
3131
#endif
3232

33+
typedef enum {
34+
WPA2_AUTH_TLS = 0,
35+
WPA2_AUTH_PEAP = 1,
36+
WPA2_AUTH_TTLS = 2
37+
} wpa2_auth_method_t;
3338

3439
class WiFiSTAClass
3540
{
@@ -39,6 +44,7 @@ class WiFiSTAClass
3944

4045
public:
4146

47+
wl_status_t begin(const char* wpa2_ssid, wpa2_auth_method_t method, const char* wpa2_identity=NULL, const char* wpa2_username=NULL, const char *wpa2_password=NULL, const char* ca_pem=NULL, const char* client_crt=NULL, const char* client_key=NULL, int32_t channel=0, const uint8_t* bssid=0, bool connect=true);
4248
wl_status_t begin(const char* ssid, const char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
4349
wl_status_t begin(char* ssid, char *passphrase = NULL, int32_t channel = 0, const uint8_t* bssid = NULL, bool connect = true);
4450
wl_status_t begin();

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.