188 lines
4.8 KiB
C++
188 lines
4.8 KiB
C++
/**
|
|
*
|
|
*/
|
|
#include <time.h>
|
|
#include <WiFi.h>
|
|
#include <Arduino.h>
|
|
#include <ESP_SSLClient.h>
|
|
#include "config.h"
|
|
#include "certs.h"
|
|
#include "credentials.h"
|
|
|
|
|
|
enum door_state {
|
|
/*
|
|
*/
|
|
CLOSED = '0',
|
|
OPEN = '1'
|
|
};
|
|
door_state new_door_state = CLOSED;
|
|
door_state current_door_state = CLOSED;
|
|
WiFiClient basic_client;
|
|
ESP_SSLClient ssl_client;
|
|
|
|
|
|
void display_info() {
|
|
/*
|
|
* ausgabe einiger infos tum device. ich verstehe allerdings die
|
|
* for-schleife nicht.
|
|
*/
|
|
uint32_t chipId = 0;
|
|
|
|
for (int i = 0; i < 17; i = i + 8) {
|
|
chipId |= ((ESP.getEfuseMac() >> (40 - i)) & 0xff) << i;
|
|
}
|
|
Serial.printf("\nESP32 Chip model = %s Rev %d\n", ESP.getChipModel(),
|
|
ESP.getChipRevision());
|
|
Serial.printf("This chip has %d cores\n", ESP.getChipCores());
|
|
Serial.print("Chip ID: ");
|
|
Serial.println(chipId);
|
|
Serial.print(" ");
|
|
}
|
|
|
|
void init_wifi() {
|
|
/*
|
|
*/
|
|
int counter = 0;
|
|
Serial.print("Connecting to wifi ");
|
|
Serial.print(WIFI_SSID);
|
|
WiFi.mode(WIFI_STA);
|
|
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
|
|
while (WiFi.status() != WL_CONNECTED)
|
|
{
|
|
delay(500);
|
|
Serial.print(".");
|
|
counter++;
|
|
if (counter >= 180) {
|
|
Serial.println(" Failed");
|
|
ESP.restart();
|
|
}
|
|
}
|
|
Serial.println(" Connected");
|
|
Serial.print("IP: ");
|
|
Serial.println(WiFi.localIP());
|
|
Serial.print("Strength: ");
|
|
Serial.println(WiFi.RSSI());
|
|
}
|
|
|
|
void set_clock() {
|
|
/*
|
|
* We need time for certificate authorization
|
|
*/
|
|
Serial.print("Fetch time from ");
|
|
Serial.println(NTP_URL);
|
|
configTime(GTM_OFFSET_SEC, DAYLIGHT_OFFSET_SEC, NTP_URL);
|
|
printLocalTime();
|
|
}
|
|
|
|
void printLocalTime() {
|
|
/*
|
|
*/
|
|
struct tm timeinfo;
|
|
if (!getLocalTime(&timeinfo)) {
|
|
Serial.println("Failed to obtain time");
|
|
return;
|
|
}
|
|
Serial.printf("%s\n", asctime(&timeinfo));
|
|
}
|
|
|
|
void set_ssl() {
|
|
/*
|
|
*/
|
|
// ssl_client.setTimeout(120);
|
|
// ssl_client.setSessionTimeout(0);
|
|
ssl_client.setDebugLevel(SSL_DEBUG_LEVEL);
|
|
ssl_client.setClient(&basic_client, false);
|
|
ssl_client.setSSLVersion(BR_TLS12, BR_TLS12);
|
|
ssl_client.setCACert(CA_CERTS);
|
|
ssl_client.setCertificate(CLIENT_CERT);
|
|
ssl_client.setPrivateKey(CLIENT_KEY);
|
|
|
|
}
|
|
|
|
door_state read_door_state() {
|
|
/*
|
|
* die initialisierung des reed-switch-pins mit pullup bewirkt, dass am pin
|
|
* 3,3 volt anliegen. die verbindung des pins mit GND sorgt dafür,
|
|
* dass die spannung "abfließen" kann. dadurch hat der pin dann den
|
|
* status 'low'. die option geht leider nur mit der bibliothek für den
|
|
* esp8862.
|
|
* geschlossene tür -> reed geschlossen -> low
|
|
* geöffnete tür -> reed offen -> high
|
|
*/
|
|
if (digitalRead(REED_PIN) == HIGH) {
|
|
return OPEN;
|
|
}
|
|
return CLOSED;
|
|
}
|
|
|
|
bool send_status(door_state state) {
|
|
/*
|
|
* param 1: door_state
|
|
* returns: boolean
|
|
*
|
|
* needs error handling
|
|
*/
|
|
int32_t response = 0;
|
|
int counter = 0;
|
|
|
|
// connect to server
|
|
Serial.print("Connecting to server ");
|
|
Serial.print(SERVER_URL);
|
|
Serial.print(" ... ");
|
|
if (ssl_client.connect(SERVER_URL, SERVER_PORT)) {
|
|
Serial.println(" ok");
|
|
Serial.print("Upgrade to HTTPS...");
|
|
if (!ssl_client.connectSSL())
|
|
{
|
|
Serial.println(" failed\r\n");
|
|
return false;
|
|
}
|
|
Serial.println(" ok");
|
|
// send new status
|
|
Serial.print("Send new status ... ");
|
|
response = ssl_client.write(current_door_state);
|
|
ssl_client.flush();
|
|
Serial.print("Bytes written: ");
|
|
Serial.println(response);
|
|
|
|
Serial.print("Read response...");
|
|
Serial.print((char)ssl_client.read());
|
|
Serial.println();
|
|
} else {
|
|
Serial.println(" failed\n");
|
|
ssl_client.stop();
|
|
return false;
|
|
}
|
|
ssl_client.stop();
|
|
return true;
|
|
}
|
|
|
|
void setup() {
|
|
/*
|
|
*/
|
|
Serial.begin(115200);
|
|
Serial.println("------------- setup -------------");
|
|
display_info();
|
|
init_wifi();
|
|
set_clock();
|
|
set_ssl();
|
|
Serial.println("-------- setup finished ---------");
|
|
}
|
|
|
|
void loop() {
|
|
/*
|
|
*/
|
|
new_door_state = read_door_state();
|
|
if (new_door_state != current_door_state) {
|
|
Serial.print("Status has changed to ");
|
|
Serial.println(new_door_state);
|
|
if (send_status(new_door_state)) {
|
|
current_door_state = new_door_state;
|
|
Serial.println("Door status send successful");
|
|
} else {
|
|
Serial.println("Failed to send new door status");
|
|
}
|
|
}
|
|
delay(FREQUENCY);
|
|
}
|