#include <WiFi.h>
#include <AsyncTCP.h>
#include <ArduinoJson.h>
#include <string.h>
#include <Arduino.h>
#include <esp_http_client.h>
const char *ssid = "Wokwi-GUEST";
const char *password = "";
const char server_cert_pem_start[] ="-----BEGIN CERTIFICATE-----\n"
"MIIGRjCCBS6gAwIBAgIRAOkWx3df6iCSAcw7ZMRqIKcwDQYJKoZIhvcNAQELBQAw\n"
"gY8xCzAJBgNVBAYTAkdCMRswGQYDVQQIExJHcmVhdGVyIE1hbmNoZXN0ZXIxEDAO\n"
"BgNVBAcTB1NhbGZvcmQxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDE3MDUGA1UE\n"
"AxMuU2VjdGlnbyBSU0EgRG9tYWluIFZhbGlkYXRpb24gU2VjdXJlIFNlcnZlciBD\n"
"QTAeFw0yMzEyMjYwMDAwMDBaFw0yNDEyMjYyMzU5NTlaMB8xHTAbBgNVBAMMFCou\n"
"bXRscy5tb25vY2xvdWQuZGV2MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC\n"
"AQEAz8CGVcCQSnMyenjtFp1SG1gICNRYB762rhEDS6Wm0xZ4GwqC0nm5+xFsbCGN\n"
"GyEK0aMeo3pEk1BpAsutb/IqYiApZe0v08Z668XMmlVwxtm+LK22Dq/R2Xd4S7rw\n"
"ptSj2SgLiytOn5uSROi2tgsHl1HCc+UnntYft3C/7OT/wypRMEwzgbs3TdZ+fvkU\n"
"BxcKAqK5/KezBYVlnLyIrFtRPORUHnqPbdcfT3RKLuKxyKEhjR9csVlrj8aGkzg9\n"
"N7KTr80bKTVWsFnjna5rJ58I4n1FC2R7MAIueOeDq/eiaGn2WZIYlxxajOPUrXlB\n"
"QEJVawoP9gkHrvI8T0DYVAM/VwIDAQABo4IDCjCCAwYwHwYDVR0jBBgwFoAUjYxe\n"
"xFStiuF36Zv5mwXhuAGNYeEwHQYDVR0OBBYEFGDXd/50+Gh5cmRNI161NgmGzU0b\n"
"MA4GA1UdDwEB/wQEAwIFoDAMBgNVHRMBAf8EAjAAMB0GA1UdJQQWMBQGCCsGAQUF\n"
"BwMBBggrBgEFBQcDAjBJBgNVHSAEQjBAMDQGCysGAQQBsjEBAgIHMCUwIwYIKwYB\n"
"BQUHAgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAECATCBhAYIKwYB\n"
"BQUHAQEEeDB2ME8GCCsGAQUFBzAChkNodHRwOi8vY3J0LnNlY3RpZ28uY29tL1Nl\n"
"Y3RpZ29SU0FEb21haW5WYWxpZGF0aW9uU2VjdXJlU2VydmVyQ0EuY3J0MCMGCCsG\n"
"AQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAzBgNVHREELDAqghQqLm10\n"
"bHMubW9ub2Nsb3VkLmRldoISbXRscy5tb25vY2xvdWQuZGV2MIIBfgYKKwYBBAHW\n"
"eQIEAgSCAW4EggFqAWgAdgB2/4g/Crb7lVHCYcz1h7o0tKTNuyncaEIKn+ZnTFo6\n"
"dAAAAYynsmXEAAAEAwBHMEUCIG2F4T6g3J0gBxF1rsATklcY61hIW3ziekYY09/r\n"
"kRymAiEAu/6Gok7/SybbBXuqAaiPiH14nvPIA6oUzFHidNAJoOUAdgA/F0tP1yJH\n"
"WJQdZRyEvg0S7ZA3fx+FauvBvyiF7PhkbgAAAYynsmVUAAAEAwBHMEUCICSi1h3u\n"
"YypRPUWkW6k1+rzTZNafRyIMis1z1Owr/Xq3AiEAkt8hmLmBc0cxXxZFLe6HvVoS\n"
"WooFZjL/A9QKjL1ol8AAdgDuzdBk1dsazsVct520zROiModGfLzs3sNRSFlGcR+1\n"
"mwAAAYynsmVRAAAEAwBHMEUCIQDtRB1SsNPZ88/sIgch9IWJMeIffw1O8ROwEY3N\n"
"LWJ9vAIgFZ1wMPEQp5Uuf/JxnRXRsuffIP4s6QnDK9aXhASTp/kwDQYJKoZIhvcN\n"
"AQELBQADggEBAFI5RZTYgqUO4Z+2Khq++yd+7QA0/xLHPFQUD11FzUmUd1iEVuFI\n"
"o/P9Q0AulYHqssy/Sjvr6FOAYOIWtbXvz1TyIQlJvQ9V3MpCYJgWiFx3YNTcNdjW\n"
"zcxjPFT8tVgiHYNAsnI8lG4+P/Jcduv42LexI7kFe8Vf62WY5KStvCgfZ1FMFUaS\n"
"hS1Wi7OICy24MknI6GifFlnv7jXKL97A2Cm6XekBLg6PGhKgTGP7iNFv9wJiM6xx\n"
"VQzErpxb8jDpleYR+srN4kPfmlPF+K/urGKz3/bEd+MPJofRo4pqcw1P7xB4pFzt\n"
"CcZgiadOG6Uu/C+GjTAnNELaaw8ROgduZp0=\n"
"-----END CERTIFICATE-----\0";
const char client_cert_pem_start[] = "-----BEGIN CERTIFICATE-----\n"
"MIIFBjCCAu6gAwIBAgICEAAwDQYJKoZIhvcNAQELBQAwazELMAkGA1UEBhMCSW4x\n"
"DjAMBgNVBAgMBURlbGhpMRIwEAYDVQQKDAlNb25vQ2xvdWQxDjAMBgNVBAsMBURl\n"
"bW9zMSgwJgYDVQQDDB9Nb25vQ2xvdWQgRGVtb3MgSW50ZXJtZWRpYXRlIENBMB4X\n"
"DTIzMDMwOTE3MTc1MFoXDTI1MTIwMzE3MTc1MFowYzELMAkGA1UEBhMCSW4xDjAM\n"
"BgNVBAgMBURlbGhpMQ4wDAYDVQQHDAVEZWxoaTESMBAGA1UECgwJTW9ub0Nsb3Vk\n"
"MQ4wDAYDVQQLDAVEZW1vczEQMA4GA1UEAwwHRGV2aWNlMTCCASIwDQYJKoZIhvcN\n"
"AQEBBQADggEPADCCAQoCggEBAM2c1wM0XARTkdZTMMjWR6lk7l1hgr3l4qu27JRB\n"
"+VSiFbmiHo8yXMW+Z3jlhtJNcHWSBTRW2kytGbC17x1j7xJowj17S8K8Pf9kYRT9\n"
"BbPG7bxYg086maoGPHm+aUFEfH71fiuDnJzGpcEaP+3PZToDXg4PJjVKGPprsgg3\n"
"bd+DrcnP8xv24ns78tLYuekQxJ6tdzZ3ZrlQpWvL4yAgshOuchxPZ1Yvhm2Jghr9\n"
"8A+Xk3uBWy2t2DRxFzdF4JofsoZavox1xmMNinYzbfMg0qTmGB9dzbBg7HJad+zJ\n"
"+7KCBc0EX2Js7HuTvUAGVGQEtRznobvisNO86wbIMtaSxkECAwEAAaOBuzCBuDAJ\n"
"BgNVHRMEAjAAMBEGCWCGSAGG+EIBAQQEAwIHgDAzBglghkgBhvhCAQ0EJhYkT3Bl\n"
"blNTTCBHZW5lcmF0ZWQgQ2xpZW50IENlcnRpZmljYXRlMB0GA1UdDgQWBBTMdykN\n"
"d7uDnSR1rhuT4c9mk5GtYTAfBgNVHSMEGDAWgBTGPln6WlobeYstfrzexG+Ne/wU\n"
"njAOBgNVHQ8BAf8EBAMCBeAwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDQYJKoZIhvcN\n"
"AQELBQADggIBAL0CXFGLuTPE/bffVThNidAc4fdm3ZQNwU2/Quc6X/uZ+Iy8dDBb\n"
"FaOLti51QYVuQiuUfc2XeZ+UCCr5QCVw6NZTPMIwTiJbguHkzRudfXGieBIJ2/P+\n"
"flkb1YBfMSgP8P+PXsTHQygQNEeSLyHNhpmVMuePUullHpww/gDG8Q1icNV7RVvK\n"
"4rWEVd4N8Z4QkiktBBYh/nqLcsrr07fVhLGRe5Ozn3/vz1eVJZPlg7ptC1RJMOmY\n"
"7DygjK5pOB4v3fVRZoDEQNO9GZ5rzdAGkMWVzCMayPffcWfDd69usXb5V2RyiLNn\n"
"WMBBliTP3j5aaT3KQOUUiIIzOo6a2FcnFXwFNpD5uhORQmdQonMhshx3IhFYS+6X\n"
"JL6kSDnykIbE79Qta7HSGE8a/rtQvWu4yBdR4b0BLfcmzPUyMoT3PEW3OExgPTtW\n"
"sQ3FAr7McG5sQ1YVmcB4WCLKE7l1o0bF0Zy0JOPLNoH8f1JSQerxvUF1NMINRiMt\n"
"NIFm6Qx/3WX6Uem6kB+8jkzmtDClNf1cX+b0t5wMgzpWcm7Lequ82N5V+MEStl5c\n"
"/pEf04qcxoCcu70iiLiamGgX8hZfcPH0RuxymO6pekDb2EJBDFXGFeN3J3NNL1bE\n"
"aUSHm/7dyrr4cL2FBqN9q1WUqCO80xgSi1/tjYrtBmQQhtGWeskSM8F1\n"
"-----END CERTIFICATE-----\0";
const char client_cert_key_start[] = "-----BEGIN RSA PRIVATE KEY-----\n"
"MIIEpAIBAAKCAQEAzZzXAzRcBFOR1lMwyNZHqWTuXWGCveXiq7bslEH5VKIVuaIe\n"
"jzJcxb5neOWG0k1wdZIFNFbaTK0ZsLXvHWPvEmjCPXtLwrw9/2RhFP0Fs8btvFiD\n"
"TzqZqgY8eb5pQUR8fvV+K4OcnMalwRo/7c9lOgNeDg8mNUoY+muyCDdt34Otyc/z\n"
"G/biezvy0ti56RDEnq13NndmuVCla8vjICCyE65yHE9nVi+GbYmCGv3wD5eTe4Fb\n"
"La3YNHEXN0Xgmh+yhlq+jHXGYw2KdjNt8yDSpOYYH13NsGDsclp37Mn7soIFzQRf\n"
"Ymzse5O9QAZUZAS1HOehu+Kw07zrBsgy1pLGQQIDAQABAoIBAHJ4+oAvO3exK0We\n"
"5U87dYRKzCazLj4ZadxeKFLWdED5SI0kRE1HJb12J1d4uloFgTIDzN/55um/ickH\n"
"UYwUYjrmlhXyuhg+A2pX8XDk+bLAcwVkZh7LKlgtxqelKiaLQaDRfqAtUxk5w3jB\n"
"64uz5tCopUnAh24txcBOCz1l1scUIYakCe0wCzvtghr8386NdNLm4zwdGJdc4yPH\n"
"k/8YAVdpwhuhTgkHj1RIWy6Kf82BoG08dAOwzb9CsMX2aJ/gPe5vc+hyZWuy/pYD\n"
"8IdTWZwulZ46HTEfIhtCAn7ujZqhZEGTkMrng1kkOtyYXhCFplJ6s0RymISxcSIH\n"
"iSAYeM0CgYEA9+p0AaHK6E0XdpWNbMeoZ4VqgfY7T9HHfsEV2lX9t2H7VyvEF0oF\n"
"xITarg3osLKIK4HqTkuzhQEZwzScSpB1Peq7gqQOhSzOFGxJW+SwYNk1nSE25xsp\n"
"oQnuqeQCSP6tdI2QzmYg4BxFxIP8odVeAFP+P/aYTAfMrWAy2c5rvWMCgYEA1FE/\n"
"xrnYD4J6oUR2/+Z0qt0bUMb25dZCLb3TPozNEBj9y8e4ly6xUmiavNlpM2+Z2ajM\n"
"o2ZzsfQvbUOd+/P6zmyshv0l6e/PMy5qeidjwnprXYMVLMOlm8+O81/6HqU3M64Z\n"
"HjJ+u0gQGIMZjnWs8ArvFLJa1wZ7W/UXBu5OwQsCgYBMWGD9F6v6ubLeC9QPibSs\n"
"nINeHkvJmtqKiD+Iiy6kyIG0KIAsg9ke2aLWMuZTc8dHTqyvC9TuwpYCbTMsKyxP\n"
"svenlYn7LP8Rfv9gUx6V1I4UI2Ra6xx4wSxEGTky7WrRF79eMEkzesFpcRPdam2W\n"
"QEdtvyzLTSOUyKkgNdcr7QKBgQDAm3iM0jlEUKzosZB2s1zxSCYokGaYuFdO4Z7K\n"
"Zrb8vH84p1U4qR4p0UVWvrBl/f8G6s/CCAY60HdZ2vZuA7ZqH0IgL3R+lZNVLe1g\n"
"JW2llqLhsTG7az1IbPGUrWPc+ypp0q1srIg1Y7leU0gS6YPaO0EKeIZZ/MJZ+KxM\n"
"GFIPYwKBgQDW60jm80XwleIRTc23kRUAwFyPiembmCfPFVrVec/t2GNQktC2Jhg+\n"
"kKIFTvjfmlmsn8e6Plocdkeq7ZSPIGgyzpA1ny4+bRfhzpUxugozkWpWIMBhDC/6\n"
"4Sx4wUCRjb+tMriAfRE4iu3bWxBEc7CwXttzQnFmsqNUfg/1cEJ8vQ==\n"
"-----END RSA PRIVATE KEY-----\0";
esp_http_client_config_t config = {
.url = "https://demos.mtls.monocloud.dev/connect/token",
.host = NULL,
.port = 0,
.username = NULL,
.password = NULL,
.auth_type = HTTP_AUTH_TYPE_NONE,
.path = NULL,
.query = NULL,
.cert_pem = server_cert_pem_start,
.client_cert_pem = client_cert_pem_start,
.client_key_pem = client_cert_key_start,
.user_agent = "monocloud/mtls-demo",
.method = HTTP_METHOD_POST,
.timeout_ms = 5000,
.disable_auto_redirect = false,
.max_redirection_count = 0,
.event_handler = NULL,
.transport_type = HTTP_TRANSPORT_OVER_SSL,
.buffer_size = 4096,
.user_data = NULL,
.is_async = false,
.use_global_ca_store = false,
.skip_cert_common_name_check = false,
};
esp_http_client_handle_t client = esp_http_client_init(&config);
DynamicJsonDocument getToken()
{
esp_http_client_set_header(client, "Content-Type", "application/x-www-form-urlencoded");
esp_http_client_set_header(client, "Accept", "application/json");
const char *post_data = "client_id=esp_mtls&grant_type=client_credentials";
esp_http_client_set_post_field(client, post_data, strlen(post_data));
esp_err_t err = esp_http_client_perform(client);
DynamicJsonDocument doc(2048);
if (err == ESP_OK)
{
int status_code = esp_http_client_get_status_code(client);
Serial.print("Recieved Status Code: ");
Serial.println(String(status_code));
if (status_code == 200)
{
char *res = (char *)malloc(2048);
esp_http_client_read(client, res, 2048);
Serial.println(res);
deserializeJson(doc, res);
return doc;
}
}
Serial.println("Something Went Wrong");
return doc;
}
void setup()
{
Serial.begin(115200);
pinMode(15, OUTPUT);
digitalWrite(15, LOW);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi Connected");
}
void loop()
{
DynamicJsonDocument tokenResult = getToken();
if (tokenResult.containsKey("access_token"))
{
Serial.println("Token Obtained");
digitalWrite(15, HIGH);
}
else
{
Serial.println("Error");
digitalWrite(15, LOW);
}
delay(2000);
}