initial commit
This commit is contained in:
commit
af67b7de53
17
README.md
Normal file
17
README.md
Normal file
|
@ -0,0 +1,17 @@
|
|||
# @BayernWLAN login with ESP
|
||||
|
||||
This repository contains two example how to log in to the captive portal of `@BayernWLAN` wifi networks using an ESP.
|
||||
|
||||
Normally after connecting to the network you would click the connect button in the captive portal of your browser to get access to the internet.
|
||||
|
||||
![Captive Portal](images/captive-portal.png)
|
||||
|
||||
Of course this is difficult to do with the ESP since you have neither a web browser with a graphical interface, nor a mouse to click any buttons.
|
||||
|
||||
Instead, we can emulate the click on the button by sending a specific `HTTP GET` request to the access point.
|
||||
|
||||
There is [one example][micropython-example] for use with MicroPython and a [second example][arduino-example] for the Arduino IDEBoards Manager.
|
||||
The arduino code uses the libraries `HTTPClient.h` and `WiFi.h` which should be built-in.
|
||||
|
||||
[micropython-example]: example_micropython.py
|
||||
[arduino-example]: example_arduino.ino
|
79
example_arduino.ino
Normal file
79
example_arduino.ino
Normal file
|
@ -0,0 +1,79 @@
|
|||
/*
|
||||
* Example of how to log in to captive portal of @BayernWLAN with an
|
||||
* ESP32
|
||||
*
|
||||
* The program connect to the @BayernWLAN wifi and sends a HTTP request
|
||||
* that emulates the click on the Connect button in the captive portal.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <WiFi.h>
|
||||
#include <HTTPClient.h>
|
||||
|
||||
const char* ssid = "@BayernWLAN"; //Enter SSID
|
||||
const char* password = "";
|
||||
|
||||
// root certificate for the vodafone hotspot
|
||||
const char* root_ca= \
|
||||
"-----BEGIN CERTIFICATE-----\n"
|
||||
"MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n"
|
||||
"MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
|
||||
"d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n"
|
||||
"QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\n"
|
||||
"MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
|
||||
"b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n"
|
||||
"9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\n"
|
||||
"CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\n"
|
||||
"nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n"
|
||||
"43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\n"
|
||||
"T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\n"
|
||||
"gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\n"
|
||||
"BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\n"
|
||||
"TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\n"
|
||||
"DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\n"
|
||||
"hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n"
|
||||
"06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\n"
|
||||
"PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\n"
|
||||
"YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\n"
|
||||
"CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n"
|
||||
"-----END CERTIFICATE-----\n";
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
|
||||
// Connect to wifi
|
||||
WiFi.begin(ssid, password);
|
||||
|
||||
// Wait some time to connect to wifi
|
||||
for(int i = 0; i < 10 && WiFi.status() != WL_CONNECTED; i++) {
|
||||
Serial.print(".");
|
||||
delay(1000);
|
||||
}
|
||||
Serial.println("WiFi connected!");
|
||||
|
||||
// Send HTTP request for login
|
||||
HTTPClient http;
|
||||
http.begin("hotspot.vodafone.de", 443, "/api/v4/login?loginProfile=6", root_ca);
|
||||
String payload = String("Accept: */*\r\n\r\n");
|
||||
size_t payload_size = payload.length();
|
||||
int httpCode = http.sendRequest("GET", (uint8_t *) payload.c_str(), payload_size);
|
||||
|
||||
if (httpCode > 0) { //Check for the returning code
|
||||
String payload = http.getString();
|
||||
Serial.println(httpCode);
|
||||
Serial.println(payload);
|
||||
}
|
||||
else {
|
||||
Serial.println("Error on HTTP request");
|
||||
Serial.println(httpCode);
|
||||
}
|
||||
|
||||
http.end();
|
||||
|
||||
Serial.println("IP address: ");
|
||||
Serial.println(WiFi.localIP());
|
||||
}
|
||||
|
||||
void loop() {
|
||||
|
||||
}
|
36
example_micropython.py
Normal file
36
example_micropython.py
Normal file
|
@ -0,0 +1,36 @@
|
|||
import network
|
||||
import ussl
|
||||
import socket
|
||||
import time
|
||||
|
||||
def sock(host, port, ssl = False):
|
||||
s = socket.socket()
|
||||
ai = socket.getaddrinfo(host, port)
|
||||
addr = ai[0][-1]
|
||||
s.connect(addr)
|
||||
if ssl:
|
||||
return ussl.wrap_socket(s)
|
||||
else:
|
||||
return s
|
||||
|
||||
def http_get(sock, host, path):
|
||||
sock.write(("GET " + path + " HTTP/1.1\r\nHost: " + host + "\r\nUser-Agent: curl/7.60.0\r\nAccept: */*\r\n\r\n").encode('utf-8'))
|
||||
return sock
|
||||
|
||||
def connect_wlan(timeout = None):
|
||||
wlan = network.WLAN(network.STA_IF)
|
||||
wlan.active(True)
|
||||
if not wlan.isconnected():
|
||||
start = time.ticks_ms()
|
||||
wlan.connect('@BayernWLAN')
|
||||
while wlan.status() != network.STAT_GOT_IP and (not timeout or time.ticks_diff(time.ticks_ms(), start) < timeout):
|
||||
time.sleep_ms(100)
|
||||
return wlan.status()
|
||||
|
||||
def login_wlan():
|
||||
s = sock("hotspot.vodafone.de", 443, True)
|
||||
http_get(s, "hotspot.vodafone.de", "/api/v4/login?loginProfile=6")
|
||||
return s
|
||||
|
||||
connect_wlan()
|
||||
login_wlan().read(32)
|
BIN
images/captive-portal.png
Normal file
BIN
images/captive-portal.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 118 KiB |
Loading…
Reference in New Issue
Block a user