#include <WiFiClient.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

const char ssid[] = "YOUR_SSID";
const char passwd[] = "YOUR_PASSWORD";

const char* awsEndpoint = "YOUR_ENDPOINT.amazonaws.com";
const int awsPort = 8883;
const char* pubTopic = "my_device";
const char* rootCA = "-----BEGIN CERTIFICATE-----\n" \
"MIIDQTCCAimgAwIBAgITBmyfz5m/jAo54vB4ikPmljZbyjANBgkqhkiG9w0BAQsF\n" \
"ADA5MQswCQYDVQQGEwJVUzEPMA0GA1UEChMGQW1hem9uMRkwFwYDVQQDExBBbWF6\n" \
"N+gDS63pYaACbvXy8MWy7Vu33PqUXHeeE6V/Uq2V8viTO96LXFvKWlJbYK8U90vv\n" \
"o/ufQJVtMVT8QtPHRh8jrdkPSHCa2XV4cdFyQzR1bldZwgJcJmApzyMZFo6IQ6XU\n" \
"5MsI+yMRQ+hDKXJioaldXgjUkK642M4UwtBV8ob2xJNDd2ZhwLnoQdeXeGADbkpy\n" \
"rqXRfboQnoZsG4q5WTP468SQvvG5\n" \
"-----END CERTIFICATE-----\n";
const char* certificate = "-----BEGIN CERTIFICATE-----\n" \
"MIIDWTCCAkGgAwIBAgIUZXi/UGT2BrWAnNsdDov3MsZ3yaEwDQYJKoZIhvcNAQEL\n" \
"BQAwTTFLMEkGA1UECwxCQW1hem9uIFdlYiBTZXJ2aWNlcyBPPUFtYXpvbi5jb20g\n" \
"SW5jLiBMPVNlYXR0bGUgU1Q9V2FzaGluZ3RvbiBDPVVTMB4XDTIxMDEyMzIyNTkz\n" \
"iQLuD01RBeHwnXNIhZflVWsDHrLqEl4JF7RzaSzGSiFCyszTgAy7rm24OWkByQIs\n" \
"3mcZ7t/nQ6fScI/FXy0ulMdXN54lSNilyJu5WdOiZ2xtgcfWeeEEzIEZ2AAtYwao\n" \
"Fzuvb6L/F//xrxHxkqrbgFwD2q30xI0l5QgOgBYLK8klggiIFMFSe8MTpYvI\n" \
"-----END CERTIFICATE-----\n";
const char* privateKey = "-----BEGIN RSA PRIVATE KEY-----\n" \
"MIIEpQIBAAKCAQEA7382j9N29ewVm2YoYHlHsVhC6uzafMk5OYoMAaTjfEt4Unew\n" \
"tkepybxNGK0rDoHHbgeGUr0CgYEAzy02wHqw/2Itmt2BkG0POD8WpK+HQ+Y1ju66\n" \
"LP+T+r0ubukhKIXejQYz3+3rHf5uawSNSBHveZ7bhUb0prhm4kEa6SS537twELoE\n" \
"69VkBYttNpdD8QfhVJ4BLDFoxS8euELNcSiAgrJmCni653mbj5oZQ7YVAr8nrXoO\n" \
"Nm6WN1ECgYEAimI4m9xgfwGQ0yXGXnV1nYU93R6VVXO9gCU9f0UTX06Uk1DbOi1R\n" \
"wlEp0Kz74Zi+Yl9j6JxYvyqd9M95YjjQlWEQCalIpoTvBBsXXTLq4//cA6/y2KW9\n" \
"2qG+p30uBWTd0R7ttsbennWvVfss6SOEyL/TC5psHvBj3scG7S4D9wY=\n" \
"-----END RSA PRIVATE KEY-----\n";

WiFiClientSecure httpsClient;
PubSubClient mqttClient(httpsClient);

long messageSentAt = 0;
int dummyValue = 0;
char pubMessage[256];
int milliSec=0;


int TEMP = 0;
int HUMI = 0;
int SMELL = 0;
int CDS = 0;
int NOISE = 0;
int SPACE = 0;
int HUMAN=0;
int CO=0;
int CO2=0;
int D_IN1=0;
int D_IN2=0;
int infrared=0;
int DCIN=0;
int RxFlg=0;
int CONTACT1=0;
int CONTACT2=0;

int senddata[22];

int RCV_BUFF00=0;
int RCV_BUFF01=0;
int RCV_BUFF02=0;
int RCV_BUFF03=0;
int RCV_BUFF04=0;
int RCV_BUFF05=0;
int RCV_BUFF06=0;
int RCV_BUFF07=0;
int RCV_BUFF08=0;
int RCV_BUFF09=0;
int RCV_BUFF10=0;
int RCV_BUFF11=0;
int RCV_BUFF12=0;
int RCV_BUFF13=0;
int RCV_BUFF14=0;
int RCV_BUFF15=0;
int RCV_BUFF16=0;
int RCV_BUFF17=0;
int RCV_BUFF18=0;
int RCV_BUFF19=0;
int RCV_BUFF20=0;
int RCV_BUFF21=0;
int RCV_BUFF22=0;
int RCV_BUFF23=0;
int RCV_BUFF24=0;
int RCV_BUFF25=0;
int RCV_BUFF26=0;
int RCV_BUFF27=0;
int RCV_BUFF28=0;
int RCV_BUFF29=0;
int RCV_BUFF30=0;
int RCV_BUFF31=0;

int RCV_VALUE00=0;
int RCV_VALUE01=0;
int RCV_VALUE02=0;
int RCV_VALUE03=0;
int RCV_VALUE04=0;
int RCV_VALUE05=0;
int RCV_VALUE06=0;
int RCV_VALUE07=0;
int RCV_VALUE08=0;
int RCV_VALUE09=0;
int RCV_VALUE10=0;
int RCV_VALUE11=0;
int RCV_VALUE12=0;
int RCV_VALUE13=0;
int RCV_VALUE14=0;
int RCV_VALUE15=0;
int RCV_VALUE16=0;
int RCV_VALUE17=0;
int RCV_VALUE18=0;
int RCV_VALUE19=0;
int RCV_VALUE20=0;
int RCV_VALUE21=0;
int RCV_VALUE22=0;
int RCV_VALUE23=0;
int RCV_VALUE24=0;
int RCV_VALUE25=0;
int RCV_VALUE26=0;
int RCV_VALUE27=0;
int RCV_VALUE28=0;
int RCV_VALUE29=0;
int RCV_VALUE30=0;
int RCV_VALUE31=0;

int RX_CHKDIGIT=0;

const int httpport=80;

WiFiServer server(80);

void mqttCallback (char* topic, byte* payload, unsigned int length) {
    Serial.print("Received. topic=");
    Serial.println(topic);
    for (int i = 0; i < length; i++) {
        Serial.print((char)payload[i]);
    }
    Serial.print("¥n");
}

void setup() {
    delay(2000);
    WiFi.begin(ssid, passwd);
    while(WiFi.status() != WL_CONNECTED) {
        delay(100);
    }
    delay(2000);
    Serial.begin(9600);
    while(Serial.available() >= 1){
      RCV_VALUE31 = Serial.read( );
    }
    configTime(9*3600L,0,"ntp.nict.jp","time.google.com","ntp.jst.mfeed.ad.jp");
    randomSeed(micros());
    httpsClient.setCACert(rootCA);
    httpsClient.setCertificate(certificate);
    httpsClient.setPrivateKey(privateKey);
    mqttClient.setServer(awsEndpoint, awsPort);
    mqttClient.setCallback(mqttCallback);
}

void loop() {

    if (!mqttClient.connected()) {
        while (!mqttClient.connected()) {
        String clientId = "ESP32-device";
        if (mqttClient.connect(clientId.c_str())) {
        }else{
            delay(5000);
        }
        }
    }
    mqttClient.loop();
    if (Serial.available() >= 1) { // 受信したデータが存在する
        RCV_BUFF00 = RCV_BUFF01;
        RCV_BUFF01 = RCV_BUFF02;
        RCV_BUFF02 = RCV_BUFF03;
        RCV_BUFF03 = RCV_BUFF04;
        RCV_BUFF04 = RCV_BUFF05;
        RCV_BUFF05 = RCV_BUFF06;
        RCV_BUFF06 = RCV_BUFF07;
        RCV_BUFF07 = RCV_BUFF08;
        RCV_BUFF08 = RCV_BUFF09;
        RCV_BUFF09 = RCV_BUFF10;
        RCV_BUFF10 = RCV_BUFF11;
        RCV_BUFF11 = RCV_BUFF12;
        RCV_BUFF12 = RCV_BUFF13;
        RCV_BUFF13 = RCV_BUFF14;
        RCV_BUFF14 = RCV_BUFF15;
        RCV_BUFF15 = RCV_BUFF16;
        RCV_BUFF16 = RCV_BUFF17;
        RCV_BUFF17 = RCV_BUFF18;
        RCV_BUFF18 = RCV_BUFF19;
        RCV_BUFF19 = RCV_BUFF20;
        RCV_BUFF20 = RCV_BUFF21;
        RCV_BUFF21 = RCV_BUFF22;
        RCV_BUFF22 = RCV_BUFF23;
        RCV_BUFF23 = RCV_BUFF24;
        RCV_BUFF24 = RCV_BUFF25;
        RCV_BUFF25 = RCV_BUFF26;
        RCV_BUFF26 = RCV_BUFF27;
        RCV_BUFF27 = RCV_BUFF28;
        RCV_BUFF28 = RCV_BUFF29;
        RCV_BUFF29 = RCV_BUFF30;
        RCV_BUFF30 = RCV_BUFF31;
        RCV_BUFF31 = Serial.read( );
        RX_CHKDIGIT=RCV_BUFF00+RCV_BUFF01+RCV_BUFF02+RCV_BUFF03+RCV_BUFF04+RCV_BUFF05+RCV_BUFF06+RCV_BUFF07+RCV_BUFF08+RCV_BUFF09+RCV_BUFF10+RCV_BUFF11+RCV_BUFF12+RCV_BUFF13+RCV_BUFF14+RCV_BUFF15+RCV_BUFF16+RCV_BUFF17+RCV_BUFF18+RCV_BUFF19+RCV_BUFF20+RCV_BUFF21+RCV_BUFF22+RCV_BUFF23+RCV_BUFF24+RCV_BUFF25+RCV_BUFF26+RCV_BUFF27+RCV_BUFF28+RCV_BUFF29+RCV_BUFF30;
        RX_CHKDIGIT=RX_CHKDIGIT%256;
        if((RCV_BUFF00==255)&&(RCV_BUFF01==255)&&((RCV_BUFF30==250)||(RCV_BUFF30==255))&&(RCV_BUFF31==RX_CHKDIGIT)){
            RCV_VALUE00 = RCV_BUFF00;
            RCV_VALUE01 = RCV_BUFF01;
            RCV_VALUE02 = RCV_BUFF02;
            RCV_VALUE03 = RCV_BUFF03;
            RCV_VALUE04 = RCV_BUFF04;
            RCV_VALUE05 = RCV_BUFF05;
            RCV_VALUE06 = RCV_BUFF06;
            RCV_VALUE07 = RCV_BUFF07;
            RCV_VALUE08 = RCV_BUFF08;
            RCV_VALUE09 = RCV_BUFF09;
            RCV_VALUE10 = RCV_BUFF10;
            RCV_VALUE11 = RCV_BUFF11;
            RCV_VALUE12 = RCV_BUFF12;
            RCV_VALUE13 = RCV_BUFF13;
            RCV_VALUE14 = RCV_BUFF14;
            RCV_VALUE15 = RCV_BUFF15;
            RCV_VALUE16 = RCV_BUFF16;
            RCV_VALUE17 = RCV_BUFF17;
            RCV_VALUE18 = RCV_BUFF18;
            RCV_VALUE19 = RCV_BUFF19;
            RCV_VALUE20 = RCV_BUFF20;
            RCV_VALUE21 = RCV_BUFF21;
            RCV_VALUE22 = RCV_BUFF22;
            RCV_VALUE23 = RCV_BUFF23;
            RCV_VALUE24 = RCV_BUFF24;
            RCV_VALUE25 = RCV_BUFF25;
            RCV_VALUE26 = RCV_BUFF26;
            RCV_VALUE27 = RCV_BUFF27;
            RCV_VALUE28 = RCV_BUFF28;
            RCV_VALUE29 = RCV_BUFF29;
            RCV_VALUE30 = RCV_BUFF30;
            RCV_VALUE31 = RCV_BUFF31;
            RxFlg=1;
        }else{
        }
    }else{
    }
    if(RxFlg==1){
        RxFlg=0;
        SMELL=(RCV_VALUE02*256)+RCV_VALUE03;
        TEMP=((RCV_VALUE04*256)+RCV_VALUE05)/10;
        HUMI=RCV_VALUE06;
        CDS=(RCV_VALUE07*256)+RCV_VALUE08;
        NOISE=(RCV_VALUE09*256)+RCV_VALUE10;
        HUMAN=RCV_VALUE11;
        CO=(RCV_VALUE12*256)+RCV_VALUE13;
        CO2=(RCV_VALUE14*256)+RCV_VALUE15;
        DCIN=RCV_VALUE16;
        D_IN1=RCV_VALUE17;
        D_IN2=RCV_VALUE18;
        CONTACT1=RCV_VALUE25;
        CONTACT2=RCV_VALUE26;
        if(RCV_VALUE30==255){
                           struct tm timeinfo;
                getLocalTime(&timeinfo);
                    char timeMessage[128];
                sprintf(timeMessage,"%02d-%02d-%02dT%02d:%02d:%02d.%03d+09:00", timeinfo.tm_year+1900,timeinfo.tm_mon+1,timeinfo.tm_mday,timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec,milliSec);
                sprintf(pubMessage, "{\"timestamp\":\"%s\",\"TEMP\": %d,\"HUMI\": %d,\"CDS\": %d,\"NOISE\": %d,\"SMELL\": %d,\"HUMAN\": %d,\"CO\": %d,\"CO2\": %d}",timeMessage,TEMP,HUMI,CDS,NOISE,SMELL,HUMAN,CO,CO2);
                Serial.print("Publishing message to topic ");
                Serial.println(pubTopic);
                Serial.println(pubMessage);
                mqttClient.publish(pubTopic, pubMessage);
                Serial.println("Published.");

        }else{
        }
        if(RCV_VALUE30==250){
              Serial.write(255);
              Serial.write(255);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(0);
              Serial.write(254);  
        }else{
        }
    }
}