Initial commit

This commit is contained in:
2025-11-30 15:23:20 +07:00
commit be47032155
13 changed files with 666 additions and 0 deletions
+5
View File
@@ -0,0 +1,5 @@
.pio
.vscode/.browse.c_cpp.db*
.vscode/c_cpp_properties.json
.vscode/launch.json
.vscode/ipch
+10
View File
@@ -0,0 +1,10 @@
{
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
"platformio.platformio-ide"
],
"unwantedRecommendations": [
"ms-vscode.cpptools-extension-pack"
]
}
+37
View File
@@ -0,0 +1,37 @@
This directory is intended for project header files.
A header file is a file containing C declarations and macro definitions
to be shared between several project source files. You request the use of a
header file in your project source file (C, C++, etc) located in `src` folder
by including it, with the C preprocessing directive `#include'.
```src/main.c
#include "header.h"
int main (void)
{
...
}
```
Including a header file produces the same results as copying the header file
into each source file that needs it. Such copying would be time-consuming
and error-prone. With a header file, the related declarations appear
in only one place. If they need to be changed, they can be changed in one
place, and programs that include the header file will automatically use the
new version when next recompiled. The header file eliminates the labor of
finding and changing all the copies as well as the risk that a failure to
find one copy will result in inconsistencies within a program.
In C, the convention is to give header files names that end with `.h'.
Read more about using header files in official GCC documentation:
* Include Syntax
* Include Operation
* Once-Only Headers
* Computed Includes
https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
+46
View File
@@ -0,0 +1,46 @@
This directory is intended for project specific (private) libraries.
PlatformIO will compile them to static libraries and link into the executable file.
The source code of each library should be placed in a separate directory
("lib/your_library_name/[Code]").
For example, see the structure of the following example libraries `Foo` and `Bar`:
|--lib
| |
| |--Bar
| | |--docs
| | |--examples
| | |--src
| | |- Bar.c
| | |- Bar.h
| | |- library.json (optional. for custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
| |
| |--Foo
| | |- Foo.c
| | |- Foo.h
| |
| |- README --> THIS FILE
|
|- platformio.ini
|--src
|- main.c
Example contents of `src/main.c` using Foo and Bar:
```
#include <Foo.h>
#include <Bar.h>
int main (void)
{
...
}
```
The PlatformIO Library Dependency Finder will find automatically dependent
libraries by scanning project source files.
More information about PlatformIO Library Dependency Finder
- https://docs.platformio.org/page/librarymanager/ldf.html
+16
View File
@@ -0,0 +1,16 @@
; PlatformIO Project Configuration File
;
; Build options: build flags, source filter
; Upload options: custom upload port, speed and extra flags
; Library options: dependencies, extra library storages
; Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html
[env:nodemcu-32s]
platform = espressif32
board = nodemcu-32s
framework = arduino
board_build.filesystem = littlefs
lib_deps = fhessel/esp32_https_server@^1.0.0
+21
View File
@@ -0,0 +1,21 @@
#include <LittleFS.h>
void writeFile(const char *path, String message)
{
File file = LittleFS.open(path, "w");
if (!file)
{
Serial.println("Failed to open file for writing");
}
if (file.print(message))
{
Serial.printf("File %s written.\n", path);
}
else
{
Serial.printf("Writing to file %s failed\n", path);
}
delay(1000);
file.close();
}
+71
View File
@@ -0,0 +1,71 @@
#include <HTTPSServer.hpp>
using namespace httpsserver;
std::string sessionToken;
bool checkHeader(HTTPRequest *req)
{
auto auth = req->getHeader("Authorization");
std::string bearer = "Bearer ";
bearer.append(sessionToken);
return auth == bearer;
}
void restart(HTTPRequest *req, HTTPResponse *res)
{
if (!checkHeader(req))
{
res->setStatusCode(403);
return;
}
res->setStatusCode(200);
ESP.restart();
}
void logs(HTTPRequest *req, HTTPResponse *res)
{
if (!checkHeader(req))
{
res->setStatusCode(403);
return;
}
res->setHeader("Content-Type", "application/json");
res->println("[]");
}
uint32_t getRandom()
{
return *(volatile uint32_t *)0x3FF20E44;
}
const char *charSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
const uint8_t tokenLength = 16;
std::string getToken()
{
Serial.println(sizeof(charSet));
std::string token;
token.reserve(tokenLength);
for (uint8_t i = 0; i < tokenLength; i++)
{
token.push_back(charSet[random(0, sizeof(charSet) - 1)]);
}
sessionToken = token;
return sessionToken;
}
void setupApi(HTTPSServer *server)
{
ResourceNode *restartNode = new ResourceNode("/api/restart", "GET", restart);
ResourceNode *logsNode = new ResourceNode("/api/logs", "GET", logs);
server->registerNode(restartNode);
server->registerNode(logsNode);
}
+60
View File
@@ -0,0 +1,60 @@
#include <Arduino.h>
const char *server_cert PROGMEM = R"EOF(
-----BEGIN CERTIFICATE-----
MIIEJzCCAw+gAwIBAgIUFdkVCFw9RTqLgFY3gH1ok1qWYhowDQYJKoZIhvcNAQEL
BQAwgZkxCzAJBgNVBAYTAlRIMRIwEAYDVQQIDAlOb25nLUtoYWkxFzAVBgNVBAoM
DlRyYXNoYmluIEdhbWVzMRQwEgYDVQQLDAtJb1QgRGV2aWNlczEaMBgGA1UEAwwR
bGl0ZWF1dGggTG9jYWwgQ0ExKzApBgkqhkiG9w0BCQEWHGxpbmVzb2Zjb2Rlc0Bk
YWlsaXRhdGlvbi54eXowHhcNMjUxMTA5MDgxNzUxWhcNMjYxMTA5MDgxNzUxWjCB
ljELMAkGA1UEBhMCVEgxEjAQBgNVBAgMCU5vbmctS2hhaTEXMBUGA1UECgwOVHJh
c2hiaW4gR2FtZXMxFDASBgNVBAsMC0lvVCBEZXZpY2VzMRcwFQYDVQQDDA5saXRl
YXV0aC5sb2NhbDErMCkGCSqGSIb3DQEJARYcbGluZXNvZmNvZGVzQGRhaWxpdGF0
aW9uLnh5ejCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAN+nuEe+u475
6WOzrNL/4sdjwxTlRfIQ2yTrhQE3iVvryzzt8agleyB3+B9/PlNw68t8pg7PCmPI
RhDbrP1qFfU1rYsOuS0NWzABB35hJG1NbHxvUnu5K3EEibIA4pSRn3l0EMOe6oeX
8IdRg0Wl2iXckDGBXzPWxWQAPkzB3toLIG8jGtjoyJ0lzPkxdpXBo3TZZuZnIXU3
B86Ejhk0iFcoO9Jz3BQKsvA1NtG9aicEsJTHu2lkqSNDK6JlEYRfH12C8ANNwTBf
yLLmmE1VmvzorzJOrw/NCRVMAvM7CiiHPQHrgpB563ijCxG+TOh0rQTkosSxMG+t
XPpk/sw1vZECAwEAAaNoMGYwHwYDVR0jBBgwFoAUGIiWaK06C0piayKrZ8nGLZ6S
/3QwCQYDVR0TBAIwADAZBgNVHREEEjAQgg5saXRlYXV0aC5sb2NhbDAdBgNVHQ4E
FgQU78QuM1qvnifVMfFpz27jzPRS4DUwDQYJKoZIhvcNAQELBQADggEBADJKAZXm
i/P2U/BFZh66etw4siM3uVXtIuoL4+wSVNZgb2yOpLGk0FRWvuuIJ4SxMtlsva5/
+5p3O/y3tMAcylVj+kn6h7V5/6/RhNYb8BbmIDMViBxkPqEu7CPnfrtVSwcIXJ44
P35t6dFuc1W21JL3yNf2EkB32DAt+smjHDKV6izmTovGcbkeTMf/TUJv7J4bnp52
UhRZob0cQbb1HdDmZ6HTauJxzixKxUk043s1Sq8j+pvMVaqDVfapoqqPxSv+ml/j
Vu/h/ewarRvnSjFloPFSgyeQjwS3TpA08ppdIuAcF589q5fW+IoG8jmFSetZnr55
z0xONgWPCvoS4aA=
-----END CERTIFICATE-----
)EOF";
const char *server_private_key PROGMEM = R"EOF(
-----BEGIN PRIVATE KEY-----
MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDfp7hHvruO+elj
s6zS/+LHY8MU5UXyENsk64UBN4lb68s87fGoJXsgd/gffz5TcOvLfKYOzwpjyEYQ
26z9ahX1Na2LDrktDVswAQd+YSRtTWx8b1J7uStxBImyAOKUkZ95dBDDnuqHl/CH
UYNFpdol3JAxgV8z1sVkAD5Mwd7aCyBvIxrY6MidJcz5MXaVwaN02WbmZyF1NwfO
hI4ZNIhXKDvSc9wUCrLwNTbRvWonBLCUx7tpZKkjQyuiZRGEXx9dgvADTcEwX8iy
5phNVZr86K8yTq8PzQkVTALzOwoohz0B64KQeet4owsRvkzodK0E5KLEsTBvrVz6
ZP7MNb2RAgMBAAECggEAE0i4FjGPJPcN5VuY53GKSXRj3fGd3A8RgievhmkWNh+I
3NZMW5ntuaE2eurDAjlOj3NOMyEtbWiXh/0U9521yniIH+ETXNvVtLgmAALau/Ts
yXbkxweyg/Jm9/rlDnfW5wc3qdJSOQJECjrgRXlVK6YOpcIYphTa3LI7rO0bbLPX
Gp/IDFUFYCbQXqQ3TiAG00F+m5/7XxEQdq5y/cssJR8mdyeBKV6q+iwcbfUx7w/q
eXZVK2kNRjEYuN+Mmq/ccHtN3Px5jmocqzewwpRmc3T7ml5tN1mTSSkhNDIs8sEg
l3KrpNJSA83/uwwUkdsHFPfdqsjwyoPUseSkNlArMQKBgQD48AYjYxhI6a47UhbC
+g9gGycHAtH9gpjGDfTc/P3BeN957Xruh91/zUUwUqtFfqj7m6qEoIPD9J1ohBpR
ZRnrfMCXwmZ74LseElCnCHWZM+5XNYqfOXx4UVt55UydUV7nF5QZR1yGSzbYOk3Y
nI0Vo1IGEYBNqJAUZGBg2UdXaQKBgQDmABNMPbD7DiUr/kPIfTQGygYxT7UIzwBF
I4rkpL2afcYew7ts1YUKDaEohxWAJe+FHYByIgPOAniNjzMAQvLVstr/OtnzFBtE
k7nQDJbXDw3vUeD+6j8YQhSO1qqQojGvvOmf97G/6kVFEBmivz5W5x5+Fyj6Fqxs
Jo4+sy7X6QKBgAuAa4gvB+w2f8pV3J9dlmBGYOM+Ch3AbvaXpnyfY8oQn6KuikOD
G4TQIyY8a5VmaMBXTOWb1Pq0zqEJmX2xQiVTOkLIxJtsoric+AT/qw9NCvIUkzcQ
HOQiPiu/oG6UV+ItgLY6SdgamYocB4S+lvYs+Zk2Lctowl9u09UltNohAoGAVxkc
Nbj+9nOq2/gTzy6qrw9+PNpEYiuRnJ0TEfbY3lJW3nuc1GAfW2lB6EkPeVHkXHKJ
m68J5c/Fu0XJOIYh049Bo3mz43tvwA55RTIfRR2sVz6Yh7BJaHRNuLHOMataSYSu
rCduppCe3sJ0Es99Wgd34qP+noZLkUEgiNnuGVECgYBrF3pJ+XZT57Izm/MyMIg5
6QljF0y3uNtldLXY9lB09b+TCXfanKkODGRdWqygiHVayNz1ZWhqQfHt0sAqYs+H
Xm8rfg/JVgFoy9+51zBj5F+ft/7N/9ppGaxC6P7Np+yQTv6uwYNyGtWOhKORUcPR
JkzV1/dXVBSKdgGu4B3w3g==
-----END PRIVATE KEY-----
)EOF";
+117
View File
@@ -0,0 +1,117 @@
#include <WiFiClientSecure.h>
#include <LittleFS.h>
#include <FileUtils.h>
const char *wifiInfo = "/wifi.conf";
const char *getStatusMessage(wl_status_t status)
{
switch (status)
{
case WL_NO_SHIELD:
return "No Arduino Shield";
case WL_IDLE_STATUS:
return "Idle";
case WL_NO_SSID_AVAIL:
return "No SSID available";
case WL_SCAN_COMPLETED:
return "Scan completed";
case WL_CONNECTED:
return "Connected";
case WL_CONNECT_FAILED:
return "Connection failed";
case WL_CONNECTION_LOST:
return "Connection lost";
case WL_DISCONNECTED:
return "Disconnected";
}
return "";
}
void wifiSmartConfig()
{
WiFi.beginSmartConfig();
// Wait for SmartConfig packet from mobile
Serial.println("Waiting for SmartConfig.");
while (!WiFi.smartConfigDone())
{
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("SmartConfig received.");
// Wait for WiFi to connect to AP
Serial.println("Waiting for Wi-Fi");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println("Wi-Fi Connected.");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
Serial.println("Saving network information to LittleFS...");
String ssid = WiFi.SSID();
String content = String(ssid);
String pass = WiFi.psk();
content.concat("\n");
content.concat(pass);
writeFile("/wifi.conf", content);
}
/// @brief Try saved WiFi credentials
/// @return Returns true if connected
bool trySavedWiFi()
{
File file = LittleFS.open(wifiInfo, "r");
if (!file)
{
return false;
}
String ssid = file.readStringUntil('\n');
String pass = file.readString();
file.close();
Serial.println("Saved SSID:");
Serial.println(ssid);
Serial.println("Saved PSK:");
Serial.println(pass);
Serial.println("Trying to connect to saved Wi-Fi... (Waiting for 6 seconds)");
WiFi.begin(ssid, pass);
delay(6000);
auto status = WiFi.status();
Serial.printf("Wi-Fi Status: %d (%s)\n", status, getStatusMessage(status));
return WiFi.status() == WL_CONNECTED;
}
void initWiFi()
{
// Init WiFi as Station, start SmartConfig
WiFi.mode(WIFI_STA);
delay(500);
if (trySavedWiFi())
{
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
return;
}
wifiSmartConfig();
}
+95
View File
@@ -0,0 +1,95 @@
#ifndef CERT_H_
#define CERT_H_
unsigned char projectCert_der[] = {
0x30, 0x82, 0x04, 0x27, 0x30, 0x82, 0x03, 0x0f, 0xa0, 0x03, 0x02, 0x01,
0x02, 0x02, 0x14, 0x15, 0xd9, 0x15, 0x08, 0x5c, 0x3d, 0x45, 0x3a, 0x8b,
0x80, 0x56, 0x37, 0x80, 0x7d, 0x68, 0x93, 0x5a, 0x96, 0x62, 0x1a, 0x30,
0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,
0x05, 0x00, 0x30, 0x81, 0x99, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
0x04, 0x06, 0x13, 0x02, 0x54, 0x48, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03,
0x55, 0x04, 0x08, 0x0c, 0x09, 0x4e, 0x6f, 0x6e, 0x67, 0x2d, 0x4b, 0x68,
0x61, 0x69, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,
0x0e, 0x54, 0x72, 0x61, 0x73, 0x68, 0x62, 0x69, 0x6e, 0x20, 0x47, 0x61,
0x6d, 0x65, 0x73, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b,
0x0c, 0x0b, 0x49, 0x6f, 0x54, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
0x73, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x11,
0x6c, 0x69, 0x74, 0x65, 0x61, 0x75, 0x74, 0x68, 0x20, 0x4c, 0x6f, 0x63,
0x61, 0x6c, 0x20, 0x43, 0x41, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x09, 0x2a,
0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09, 0x01, 0x16, 0x1c, 0x6c, 0x69,
0x6e, 0x65, 0x73, 0x6f, 0x66, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x40, 0x64,
0x61, 0x69, 0x6c, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78,
0x79, 0x7a, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x35, 0x31, 0x31, 0x30, 0x39,
0x30, 0x38, 0x31, 0x37, 0x35, 0x31, 0x5a, 0x17, 0x0d, 0x32, 0x36, 0x31,
0x31, 0x30, 0x39, 0x30, 0x38, 0x31, 0x37, 0x35, 0x31, 0x5a, 0x30, 0x81,
0x96, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
0x54, 0x48, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c,
0x09, 0x4e, 0x6f, 0x6e, 0x67, 0x2d, 0x4b, 0x68, 0x61, 0x69, 0x31, 0x17,
0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0e, 0x54, 0x72, 0x61,
0x73, 0x68, 0x62, 0x69, 0x6e, 0x20, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x31,
0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x0b, 0x49, 0x6f,
0x54, 0x20, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x31, 0x17, 0x30,
0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0e, 0x6c, 0x69, 0x74, 0x65,
0x61, 0x75, 0x74, 0x68, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x31, 0x2b,
0x30, 0x29, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x09,
0x01, 0x16, 0x1c, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x6f, 0x66, 0x63, 0x6f,
0x64, 0x65, 0x73, 0x40, 0x64, 0x61, 0x69, 0x6c, 0x69, 0x74, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x79, 0x7a, 0x30, 0x82, 0x01, 0x22, 0x30,
0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02,
0x82, 0x01, 0x01, 0x00, 0xdf, 0xa7, 0xb8, 0x47, 0xbe, 0xbb, 0x8e, 0xf9,
0xe9, 0x63, 0xb3, 0xac, 0xd2, 0xff, 0xe2, 0xc7, 0x63, 0xc3, 0x14, 0xe5,
0x45, 0xf2, 0x10, 0xdb, 0x24, 0xeb, 0x85, 0x01, 0x37, 0x89, 0x5b, 0xeb,
0xcb, 0x3c, 0xed, 0xf1, 0xa8, 0x25, 0x7b, 0x20, 0x77, 0xf8, 0x1f, 0x7f,
0x3e, 0x53, 0x70, 0xeb, 0xcb, 0x7c, 0xa6, 0x0e, 0xcf, 0x0a, 0x63, 0xc8,
0x46, 0x10, 0xdb, 0xac, 0xfd, 0x6a, 0x15, 0xf5, 0x35, 0xad, 0x8b, 0x0e,
0xb9, 0x2d, 0x0d, 0x5b, 0x30, 0x01, 0x07, 0x7e, 0x61, 0x24, 0x6d, 0x4d,
0x6c, 0x7c, 0x6f, 0x52, 0x7b, 0xb9, 0x2b, 0x71, 0x04, 0x89, 0xb2, 0x00,
0xe2, 0x94, 0x91, 0x9f, 0x79, 0x74, 0x10, 0xc3, 0x9e, 0xea, 0x87, 0x97,
0xf0, 0x87, 0x51, 0x83, 0x45, 0xa5, 0xda, 0x25, 0xdc, 0x90, 0x31, 0x81,
0x5f, 0x33, 0xd6, 0xc5, 0x64, 0x00, 0x3e, 0x4c, 0xc1, 0xde, 0xda, 0x0b,
0x20, 0x6f, 0x23, 0x1a, 0xd8, 0xe8, 0xc8, 0x9d, 0x25, 0xcc, 0xf9, 0x31,
0x76, 0x95, 0xc1, 0xa3, 0x74, 0xd9, 0x66, 0xe6, 0x67, 0x21, 0x75, 0x37,
0x07, 0xce, 0x84, 0x8e, 0x19, 0x34, 0x88, 0x57, 0x28, 0x3b, 0xd2, 0x73,
0xdc, 0x14, 0x0a, 0xb2, 0xf0, 0x35, 0x36, 0xd1, 0xbd, 0x6a, 0x27, 0x04,
0xb0, 0x94, 0xc7, 0xbb, 0x69, 0x64, 0xa9, 0x23, 0x43, 0x2b, 0xa2, 0x65,
0x11, 0x84, 0x5f, 0x1f, 0x5d, 0x82, 0xf0, 0x03, 0x4d, 0xc1, 0x30, 0x5f,
0xc8, 0xb2, 0xe6, 0x98, 0x4d, 0x55, 0x9a, 0xfc, 0xe8, 0xaf, 0x32, 0x4e,
0xaf, 0x0f, 0xcd, 0x09, 0x15, 0x4c, 0x02, 0xf3, 0x3b, 0x0a, 0x28, 0x87,
0x3d, 0x01, 0xeb, 0x82, 0x90, 0x79, 0xeb, 0x78, 0xa3, 0x0b, 0x11, 0xbe,
0x4c, 0xe8, 0x74, 0xad, 0x04, 0xe4, 0xa2, 0xc4, 0xb1, 0x30, 0x6f, 0xad,
0x5c, 0xfa, 0x64, 0xfe, 0xcc, 0x35, 0xbd, 0x91, 0x02, 0x03, 0x01, 0x00,
0x01, 0xa3, 0x68, 0x30, 0x66, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23,
0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x18, 0x88, 0x96, 0x68, 0xad, 0x3a,
0x0b, 0x4a, 0x62, 0x6b, 0x22, 0xab, 0x67, 0xc9, 0xc6, 0x2d, 0x9e, 0x92,
0xff, 0x74, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30,
0x00, 0x30, 0x19, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x12, 0x30, 0x10,
0x82, 0x0e, 0x6c, 0x69, 0x74, 0x65, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x6c,
0x6f, 0x63, 0x61, 0x6c, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,
0x16, 0x04, 0x14, 0xef, 0xc4, 0x2e, 0x33, 0x5a, 0xaf, 0x9e, 0x27, 0xd5,
0x31, 0xf1, 0x69, 0xcf, 0x6e, 0xe3, 0xcc, 0xf4, 0x52, 0xe0, 0x35, 0x30,
0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x0b,
0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0x32, 0x4a, 0x01, 0x95, 0xe6,
0x8b, 0xf3, 0xf6, 0x53, 0xf0, 0x45, 0x66, 0x1e, 0xba, 0x7a, 0xdc, 0x38,
0xb2, 0x23, 0x37, 0xb9, 0x55, 0xed, 0x22, 0xea, 0x0b, 0xe3, 0xec, 0x12,
0x54, 0xd6, 0x60, 0x6f, 0x6c, 0x8e, 0xa4, 0xb1, 0xa4, 0xd0, 0x54, 0x56,
0xbe, 0xeb, 0x88, 0x27, 0x84, 0xb1, 0x32, 0xd9, 0x6c, 0xbd, 0xae, 0x7f,
0xfb, 0x9a, 0x77, 0x3b, 0xfc, 0xb7, 0xb4, 0xc0, 0x1c, 0xca, 0x55, 0x63,
0xfa, 0x49, 0xfa, 0x87, 0xb5, 0x79, 0xff, 0xaf, 0xd1, 0x84, 0xd6, 0x1b,
0xf0, 0x16, 0xe6, 0x20, 0x33, 0x15, 0x88, 0x1c, 0x64, 0x3e, 0xa1, 0x2e,
0xec, 0x23, 0xe7, 0x7e, 0xbb, 0x55, 0x4b, 0x07, 0x08, 0x5c, 0x9e, 0x38,
0x3f, 0x7e, 0x6d, 0xe9, 0xd1, 0x6e, 0x73, 0x55, 0xb6, 0xd4, 0x92, 0xf7,
0xc8, 0xd7, 0xf6, 0x12, 0x40, 0x77, 0xd8, 0x30, 0x2d, 0xfa, 0xc9, 0xa3,
0x1c, 0x32, 0x95, 0xea, 0x2c, 0xe6, 0x4e, 0x8b, 0xc6, 0x71, 0xb9, 0x1e,
0x4c, 0xc7, 0xff, 0x4d, 0x42, 0x6f, 0xec, 0x9e, 0x1b, 0x9e, 0x9e, 0x76,
0x52, 0x14, 0x59, 0xa1, 0xbd, 0x1c, 0x41, 0xb6, 0xf5, 0x1d, 0xd0, 0xe6,
0x67, 0xa1, 0xd3, 0x6a, 0xe2, 0x71, 0xce, 0x2c, 0x4a, 0xc5, 0x49, 0x34,
0xe3, 0x7b, 0x35, 0x4a, 0xaf, 0x23, 0xfa, 0x9b, 0xcc, 0x55, 0xaa, 0x83,
0x55, 0xf6, 0xa9, 0xa2, 0xaa, 0x8f, 0xc5, 0x2b, 0xfe, 0x9a, 0x5f, 0xe3,
0x56, 0xef, 0xe1, 0xfd, 0xec, 0x1a, 0xad, 0x1b, 0xe7, 0x4a, 0x31, 0x65,
0xa0, 0xf1, 0x52, 0x83, 0x27, 0x90, 0x8f, 0x04, 0xb7, 0x4e, 0x90, 0x34,
0xf2, 0x9a, 0x5d, 0x22, 0xe0, 0x1c, 0x17, 0x9f, 0x3d, 0xab, 0x97, 0xd6,
0xf8, 0x8a, 0x06, 0xf2, 0x39, 0x85, 0x49, 0xeb, 0x59, 0x9e, 0xbe, 0x79,
0xcf, 0x4c, 0x4e, 0x36, 0x05, 0x8f, 0x0a, 0xfa, 0x12, 0xe1, 0xa0
};
unsigned int projectCert_der_len = 1067;
#endif
+69
View File
@@ -0,0 +1,69 @@
#define HTTPS_DISABLE_SELFSIGNING 1
#include <Arduino.h>
#include <LittleFS.h>
#include <WiFiUtils.h>
#include <ESPmDNS.h>
#include <HTTPSServer.hpp>
#include <HttpData.h>
#include <HttpApi.h>
#include "cert.h"
#include "private_key.h"
using namespace httpsserver;
SSLCert cert = SSLCert(
projectCert_der, projectCert_der_len,
projectKey_der, projectKey_der_len);
HTTPSServer server = HTTPSServer(&cert);
void handleRoot(HTTPRequest *req, HTTPResponse *res)
{
res->setHeader("Content-Type", "text/plain");
res->println("Hello from ESP32 over HTTPS!\n");
}
void setupServer()
{
if (MDNS.begin("liteauth"))
{
Serial.println("MDNS responder started");
}
// server.getServer().setRSACert(new BearSSL::X509List(server_cert), new BearSSL::PrivateKey(server_private_key));
// server.getServer().setCache(&serverCache);
ResourceNode *nodeRoot = new ResourceNode("/", "GET", &handleRoot);
server.registerNode(nodeRoot);
server.start();
MDNS.addService("https", "tcp", 443);
}
void setup()
{
Serial.begin(9600);
if (!LittleFS.begin())
{
Serial.println("An error occurred while mounting LittleFS!");
return;
}
initWiFi();
setupServer();
Serial.print("Token for this session: ");
Serial.println(getToken().c_str());
setupApi(&server);
}
void loop()
{
server.loop();
delay(1);
}
+108
View File
@@ -0,0 +1,108 @@
#ifndef PRIVATE_KEY_H_
#define PRIVATE_KEY_H_
unsigned char projectKey_der[] = {
0x30, 0x82, 0x04, 0xbc, 0x02, 0x01, 0x00, 0x30, 0x0d, 0x06, 0x09, 0x2a,
0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x82,
0x04, 0xa6, 0x30, 0x82, 0x04, 0xa2, 0x02, 0x01, 0x00, 0x02, 0x82, 0x01,
0x01, 0x00, 0xdf, 0xa7, 0xb8, 0x47, 0xbe, 0xbb, 0x8e, 0xf9, 0xe9, 0x63,
0xb3, 0xac, 0xd2, 0xff, 0xe2, 0xc7, 0x63, 0xc3, 0x14, 0xe5, 0x45, 0xf2,
0x10, 0xdb, 0x24, 0xeb, 0x85, 0x01, 0x37, 0x89, 0x5b, 0xeb, 0xcb, 0x3c,
0xed, 0xf1, 0xa8, 0x25, 0x7b, 0x20, 0x77, 0xf8, 0x1f, 0x7f, 0x3e, 0x53,
0x70, 0xeb, 0xcb, 0x7c, 0xa6, 0x0e, 0xcf, 0x0a, 0x63, 0xc8, 0x46, 0x10,
0xdb, 0xac, 0xfd, 0x6a, 0x15, 0xf5, 0x35, 0xad, 0x8b, 0x0e, 0xb9, 0x2d,
0x0d, 0x5b, 0x30, 0x01, 0x07, 0x7e, 0x61, 0x24, 0x6d, 0x4d, 0x6c, 0x7c,
0x6f, 0x52, 0x7b, 0xb9, 0x2b, 0x71, 0x04, 0x89, 0xb2, 0x00, 0xe2, 0x94,
0x91, 0x9f, 0x79, 0x74, 0x10, 0xc3, 0x9e, 0xea, 0x87, 0x97, 0xf0, 0x87,
0x51, 0x83, 0x45, 0xa5, 0xda, 0x25, 0xdc, 0x90, 0x31, 0x81, 0x5f, 0x33,
0xd6, 0xc5, 0x64, 0x00, 0x3e, 0x4c, 0xc1, 0xde, 0xda, 0x0b, 0x20, 0x6f,
0x23, 0x1a, 0xd8, 0xe8, 0xc8, 0x9d, 0x25, 0xcc, 0xf9, 0x31, 0x76, 0x95,
0xc1, 0xa3, 0x74, 0xd9, 0x66, 0xe6, 0x67, 0x21, 0x75, 0x37, 0x07, 0xce,
0x84, 0x8e, 0x19, 0x34, 0x88, 0x57, 0x28, 0x3b, 0xd2, 0x73, 0xdc, 0x14,
0x0a, 0xb2, 0xf0, 0x35, 0x36, 0xd1, 0xbd, 0x6a, 0x27, 0x04, 0xb0, 0x94,
0xc7, 0xbb, 0x69, 0x64, 0xa9, 0x23, 0x43, 0x2b, 0xa2, 0x65, 0x11, 0x84,
0x5f, 0x1f, 0x5d, 0x82, 0xf0, 0x03, 0x4d, 0xc1, 0x30, 0x5f, 0xc8, 0xb2,
0xe6, 0x98, 0x4d, 0x55, 0x9a, 0xfc, 0xe8, 0xaf, 0x32, 0x4e, 0xaf, 0x0f,
0xcd, 0x09, 0x15, 0x4c, 0x02, 0xf3, 0x3b, 0x0a, 0x28, 0x87, 0x3d, 0x01,
0xeb, 0x82, 0x90, 0x79, 0xeb, 0x78, 0xa3, 0x0b, 0x11, 0xbe, 0x4c, 0xe8,
0x74, 0xad, 0x04, 0xe4, 0xa2, 0xc4, 0xb1, 0x30, 0x6f, 0xad, 0x5c, 0xfa,
0x64, 0xfe, 0xcc, 0x35, 0xbd, 0x91, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
0x82, 0x01, 0x00, 0x13, 0x48, 0xb8, 0x16, 0x31, 0x8f, 0x24, 0xf7, 0x0d,
0xe5, 0x5b, 0x98, 0xe7, 0x71, 0x8a, 0x49, 0x74, 0x63, 0xdd, 0xf1, 0x9d,
0xdc, 0x0f, 0x11, 0x82, 0x27, 0xaf, 0x86, 0x69, 0x16, 0x36, 0x1f, 0x88,
0xdc, 0xd6, 0x4c, 0x5b, 0x99, 0xed, 0xb9, 0xa1, 0x36, 0x7a, 0xea, 0xc3,
0x02, 0x39, 0x4e, 0x8f, 0x73, 0x4e, 0x33, 0x21, 0x2d, 0x6d, 0x68, 0x97,
0x87, 0xfd, 0x14, 0xf7, 0x9d, 0xb5, 0xca, 0x78, 0x88, 0x1f, 0xe1, 0x13,
0x5c, 0xdb, 0xd5, 0xb4, 0xb8, 0x26, 0x00, 0x02, 0xda, 0xbb, 0xf4, 0xec,
0xc9, 0x76, 0xe4, 0xc7, 0x07, 0xb2, 0x83, 0xf2, 0x66, 0xf7, 0xfa, 0xe5,
0x0e, 0x77, 0xd6, 0xe7, 0x07, 0x37, 0xa9, 0xd2, 0x52, 0x39, 0x02, 0x44,
0x0a, 0x3a, 0xe0, 0x45, 0x79, 0x55, 0x2b, 0xa6, 0x0e, 0xa5, 0xc2, 0x18,
0xa6, 0x14, 0xda, 0xdc, 0xb2, 0x3b, 0xac, 0xed, 0x1b, 0x6c, 0xb3, 0xd7,
0x1a, 0x9f, 0xc8, 0x0c, 0x55, 0x05, 0x60, 0x26, 0xd0, 0x5e, 0xa4, 0x37,
0x4e, 0x20, 0x06, 0xd3, 0x41, 0x7e, 0x9b, 0x9f, 0xfb, 0x5f, 0x11, 0x10,
0x76, 0xae, 0x72, 0xfd, 0xcb, 0x2c, 0x25, 0x1f, 0x26, 0x77, 0x27, 0x81,
0x29, 0x5e, 0xaa, 0xfa, 0x2c, 0x1c, 0x6d, 0xf5, 0x31, 0xef, 0x0f, 0xea,
0x79, 0x76, 0x55, 0x2b, 0x69, 0x0d, 0x46, 0x31, 0x18, 0xb8, 0xdf, 0x8c,
0x9a, 0xaf, 0xdc, 0x70, 0x7b, 0x4d, 0xdc, 0xfc, 0x79, 0x8e, 0x6a, 0x1c,
0xab, 0x37, 0xb0, 0xc2, 0x94, 0x66, 0x73, 0x74, 0xfb, 0x9a, 0x5e, 0x6d,
0x37, 0x59, 0x93, 0x49, 0x29, 0x21, 0x34, 0x32, 0x2c, 0xf2, 0xc1, 0x20,
0x97, 0x72, 0xab, 0xa4, 0xd2, 0x52, 0x03, 0xcd, 0xff, 0xbb, 0x0c, 0x14,
0x91, 0xdb, 0x07, 0x14, 0xf7, 0xdd, 0xaa, 0xc8, 0xf0, 0xca, 0x83, 0xd4,
0xb1, 0xe4, 0xa4, 0x36, 0x50, 0x2b, 0x31, 0x02, 0x81, 0x81, 0x00, 0xf8,
0xf0, 0x06, 0x23, 0x63, 0x18, 0x48, 0xe9, 0xae, 0x3b, 0x52, 0x16, 0xc2,
0xfa, 0x0f, 0x60, 0x1b, 0x27, 0x07, 0x02, 0xd1, 0xfd, 0x82, 0x98, 0xc6,
0x0d, 0xf4, 0xdc, 0xfc, 0xfd, 0xc1, 0x78, 0xdf, 0x79, 0xed, 0x7a, 0xee,
0x87, 0xdd, 0x7f, 0xcd, 0x45, 0x30, 0x52, 0xab, 0x45, 0x7e, 0xa8, 0xfb,
0x9b, 0xaa, 0x84, 0xa0, 0x83, 0xc3, 0xf4, 0x9d, 0x68, 0x84, 0x1a, 0x51,
0x65, 0x19, 0xeb, 0x7c, 0xc0, 0x97, 0xc2, 0x66, 0x7b, 0xe0, 0xbb, 0x1e,
0x12, 0x50, 0xa7, 0x08, 0x75, 0x99, 0x33, 0xee, 0x57, 0x35, 0x8a, 0x9f,
0x39, 0x7c, 0x78, 0x51, 0x5b, 0x79, 0xe5, 0x4c, 0x9d, 0x51, 0x5e, 0xe7,
0x17, 0x94, 0x19, 0x47, 0x5c, 0x86, 0x4b, 0x36, 0xd8, 0x3a, 0x4d, 0xd8,
0x9c, 0x8d, 0x15, 0xa3, 0x52, 0x06, 0x11, 0x80, 0x4d, 0xa8, 0x90, 0x14,
0x64, 0x60, 0x60, 0xd9, 0x47, 0x57, 0x69, 0x02, 0x81, 0x81, 0x00, 0xe6,
0x00, 0x13, 0x4c, 0x3d, 0xb0, 0xfb, 0x0e, 0x25, 0x2b, 0xfe, 0x43, 0xc8,
0x7d, 0x34, 0x06, 0xca, 0x06, 0x31, 0x4f, 0xb5, 0x08, 0xcf, 0x00, 0x45,
0x23, 0x8a, 0xe4, 0xa4, 0xbd, 0x9a, 0x7d, 0xc6, 0x1e, 0xc3, 0xbb, 0x6c,
0xd5, 0x85, 0x0a, 0x0d, 0xa1, 0x28, 0x87, 0x15, 0x80, 0x25, 0xef, 0x85,
0x1d, 0x80, 0x72, 0x22, 0x03, 0xce, 0x02, 0x78, 0x8d, 0x8f, 0x33, 0x00,
0x42, 0xf2, 0xd5, 0xb2, 0xda, 0xff, 0x3a, 0xd9, 0xf3, 0x14, 0x1b, 0x44,
0x93, 0xb9, 0xd0, 0x0c, 0x96, 0xd7, 0x0f, 0x0d, 0xef, 0x51, 0xe0, 0xfe,
0xea, 0x3f, 0x18, 0x42, 0x14, 0x8e, 0xd6, 0xaa, 0x90, 0xa2, 0x31, 0xaf,
0xbc, 0xe9, 0x9f, 0xf7, 0xb1, 0xbf, 0xea, 0x45, 0x45, 0x10, 0x19, 0xa2,
0xbf, 0x3e, 0x56, 0xe7, 0x1e, 0x7e, 0x17, 0x28, 0xfa, 0x16, 0xac, 0x6c,
0x26, 0x8e, 0x3e, 0xb3, 0x2e, 0xd7, 0xe9, 0x02, 0x81, 0x80, 0x0b, 0x80,
0x6b, 0x88, 0x2f, 0x07, 0xec, 0x36, 0x7f, 0xca, 0x55, 0xdc, 0x9f, 0x5d,
0x96, 0x60, 0x46, 0x60, 0xe3, 0x3e, 0x0a, 0x1d, 0xc0, 0x6e, 0xf6, 0x97,
0xa6, 0x7c, 0x9f, 0x63, 0xca, 0x10, 0x9f, 0xa2, 0xae, 0x8a, 0x43, 0x83,
0x1b, 0x84, 0xd0, 0x23, 0x26, 0x3c, 0x6b, 0x95, 0x66, 0x68, 0xc0, 0x57,
0x4c, 0xe5, 0x9b, 0xd4, 0xfa, 0xb4, 0xce, 0xa1, 0x09, 0x99, 0x7d, 0xb1,
0x42, 0x25, 0x53, 0x3a, 0x42, 0xc8, 0xc4, 0x9b, 0x6c, 0xa2, 0xb8, 0x9c,
0xf8, 0x04, 0xff, 0xab, 0x0f, 0x4d, 0x0a, 0xf2, 0x14, 0x93, 0x37, 0x10,
0x1c, 0xe4, 0x22, 0x3e, 0x2b, 0xbf, 0xa0, 0x6e, 0x94, 0x57, 0xe2, 0x2d,
0x80, 0xb6, 0x3a, 0x49, 0xd8, 0x1a, 0x99, 0x8a, 0x1c, 0x07, 0x84, 0xbe,
0x96, 0xf6, 0x2c, 0xf9, 0x99, 0x36, 0x2d, 0xcb, 0x68, 0xc2, 0x5f, 0x6e,
0xd3, 0xd5, 0x25, 0xb4, 0xda, 0x21, 0x02, 0x81, 0x80, 0x57, 0x19, 0x1c,
0x35, 0xb8, 0xfe, 0xf6, 0x73, 0xaa, 0xdb, 0xf8, 0x13, 0xcf, 0x2e, 0xaa,
0xaf, 0x0f, 0x7e, 0x3c, 0xda, 0x44, 0x62, 0x2b, 0x91, 0x9c, 0x9d, 0x13,
0x11, 0xf6, 0xd8, 0xde, 0x52, 0x56, 0xde, 0x7b, 0x9c, 0xd4, 0x60, 0x1f,
0x5b, 0x69, 0x41, 0xe8, 0x49, 0x0f, 0x79, 0x51, 0xe4, 0x5c, 0x72, 0x89,
0x9b, 0xaf, 0x09, 0xe5, 0xcf, 0xc5, 0xbb, 0x45, 0xc9, 0x38, 0x86, 0x21,
0xd3, 0x8f, 0x41, 0xa3, 0x79, 0xb3, 0xe3, 0x7b, 0x6f, 0xc0, 0x0e, 0x79,
0x45, 0x32, 0x1f, 0x45, 0x1d, 0xac, 0x57, 0x3e, 0x98, 0x87, 0xb0, 0x49,
0x68, 0x74, 0x4d, 0xb8, 0xb1, 0xce, 0x31, 0xab, 0x5a, 0x49, 0x84, 0xae,
0xac, 0x27, 0x6e, 0xa6, 0x90, 0x9e, 0xde, 0xc2, 0x74, 0x12, 0xcf, 0x7d,
0x5a, 0x07, 0x77, 0xe2, 0xa3, 0xfe, 0x9e, 0x86, 0x4b, 0x91, 0x41, 0x20,
0x88, 0xd9, 0xee, 0x19, 0x51, 0x02, 0x81, 0x80, 0x6b, 0x17, 0x7a, 0x49,
0xf9, 0x76, 0x53, 0xe7, 0xb2, 0x33, 0x9b, 0xf3, 0x32, 0x30, 0x88, 0x39,
0xe9, 0x09, 0x63, 0x17, 0x4c, 0xb7, 0xb8, 0xdb, 0x65, 0x74, 0xb5, 0xd8,
0xf6, 0x50, 0x74, 0xf5, 0xbf, 0x93, 0x09, 0x77, 0xda, 0x9c, 0xa9, 0x0e,
0x0c, 0x64, 0x5d, 0x5a, 0xac, 0xa0, 0x88, 0x75, 0x5a, 0xc8, 0xdc, 0xf5,
0x65, 0x68, 0x6a, 0x41, 0xf1, 0xed, 0xd2, 0xc0, 0x2a, 0x62, 0xcf, 0x87,
0x5e, 0x6f, 0x2b, 0x7e, 0x0f, 0xc9, 0x56, 0x01, 0x68, 0xcb, 0xdf, 0xb9,
0xd7, 0x30, 0x63, 0xe4, 0x5f, 0x9f, 0xb7, 0xfe, 0xcd, 0xff, 0xda, 0x69,
0x19, 0xac, 0x42, 0xe8, 0xfe, 0xcd, 0xa7, 0xec, 0x90, 0x4e, 0xfe, 0xae,
0xc1, 0x83, 0x72, 0x1a, 0xd5, 0x8e, 0x84, 0xa3, 0x91, 0x51, 0xc3, 0xd1,
0x26, 0x4c, 0xd5, 0xd7, 0xf7, 0x57, 0x54, 0x14, 0x8a, 0x76, 0x01, 0xae,
0xe0, 0x1d, 0xf0, 0xde
};
unsigned int projectKey_der_len = 1216;
#endif
+11
View File
@@ -0,0 +1,11 @@
This directory is intended for PlatformIO Test Runner and project tests.
Unit Testing is a software testing method by which individual units of
source code, sets of one or more MCU program modules together with associated
control data, usage procedures, and operating procedures, are tested to
determine whether they are fit for use. Unit testing finds problems early
in the development cycle.
More information about PlatformIO Unit Testing:
- https://docs.platformio.org/en/latest/advanced/unit-testing/index.html