I'm going to be receiving packets on a master ESP from 8 different nodes so i need a way to verify which node it came from and possibly that the data is intact. Should i make a variable in each packets data struct to compare to on the receiving end?
here is my sending code,
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
extern "C" {
#include <osapi.h>
#include <os_type.h>
}
#include "config.h"
#define SSID "ESP-TEST"
#define PASSWORD "123456789"
#define SERVER_HOST_NAME "esp_server"
#define TCP_PORT 7050
#define DNS_PORT 53
struct sampleStruct {
int var1;
byte Array[20];
float var2;
unsigned long var3;
unsigned long var4;
unsigned long var5;
unsigned long var6;
unsigned long var7;
unsigned long var8;
bool var9;
};
sampleStruct st;
static os_timer_t intervalTimer;
static void replyToServer(void* arg) {
AsyncClient* client = reinterpret_cast<AsyncClient*>(arg);
// send reply
if (client->space() > 32 && client->canSend()) {
client->add((char *)&st, sizeof(sampleStruct));
client->send();
}
}
/* event callbacks */
static void handleData(void* arg, AsyncClient* client, void *data, size_t len) {
Serial.printf("\n data received from %s \n", client->remoteIP().toString().c_str());
Serial.write((uint8_t*)data, len);
os_timer_arm(&intervalTimer, 2000, true); // schedule for reply to server at next 2s
}
void setup() {
Serial.begin(115200);
delay(20);
WiFi.mode(WIFI_STA);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
Serial.print('.');
delay(500);
}
AsyncClient* client = new AsyncClient;
client->onData(&handleData, client);
client->connect(SERVER_HOST_NAME, TCP_PORT);
os_timer_disarm(&intervalTimer);
os_timer_setfn(&intervalTimer, &replyToServer, client);
}
void loop() {
}
The receiving code simply uses memcpy to move the data to the struct.
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <DNSServer.h>
#include <vector>
#include "config.h"
#define SSID "ESP-TEST"
#define PASSWORD "123456789"
#define SERVER_HOST_NAME "esp_server"
#define TCP_PORT 7050
#define DNS_PORT 53
static DNSServer DNS;
struct sampleStruct {
int var1 = 99;
//byte Array[];
float var2 = 0;
unsigned long var3 = 0;
unsigned long var4 = 0;
unsigned long var5 = 0;
unsigned long var6 = 0;
unsigned long var7 = 0;
unsigned long var8 = 0;
bool var9 = 0;
};
sampleStruct st;
static std::vector<AsyncClient*> clients; // a list to hold all clients
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());
memcpy(&st, data, sizeof(data));
Serial.write((char*)&data, sizeof(data));
// 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();
}
}
/* 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);
}
void setup() {
Serial.begin(115200);
delay(20);
Serial.println("server");
// 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();
}
Right now the code is very basic and built from ESPAsyncTCP Client/Server examples.