251 lines
5.4 KiB
C++
251 lines
5.4 KiB
C++
#include "ESP8266.h"
|
|
#if !defined(RADIOLIB_EXCLUDE_ESP8266) && !defined(ESP8266)
|
|
|
|
ESP8266::ESP8266(Module* module) {
|
|
_mod = module;
|
|
}
|
|
|
|
int16_t ESP8266::begin(long speed) {
|
|
// set module properties
|
|
char lf[3] = "\r\n";
|
|
memcpy(_mod->AtLineFeed, lf, strlen(lf));
|
|
_mod->baudrate = speed;
|
|
_mod->init(RADIOLIB_USE_UART);
|
|
|
|
// empty UART buffer (garbage data)
|
|
_mod->ATemptyBuffer();
|
|
|
|
// test AT setup
|
|
if(!_mod->ATsendCommand("AT")) {
|
|
return(ERR_AT_FAILED);
|
|
}
|
|
|
|
return(ERR_NONE);
|
|
}
|
|
|
|
int16_t ESP8266::reset() {
|
|
// send the reset command
|
|
if(!_mod->ATsendCommand("AT+RST")) {
|
|
return(ERR_AT_FAILED);
|
|
}
|
|
|
|
// wait for the module to start
|
|
delay(2000);
|
|
|
|
// test AT setup
|
|
uint32_t start = millis();
|
|
while (millis() - start < 3000) {
|
|
if(!_mod->ATsendCommand("AT")) {
|
|
delay(100);
|
|
} else {
|
|
return(ERR_NONE);
|
|
}
|
|
}
|
|
|
|
return(ERR_AT_FAILED);
|
|
}
|
|
|
|
int16_t ESP8266::join(const char* ssid, const char* password) {
|
|
// set mode to station + soft AP
|
|
if(!_mod->ATsendCommand("AT+CWMODE_CUR=3")) {
|
|
return(ERR_AT_FAILED);
|
|
}
|
|
|
|
// build AT command
|
|
const char* atStr = "AT+CWJAP_CUR=\"";
|
|
#ifdef RADIOLIB_STATIC_ONLY
|
|
char cmd[RADIOLIB_STATIC_ARRAY_SIZE];
|
|
#else
|
|
uint8_t cmdLen = strlen(atStr) + strlen(ssid) + strlen(password) + 4;
|
|
char* cmd = new char[cmdLen + 1];
|
|
#endif
|
|
strcpy(cmd, atStr);
|
|
strcat(cmd, ssid);
|
|
strcat(cmd, "\",\"");
|
|
strcat(cmd, password);
|
|
strcat(cmd, "\"");
|
|
|
|
// send command
|
|
bool res = _mod->ATsendCommand(cmd);
|
|
#ifndef RADIOLIB_STATIC_ONLY
|
|
delete[] cmd;
|
|
#endif
|
|
if(!res) {
|
|
return(ERR_AT_FAILED);
|
|
}
|
|
|
|
// disable multiple connection mode
|
|
if(!_mod->ATsendCommand("AT+CIPMUX=0")) {
|
|
return(ERR_AT_FAILED);
|
|
}
|
|
|
|
return(ERR_NONE);
|
|
}
|
|
|
|
int16_t ESP8266::openTransportConnection(const char* host, const char* protocol, uint16_t port, uint16_t tcpKeepAlive) {
|
|
char portStr[6];
|
|
sprintf(portStr, "%u", port);
|
|
char tcpKeepAliveStr[6];
|
|
sprintf(tcpKeepAliveStr, "%u", tcpKeepAlive);
|
|
|
|
// build AT command
|
|
const char* atStr = "AT+CIPSTART=\"";
|
|
#ifdef RADIOLIB_STATIC_ONLY
|
|
char cmd[RADIOLIB_STATIC_ARRAY_SIZE];
|
|
#else
|
|
uint8_t cmdLen = strlen(atStr) + strlen(protocol) + strlen(host) + strlen(portStr) + 5;
|
|
if((strcmp(protocol, "TCP") == 0) && (tcpKeepAlive > 0)) {
|
|
cmdLen += strlen(tcpKeepAliveStr) + 1;
|
|
}
|
|
char* cmd = new char[cmdLen + 1];
|
|
#endif
|
|
strcpy(cmd, atStr);
|
|
strcat(cmd, protocol);
|
|
strcat(cmd, "\",\"");
|
|
strcat(cmd, host);
|
|
strcat(cmd, "\",");
|
|
strcat(cmd, portStr);
|
|
if((strcmp(protocol, "TCP") == 0) && (tcpKeepAlive > 0)) {
|
|
strcat(cmd, ",");
|
|
strcat(cmd, tcpKeepAliveStr);
|
|
}
|
|
|
|
// send command
|
|
bool res = _mod->ATsendCommand(cmd);
|
|
#ifndef RADIOLIB_STATIC_ONLY
|
|
delete[] cmd;
|
|
#endif
|
|
if(!res) {
|
|
return(ERR_AT_FAILED);
|
|
}
|
|
|
|
return(ERR_NONE);
|
|
}
|
|
|
|
int16_t ESP8266::closeTransportConnection() {
|
|
// send AT command
|
|
if(!_mod->ATsendCommand("AT+CIPCLOSE")) {
|
|
return(ERR_AT_FAILED);
|
|
}
|
|
return(ERR_NONE);
|
|
}
|
|
|
|
int16_t ESP8266::send(const char* data) {
|
|
// build AT command
|
|
char lenStr[12];
|
|
sprintf(lenStr, "%u", (uint16_t)strlen(data));
|
|
const char* atStr = "AT+CIPSEND=";
|
|
#ifdef RADIOLIB_STATIC_ONLY
|
|
char cmd[RADIOLIB_STATIC_ARRAY_SIZE];
|
|
#else
|
|
char* cmd = new char[strlen(atStr) + strlen(lenStr) + 1];
|
|
#endif
|
|
strcpy(cmd, atStr);
|
|
strcat(cmd, lenStr);
|
|
|
|
// send command
|
|
bool res = _mod->ATsendCommand(cmd);
|
|
#ifndef RADIOLIB_STATIC_ONLY
|
|
delete[] cmd;
|
|
#endif
|
|
if(!res) {
|
|
return(ERR_AT_FAILED);
|
|
}
|
|
|
|
// send data
|
|
if(!_mod->ATsendCommand(data)) {
|
|
return(ERR_AT_FAILED);
|
|
}
|
|
|
|
return(ERR_NONE);
|
|
}
|
|
|
|
int16_t ESP8266::send(uint8_t* data, size_t len) {
|
|
// build AT command
|
|
char lenStr[8];
|
|
sprintf(lenStr, "%u", (uint16_t)len);
|
|
const char atStr[] = "AT+CIPSEND=";
|
|
#ifdef RADIOLIB_STATIC_ONLY
|
|
char cmd[RADIOLIB_STATIC_ARRAY_SIZE];
|
|
#else
|
|
char* cmd = new char[strlen(atStr) + strlen(lenStr) + 1];
|
|
#endif
|
|
strcpy(cmd, atStr);
|
|
strcat(cmd, lenStr);
|
|
|
|
// send command
|
|
bool res = _mod->ATsendCommand(cmd);
|
|
#ifndef RADIOLIB_STATIC_ONLY
|
|
delete[] cmd;
|
|
#endif
|
|
if(!res) {
|
|
return(ERR_AT_FAILED);
|
|
}
|
|
|
|
// send data
|
|
if(!_mod->ATsendData(data, len)) {
|
|
return(ERR_AT_FAILED);
|
|
}
|
|
|
|
return(ERR_NONE);
|
|
}
|
|
|
|
size_t ESP8266::receive(uint8_t* data, size_t len, uint32_t timeout) {
|
|
size_t i = 0;
|
|
uint32_t start = millis();
|
|
|
|
// wait until the required number of bytes is received or until timeout
|
|
while((millis() - start < timeout) && (i < len)) {
|
|
yield();
|
|
while(_mod->ModuleSerial->available() > 0) {
|
|
uint8_t b = _mod->ModuleSerial->read();
|
|
RADIOLIB_DEBUG_PRINT(b);
|
|
data[i] = b;
|
|
i++;
|
|
}
|
|
}
|
|
return(i);
|
|
}
|
|
|
|
size_t ESP8266::getNumBytes(uint32_t timeout, size_t minBytes) {
|
|
// wait for available data
|
|
uint32_t start = millis();
|
|
while(_mod->ModuleSerial->available() < (int16_t)minBytes) {
|
|
yield();
|
|
if(millis() - start >= timeout) {
|
|
return(0);
|
|
}
|
|
}
|
|
|
|
// read response
|
|
char rawStr[20];
|
|
uint8_t i = 0;
|
|
start = millis();
|
|
while(_mod->ModuleSerial->available() > 0) {
|
|
yield();
|
|
char c = _mod->ModuleSerial->read();
|
|
rawStr[i++] = c;
|
|
if(c == ':') {
|
|
rawStr[i++] = 0;
|
|
break;
|
|
}
|
|
if(millis() - start >= timeout) {
|
|
rawStr[i++] = 0;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// get the number of bytes in response
|
|
char* pch = strtok(rawStr, ",:");
|
|
if(pch == NULL) {
|
|
return(0);
|
|
}
|
|
|
|
pch = strtok(NULL, ",:");
|
|
if(pch == NULL) {
|
|
return(0);
|
|
}
|
|
|
|
return(atoi(pch));
|
|
}
|
|
#endif
|