Subversion Repositories ESP8266_P1_Meter

Rev

Blame | Last modification | View Log | RSS feed

#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <DNSServer.h>
#include <vector>

#include "config.h"

static DNSServer DNS;

static std::vector<AsyncClient*> clients; // a list to hold all clients

 /* clients events */
static void handleError(void* arg, AsyncClient* client, int8_t error) {
        Serial.printf("\n connection error %s from client %s \n", client->errorToString(error), client->remoteIP().toString().c_str());
}

static void handleData(void* arg, AsyncClient* client, void *data, size_t len) {
        Serial.printf("\n data received from client %s \n", client->remoteIP().toString().c_str());
        Serial.write((uint8_t*)data, len);

        // reply to client
        if (client->space() > 32 && client->canSend()) {
                char reply[32];
                sprintf(reply, "this is from %s", SERVER_HOST_NAME);
                client->add(reply, strlen(reply));
                client->send();
        }
}

static void handleDisconnect(void* arg, AsyncClient* client) {
        Serial.printf("\n client %s disconnected \n", client->remoteIP().toString().c_str());
}

static void handleTimeOut(void* arg, AsyncClient* client, uint32_t time) {
        Serial.printf("\n client ACK timeout ip: %s \n", client->remoteIP().toString().c_str());
}


/* server events */
static void handleNewClient(void* arg, AsyncClient* client) {
        Serial.printf("\n new client has been connected to server, ip: %s", client->remoteIP().toString().c_str());

        // add to list
        clients.push_back(client);
        
        // register events
        client->onData(&handleData, NULL);
        client->onError(&handleError, NULL);
        client->onDisconnect(&handleDisconnect, NULL);
        client->onTimeout(&handleTimeOut, NULL);
}

void setup() {
        Serial.begin(115200);
        delay(20);
        
        // create access point
        while (!WiFi.softAP(SSID, PASSWORD, 6, false, 15)) {
                delay(500);
        }

        // start dns server
        if (!DNS.start(DNS_PORT, SERVER_HOST_NAME, WiFi.softAPIP()))
                Serial.printf("\n failed to start dns service \n");

        AsyncServer* server = new AsyncServer(TCP_PORT); // start listening on tcp port 7050
        server->onClient(&handleNewClient, server);
        server->begin();
}

void loop() {
        DNS.processNextRequest();
}