const int maxNumberOfClients = 10;
int SIZE = 3899;
char *htmlCode = "
Clock Settings
";
void getReply3(int wait)
{
long int time = millis();
while ( (time + wait) > millis())
{
while (Serial3.available())
Serial.write(Serial3.read());
}
}
void loadPacket(char *packet, int len , int clientId)
{
String packetHeader = "AT+CIPSEND=" + String(clientId, DEC) + ',' + String(len, DEC) + "\r\n";
delay(300);
Serial3.print(packetHeader);
String d = "";
do
{
if (Serial3.available())
{
d = Serial3.readString();
}
}
while (d.indexOf(">") < 0);
delay(100);
Serial.println("SENT:" + packetHeader);
//Serial3.print("\r\n");
Serial3.print( packet );
//Serial3.print("\r\n");
d = "";
do
{
if (Serial3.available())
{
d = Serial3.readString();
}
}
while (d.indexOf("SEND") < 0);
delay(100);
Serial.print("SENT:");
Serial.print(packet);
}
void loadHTML(int clientId)
{
int packageSize = 800;
int nPackage = ((int)(SIZE / packageSize) + 1);
String headerText = "HTTP/1.1 200 OK\nContent-Length: " + String(SIZE , DEC) + "\nContent-Type: text/html\nConnection: Closed";
loadPacket(headerText.c_str(), headerText.length(), clientId);
String part = "";
int from = 0;
int to = from + packageSize;
for (int i = 0; i < nPackage ; i++)
{
Serial.print("sending body packet ");
Serial.print(i);
Serial.print(" ...");
getReply3(3000);
from = i * packageSize;
to = from + packageSize;
if (to > SIZE)
to = SIZE;
part = "";
for (int k = from; k < to; k++)
part += htmlCode[k];
loadPacket(part.c_str(), part.length(), clientId);
Serial.print("DONE SNEDING DATA");
Serial.println(i);
}
Serial.println("body is loaded");
}
void breakConnection(int clientId)
{
String command = "AT+CIPCLOSE=" + String(clientId, DEC) + "\r\n";
Serial3.print(command);
Serial.print("SENT:" + command);
}
void setup()
{
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
Serial3.begin(115200);
Serial.begin(115200);
while (!Serial);
while (!Serial3);
Serial.println("starting...");
Serial3.print("AT+RST\r\n");
getReply3(2000);
Serial3.print("AT+CWMODE=3\r\n");
getReply3(2000);
Serial3.print("AT+CIPMUX=1\r\n");
getReply3(2000);
Serial3.print("AT+CIPSERVER=1,80\r\n");
getReply3(2000);
Serial.println("*****READY*****");
digitalWrite(13, HIGH);
}
class dynamicStack
{
public:
int clientId[maxNumberOfClients];
int topPointer = -1;
int linearSearch(int data)
{
for (int i = 0; i <= topPointer ; i++)
{
if (clientId[i] == data)
return i;
}
return -1;
}
bool isFull()
{
return (topPointer == maxNumberOfClients - 1);
}
bool isEmpty()
{
(topPointer == -1);
}
bool push(int data)
{
topPointer++;
if (topPointer >= maxNumberOfClients || topPointer < 0)
return false;
clientId[topPointer] = data;
return true;
}
int pop()
{
topPointer--;
if (topPointer < -1)
topPointer = -1;
return clientId[topPointer + 1];
}
};
dynamicStack clientIdStack;
String data = "";
void loop()
{
//********FETCHING MESSAGE***********
START:
Serial3.print("AT+GMR\r\n");
getReply3(2000);
goto START;
while (!Serial3.available());
data = Serial3.readString();
if (data.length() <= 0)
goto START;
Serial.println("RECEIVED:");
Serial.println( "length: " + String(data.length(), DEC));
Serial.print("##");
Serial.print(data);
Serial.println("##");
//********FETCHING MESSAGE END***********
int index = data.indexOf("CONNECT");
if (index >= 0)
{
Serial.println( "found CONNECT keyword at index ");
Serial.print(index);
int newClientId = (data[index - 2]) - '0';
clientIdStack.push(newClientId);
Serial.print("NEW CLIENT IS CONNECTED with client ID ");
Serial.println(newClientId);
}
index = data.indexOf("+IPD");
if (index >= 0)
{
Serial.print( "found +IPD keyword at index ");
Serial.println(index);
int clientId = data[index + 5] - '0';
Serial.print("GET request is made by client ");
Serial.println(clientId);
Serial.println("*****LOADING HTML PAGE******");
loadHTML(clientId);
getReply3(2000);
Serial.println("*****HTML PAGE IS LOADED******");
breakConnection(clientId);
clientIdStack.pop();
}
}