Statistics: Posted by ESP_Faye — Thu Apr 16, 2015 10:28 am
Statistics: Posted by jyke — Thu Mar 26, 2015 3:19 am
Statistics: Posted by jyke — Tue Mar 03, 2015 12:01 am
Statistics: Posted by Her Mary — Mon Mar 02, 2015 11:21 am
Statistics: Posted by jyke — Sat Feb 28, 2015 5:51 pm
Statistics: Posted by ESP_Faye — Fri Feb 27, 2015 4:04 pm
Code:
#include "SoftwareSerial.h"
// espn8266 baud rate set as: AT+UART=9600,8,1,0,0
SoftwareSerial esp8266(2, 3);
char message[200];
const char endl[] = "\r\n";
const char OK[] = "OK";
const char ERROR[] = "ERROR";
const char AT[] = "AT\r\n";
const char GMR[] = "AT+GMR\r\n";
const char RESET[] = "AT+RST\r\n";
const char CIPSEND[] = "AT+CIPSEND=%i,%u\r\n";
const char CWMODE[] = "AT+CWMODE?\r\n";
const char SET_CWMODE[] = "AT+CWMODE=%i\r\n";
const char AP[] = "AT+CWJAP?\r\n";
const char SET_AP[] = "AT+CWJAP=\"%s\",\"%s\"\r\n";
const char ESP8266_AP[] = "AT+CWSAP?\r\n";
const char SET_ESP8266_AP[] = "AT+CWSAP=\"%s\",\"%s\",%i,%i\r\n";
const char ESP8266_AP_IP[] = "AT+CIPAP?\r\n";
const char AP_IP[] = "AT+CIPSTA?\r\n";
const char MUX[] = "AT+CIPMUX?\r\n";
const char SET_MUX[] = "AT+CIPMUX=%i\r\n";
const char SET_TCP_SERVER[] = "AT+CIPSERVER=%i,%i\r\n";
const char CLOSE_CONNECTION[] = "AT+CIPCLOSE";
const char RECEIVE_DATA[] = "+IPD,";
const char SEND_MODE[] = "AT+CIPMODE?\r\n";
const char SET_SEND_MODE[] = "AT+CIPMODE=%i\r\n";
#define DEBUG_F(VAL) Debug(VAL);
void Debug(const char *val)
{
Serial.print(val);
}
void Debug(bool val)
{
val ? Serial.print("TRUE\n") : Serial.print("FALSE\n");
}
void Debug(int val)
{
Serial.print(val);
Serial.print("\n");
}
void Debug(unsigned int val)
{
Serial.print(val);
Serial.print("\n");
}
void AtCommand(const char *command)
{
esp8266.print(command);
DEBUG_F(command);
delay(20);
}
bool AtReturnOK()
{
bool ret = false;
if (esp8266.find("OK"))
{
ret = true;
}
DEBUG_F(ret);
return ret;
}
bool SetBaudRate(const unsigned int val)
{
DEBUG_F("Set baud: ")
DEBUG_F(val)
esp8266.begin(val);
delay(250);
AtCommand(AT);
return AtReturnOK();
}
bool SetWifiMode(int mode)
{
char command[64];
sprintf(command, SET_CWMODE, mode);
AtCommand(command);
return AtReturnOK();
}
bool Reset()
{
DEBUG_F(RESET)
esp8266.print(RESET);
bool ret = AtReturnOK();
for (int i = 0; i < 10; i++)
{
delay(200);
AtCommand(AT);
if (AtReturnOK())
{
break;
}
}
return ret;
};
void SetEsp8266Accesspoint(char *ssid, char *pwd, int channel, int security)
{
int len = strlen(ssid) + strlen(pwd) + strlen(SET_ESP8266_AP) + 1;
char *command = new char[len];
esp8266.setTimeout(5000);
sprintf(command, SET_ESP8266_AP, ssid, pwd, channel, security);
AtCommand(command);
esp8266.setTimeout(1000);
delete[]command;
Reset();
}
bool SetAccesspoint(char *ssid, char *pwd)
{
int len = strlen(ssid) + strlen(pwd) + strlen(SET_AP) + 1;
char *command = new char[len];
sprintf(command, SET_AP, ssid, pwd);
AtCommand(command);
delete[]command;
bool ret = false;
esp8266.setTimeout(20000);
if (AtReturnOK())
{
ret = true;
}
esp8266.setTimeout(1000);
return ret;
}
bool SetConnectionMode(int mode)
{
char command[64];
sprintf(command, SET_MUX, mode);
AtCommand(command);
return(AtReturnOK());
}
bool SetTcpServer(int mode, int port)
{
char command[64];
sprintf(command, SET_TCP_SERVER, mode, port);
AtCommand(command);
esp8266.setTimeout(5000);
AtReturnOK();
esp8266.setTimeout(1000);
return true;
}
bool DataReceived(int &id, int &len)
{
if (esp8266.available())
{
if (esp8266.find((char*)RECEIVE_DATA))
{
DEBUG_F("Data available:\n")
String str = esp8266.readStringUntil(':');
DEBUG_F(str.c_str())
DEBUG_F(":\n")
int first;
int second;
int cnt = sscanf(str.c_str(), "%i,%i", &first, &second);
if (cnt == 1)
{
len = first;
id = -1;
return true;
}
else if (cnt == 2)
{
id = first;
len = second;
return true;
}
}
}
return false;
}
size_t ReceiveData(size_t len, char *buf)
{
esp8266.setTimeout(5000);
len = esp8266.readBytes(buf, len);
esp8266.setTimeout(1000);
return len;
}
bool SendIpMessage(int connection, char *message, long unsigned int msglen)
{
bool ret = false;
esp8266.setTimeout(5000);
bool retry = true;
while (msglen)
{
unsigned int dataLen = msglen < 2048 ? msglen : 2048;
tryAgain:
char val[5];
char command[64];
sprintf(command, "AT+CIPSEND=");
if (connection != -1)
{
strcat(command, itoa(connection, val, 10));
strcat(command, ",");
}
strcat(command, itoa(dataLen, val, 10));
strcat(command, "\r\n");
AtCommand(command);
command[0] = 0;
if (!esp8266.findUntil((char*)&command, ">"))
{
DEBUG_F(command);
if (retry)
{
retry = false;
goto tryAgain;
}
else return false;
}
esp8266.write(message, dataLen);
Serial.write(message, dataLen);
if (!AtReturnOK() && retry)
{
goto tryAgain;
}
msglen -= dataLen;
message += dataLen;
delay(50);
}
esp8266.setTimeout(1000);
return ret;
};
bool CloseConnection(int connection = -1)
{
char command[64];
if (connection == -1)
{
sprintf(command, "%s\r\n", CLOSE_CONNECTION);
}
else
{
sprintf(command, "%s=%i\r\n", CLOSE_CONNECTION, connection);
}
AtCommand(command);
return AtReturnOK();
}
void setup()
{
for (int i = 0; i < 200; i++)
{
message[i] = i % 10 + '0';
}
Serial.begin(115200);
delay(200);
SetBaudRate(9600);
SetWifiMode(3);
SetEsp8266Accesspoint("test", "", 7, 0);
SetAccesspoint("wlan", "1234567890123");
SetConnectionMode(1);
SetTcpServer(1, 80);
/* add setup code here */
}
void loop()
{
int id;
int len;
if (DataReceived(id, len))
{
// char *buf = new char[64];
char buf[64];
while (len)
{
int read = ReceiveData(len > 64 ? 64 : len, buf);
if (!read)
{
break;
}
Serial.write(buf, read);
len -= read;
}
char msg[64];
for (int i = 1; i < 50; i++)
{
for (int x = 0; x < 2; x++)
{
sprintf(msg, "\r\nNext Message Len %i:\r\n", i);
SendIpMessage(id, (char*)&msg, strlen(msg));
SendIpMessage(id, (char*)&message, i);
}
}
CloseConnection(id);
}
}
Statistics: Posted by jyke — Wed Feb 25, 2015 3:32 am