74 lines
2.0 KiB
C++
74 lines
2.0 KiB
C++
#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();
|
|
}
|