23 #define LOG_OUTPUT_DEBUG (1)
24 #define LOG_OUTPUT_DEBUG_PREFIX (1)
26 #define logDebug(arg)\
28 if (LOG_OUTPUT_DEBUG)\
30 if (LOG_OUTPUT_DEBUG_PREFIX)\
32 Serial.print("[LOG Debug: ");\
33 Serial.print((const char*)__FILE__);\
35 Serial.print((unsigned int)__LINE__);\
37 Serial.print((const char*)__FUNCTION__);\
44 #ifdef ESP8266_USE_SOFTWARE_SERIAL
45 ESP8266::ESP8266(SoftwareSerial &uart, uint32_t baud): m_puart(&uart)
51 ESP8266::ESP8266(HardwareSerial &uart, uint32_t baud): m_puart(&uart)
69 while (millis() - start < 3000) {
90 if (!qATCWMODE(&mode)) {
96 if (sATCWMODE(1) &&
restart()) {
107 if (!qATCWMODE(&mode)) {
113 if (sATCWMODE(2) &&
restart()) {
124 if (!qATCWMODE(&mode)) {
130 if (sATCWMODE(3) &&
restart()) {
147 return sATCWJAP(ssid, pwd);
157 return sATCWSAP(ssid, pwd, chl, ecn);
193 return sATCIPSTARTSingle(
"TCP", addr, port);
198 return eATCIPCLOSESingle();
203 return sATCIPSTARTSingle(
"UDP", addr, port);
208 return eATCIPCLOSESingle();
213 return sATCIPSTARTMultiple(mux_id,
"TCP", addr, port);
218 return sATCIPCLOSEMulitple(mux_id);
223 return sATCIPSTARTMultiple(mux_id,
"UDP", addr, port);
228 return sATCIPCLOSEMulitple(mux_id);
233 return sATCIPSTO(timeout);
238 if (sATCIPSERVER(1, port)) {
263 return sATCIPSENDSingle(buffer, len);
268 return sATCIPSENDMultiple(mux_id, buffer, len);
271 uint32_t
ESP8266::recv(uint8_t *buffer, uint32_t buffer_size, uint32_t timeout)
273 return recvPkg(buffer, buffer_size, NULL, timeout, NULL);
276 uint32_t
ESP8266::recv(uint8_t mux_id, uint8_t *buffer, uint32_t buffer_size, uint32_t timeout)
280 ret = recvPkg(buffer, buffer_size, NULL, timeout, &
id);
281 if (ret > 0 &&
id == mux_id) {
287 uint32_t
ESP8266::recv(uint8_t *coming_mux_id, uint8_t *buffer, uint32_t buffer_size, uint32_t timeout)
289 return recvPkg(buffer, buffer_size, NULL, timeout, coming_mux_id);
294 uint32_t ESP8266::recvPkg(uint8_t *buffer, uint32_t buffer_size, uint32_t *data_len, uint32_t timeout, uint8_t *coming_mux_id)
298 int32_t index_PIPDcomma = -1;
299 int32_t index_colon = -1;
300 int32_t index_comma = -1;
303 bool has_data =
false;
306 unsigned long start = millis();
307 while (millis() - start < timeout) {
308 while(m_puart->available() > 0) {
313 index_PIPDcomma = data.indexOf(
"+IPD,");
314 if (index_PIPDcomma != -1) {
316 index_colon = data.indexOf(
':', index_PIPDcomma + 5);
317 if (index_colon != -1) {
321 index_comma = data.indexOf(
',', index_PIPDcomma + 5);
324 if (index_comma != -1 && index_comma < index_colon) {
326 id = data.substring(index_PIPDcomma + 5, index_comma).toInt();
328 if (id < 0 || id > 4) {
332 len = data.substring(index_comma + 1, index_colon).toInt();
339 len = data.substring(index_PIPDcomma + 5, index_colon).toInt();
357 while (millis() - start < 3000) {
358 while(m_puart->available() > 0) {
363 if (data.length() >= index_colon + 1 + len) {
367 if (index_comma != -1 && coming_mux_id) {
372 uint32_t ret = len > buffer_size ? buffer_size : len;
375 data.substring(index_colon + 1, index_colon + 1 + len).c_str(),
386 void ESP8266::rx_empty(
void)
388 while(m_puart->available() > 0) {
393 String ESP8266::recvString(String target, uint32_t timeout)
397 unsigned long start = millis();
398 while (millis() - start < timeout) {
399 while(m_puart->available() > 0) {
401 if(a ==
'\0')
continue;
404 if (data.indexOf(target) != -1) {
411 String ESP8266::recvString(String target1, String target2, uint32_t timeout)
415 unsigned long start = millis();
416 while (millis() - start < timeout) {
417 while(m_puart->available() > 0) {
419 if(a ==
'\0')
continue;
422 if (data.indexOf(target1) != -1) {
424 }
else if (data.indexOf(target2) != -1) {
431 String ESP8266::recvString(String target1, String target2, String target3, uint32_t timeout)
435 unsigned long start = millis();
436 while (millis() - start < timeout) {
437 while(m_puart->available() > 0) {
439 if(a ==
'\0')
continue;
442 if (data.indexOf(target1) != -1) {
444 }
else if (data.indexOf(target2) != -1) {
446 }
else if (data.indexOf(target3) != -1) {
453 bool ESP8266::recvFind(String target, uint32_t timeout)
456 data_tmp = recvString(target, timeout);
457 if (data_tmp.indexOf(target) != -1) {
463 bool ESP8266::recvFindAndFilter(String target, String begin, String end, String &data, uint32_t timeout)
466 data_tmp = recvString(target, timeout);
467 if (data_tmp.indexOf(target) != -1) {
468 int32_t index1 = data_tmp.indexOf(begin);
469 int32_t index2 = data_tmp.indexOf(end);
470 if (index1 != -1 && index2 != -1) {
471 index1 += begin.length();
472 data = data_tmp.substring(index1, index2);
480 bool ESP8266::eAT(
void)
483 m_puart->println(
"AT");
484 return recvFind(
"OK");
487 bool ESP8266::eATRST(
void)
490 m_puart->println(
"AT+RST");
491 return recvFind(
"OK");
494 bool ESP8266::eATGMR(String &version)
497 m_puart->println(
"AT+GMR");
498 return recvFindAndFilter(
"OK",
"\r\r\n",
"\r\n\r\nOK", version);
501 bool ESP8266::qATCWMODE(uint8_t *mode)
509 m_puart->println(
"AT+CWMODE?");
510 ret = recvFindAndFilter(
"OK",
"+CWMODE:",
"\r\n\r\nOK", str_mode);
512 *mode = (uint8_t)str_mode.toInt();
519 bool ESP8266::sATCWMODE(uint8_t mode)
523 m_puart->print(
"AT+CWMODE=");
524 m_puart->println(mode);
526 data = recvString(
"OK",
"no change");
527 if (data.indexOf(
"OK") != -1 || data.indexOf(
"no change") != -1) {
533 bool ESP8266::sATCWJAP(String ssid, String pwd)
537 m_puart->print(
"AT+CWJAP=\"");
538 m_puart->print(ssid);
539 m_puart->print(
"\",\"");
541 m_puart->println(
"\"");
543 data = recvString(
"OK",
"FAIL", 10000);
544 if (data.indexOf(
"OK") != -1) {
550 bool ESP8266::eATCWLAP(String &list)
554 m_puart->println(
"AT+CWLAP");
555 return recvFindAndFilter(
"OK",
"\r\r\n",
"\r\n\r\nOK", list, 10000);
558 bool ESP8266::eATCWQAP(
void)
562 m_puart->println(
"AT+CWQAP");
563 return recvFind(
"OK");
566 bool ESP8266::sATCWSAP(String ssid, String pwd, uint8_t chl, uint8_t ecn)
570 m_puart->print(
"AT+CWSAP=\"");
571 m_puart->print(ssid);
572 m_puart->print(
"\",\"");
574 m_puart->print(
"\",");
577 m_puart->println(ecn);
579 data = recvString(
"OK",
"ERROR", 5000);
580 if (data.indexOf(
"OK") != -1) {
586 bool ESP8266::eATCWLIF(String &list)
590 m_puart->println(
"AT+CWLIF");
591 return recvFindAndFilter(
"OK",
"\r\r\n",
"\r\n\r\nOK", list);
593 bool ESP8266::eATCIPSTATUS(String &list)
598 m_puart->println(
"AT+CIPSTATUS");
599 return recvFindAndFilter(
"OK",
"\r\r\n",
"\r\n\r\nOK", list);
601 bool ESP8266::sATCIPSTARTSingle(String type, String addr, uint32_t port)
605 m_puart->print(
"AT+CIPSTART=\"");
606 m_puart->print(type);
607 m_puart->print(
"\",\"");
608 m_puart->print(addr);
609 m_puart->print(
"\",");
610 m_puart->println(port);
612 data = recvString(
"OK",
"ERROR",
"ALREADY CONNECT", 10000);
613 if (data.indexOf(
"OK") != -1 || data.indexOf(
"ALREADY CONNECT") != -1) {
618 bool ESP8266::sATCIPSTARTMultiple(uint8_t mux_id, String type, String addr, uint32_t port)
622 m_puart->print(
"AT+CIPSTART=");
623 m_puart->print(mux_id);
624 m_puart->print(
",\"");
625 m_puart->print(type);
626 m_puart->print(
"\",\"");
627 m_puart->print(addr);
628 m_puart->print(
"\",");
629 m_puart->println(port);
631 data = recvString(
"OK",
"ERROR",
"ALREADY CONNECT", 10000);
632 if (data.indexOf(
"OK") != -1 || data.indexOf(
"ALREADY CONNECT") != -1) {
637 bool ESP8266::sATCIPSENDSingle(
const uint8_t *buffer, uint32_t len)
640 m_puart->print(
"AT+CIPSEND=");
641 m_puart->println(len);
642 if (recvFind(
">", 5000)) {
644 for (uint32_t i = 0; i < len; i++) {
645 m_puart->write(buffer[i]);
647 return recvFind(
"SEND OK", 10000);
651 bool ESP8266::sATCIPSENDMultiple(uint8_t mux_id,
const uint8_t *buffer, uint32_t len)
654 m_puart->print(
"AT+CIPSEND=");
655 m_puart->print(mux_id);
657 m_puart->println(len);
658 if (recvFind(
">", 5000)) {
660 for (uint32_t i = 0; i < len; i++) {
661 m_puart->write(buffer[i]);
663 return recvFind(
"SEND OK", 10000);
667 bool ESP8266::sATCIPCLOSEMulitple(uint8_t mux_id)
671 m_puart->print(
"AT+CIPCLOSE=");
672 m_puart->println(mux_id);
674 data = recvString(
"OK",
"link is not", 5000);
675 if (data.indexOf(
"OK") != -1 || data.indexOf(
"link is not") != -1) {
680 bool ESP8266::eATCIPCLOSESingle(
void)
683 m_puart->println(
"AT+CIPCLOSE");
684 return recvFind(
"OK", 5000);
686 bool ESP8266::eATCIFSR(String &list)
689 m_puart->println(
"AT+CIFSR");
690 return recvFindAndFilter(
"OK",
"\r\r\n",
"\r\n\r\nOK", list);
692 bool ESP8266::sATCIPMUX(uint8_t mode)
696 m_puart->print(
"AT+CIPMUX=");
697 m_puart->println(mode);
699 data = recvString(
"OK",
"Link is builded");
700 if (data.indexOf(
"OK") != -1) {
705 bool ESP8266::sATCIPSERVER(uint8_t mode, uint32_t port)
710 m_puart->print(
"AT+CIPSERVER=1,");
711 m_puart->println(port);
713 data = recvString(
"OK",
"no change");
714 if (data.indexOf(
"OK") != -1 || data.indexOf(
"no change") != -1) {
720 m_puart->println(
"AT+CIPSERVER=0");
721 return recvFind(
"\r\r\n");
724 bool ESP8266::sATCIPSTO(uint32_t timeout)
727 m_puart->print(
"AT+CIPSTO=");
728 m_puart->println(timeout);
729 return recvFind(
"OK");
bool send(const uint8_t *buffer, uint32_t len)
Send data based on TCP or UDP builded already in single mode.
String getVersion(void)
Get the version of AT Command Set.
bool releaseTCP(void)
Release TCP connection in single mode.
uint32_t recv(uint8_t *buffer, uint32_t buffer_size, uint32_t timeout=1000)
Receive data from TCP or UDP builded already in single mode.
bool enableMUX(void)
Enable IP MUX(multiple connection mode).
String getLocalIP(void)
Get the IP address of ESP8266.
bool setOprToSoftAP(void)
Set operation mode to softap.
The definition of class ESP8266.
bool setOprToStationSoftAP(void)
Set operation mode to station + softap.
bool createTCP(String addr, uint32_t port)
Create TCP connection in single mode.
bool unregisterUDP(void)
Unregister UDP port number in single mode.
bool startServer(uint32_t port=333)
Start Server(Only in multiple mode).
bool stopTCPServer(void)
Stop TCP Server(Only in multiple mode).
bool stopServer(void)
Stop Server(Only in multiple mode).
bool disableMUX(void)
Disable IP MUX(single connection mode).
bool restart(void)
Restart ESP8266 by "AT+RST".
bool kick(void)
Verify ESP8266 whether live or not.
bool joinAP(String ssid, String pwd)
Join in AP.
bool registerUDP(String addr, uint32_t port)
Register UDP port number in single mode.
bool leaveAP(void)
Leave AP joined before.
bool setTCPServerTimeout(uint32_t timeout=180)
Set the timeout of TCP Server.
bool startTCPServer(uint32_t port=333)
Start TCP Server(Only in multiple mode).
bool setSoftAPParam(String ssid, String pwd, uint8_t chl=7, uint8_t ecn=4)
Set SoftAP parameters.
bool setOprToStation(void)
Set operation mode to staion.
String getAPList(void)
Search available AP list and return it.
String getIPStatus(void)
Get the current status of connection(UDP and TCP).
String getJoinedDeviceIP(void)
Get the IP list of devices connected to SoftAP.