Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
ESP8266.cpp
00001 #include "ESP8266.h " 00002 00003 00004 ESP8266::ESP8266(PinName tx, PinName rx, int baud_rate):m_uart(tx, rx) { 00005 m_uart.begin(baud_rate); 00006 m_uart.flush(); 00007 m_uart.setTimeout(1000); 00008 } 00009 00010 int ESP8266::getMuxID(void) { 00011 return m_mux_id; 00012 } 00013 00014 bool ESP8266::reset(void) 00015 { 00016 unsigned long start; 00017 m_uart.setTimeout(100); 00018 m_uart.flush(); 00019 m_uart.println("AT+RST"); 00020 if (!m_uart.find("OK")) { 00021 return false; 00022 } 00023 00024 delay(2000); 00025 00026 start = millis(); 00027 while (millis() - start < 3000) { 00028 m_uart.flush(); 00029 m_uart.println("AT"); 00030 if (m_uart.find("OK")) { 00031 delay(500); 00032 return true; 00033 } 00034 delay(100); 00035 } 00036 return false; 00037 } 00038 00039 bool ESP8266::setStationMode(String ssid, String pwd) 00040 { 00041 if (!confMode(ESP8266_MODE_STA)) 00042 { 00043 return false; 00044 } 00045 return confJAP(ssid, pwd); 00046 } 00047 00048 bool ESP8266::setSoftAPMode(String sap_ssid, String sap_pwd, int chl, ESP8266Encrypstion ecn) 00049 { 00050 if (!confMode(ESP8266_MODE_SAP)) 00051 { 00052 return false; 00053 } 00054 return confSAP(sap_ssid, sap_pwd, chl, ecn); 00055 } 00056 00057 bool ESP8266::setStationSoftAPMode(String ssid, String pwd, String sap_ssid, String sap_pwd , 00058 int chl, ESP8266Encrypstion ecn) 00059 { 00060 if (!confMode(ESP8266_MODE_STA_SAP)) 00061 { 00062 return false; 00063 } 00064 if (confJAP(ssid, pwd) && confSAP(sap_ssid, sap_pwd, chl, ecn)) { 00065 return true; 00066 } else { 00067 return false; 00068 } 00069 } 00070 00071 bool ESP8266::ipConfig(ESP8266CommType type, String addr, int port, ESP8266Mux mux, int id) 00072 { 00073 bool result = false; 00074 if (mux == ESP8266_MUX_SINGLE) 00075 { 00076 confMux(mux); 00077 delay(5000); 00078 result = newMux(type, addr, port); 00079 } 00080 else if (mux == ESP8266_MUX_MULTIPLE) 00081 { 00082 confMux(mux); 00083 delay(5000); 00084 result = newMux(id, type, addr, port); 00085 } 00086 return result; 00087 } 00088 00089 int ESP8266::recvData(char *buf) 00090 { 00091 String data = ""; 00092 if (m_uart.available()>0) 00093 { 00094 00095 unsigned long start; 00096 start = millis(); 00097 char c0 = m_uart.readChr(); 00098 if (c0 == '+') 00099 { 00100 00101 while (millis()-start<5000) 00102 { 00103 if (m_uart.available()>0) 00104 { 00105 char c = m_uart.readChr(); 00106 data += c; 00107 } 00108 if (data.indexOf("\nOK")!=-1) 00109 { 00110 break; 00111 } 00112 } 00113 00114 int sLen = strlen(data.c_str()); 00115 int i,j; 00116 for (i = 0; i <= sLen; i++) 00117 { 00118 if (data[i] == ':') 00119 { 00120 break; 00121 } 00122 00123 } 00124 bool found = false; 00125 for (j = 4; j <= i; j++) 00126 { 00127 if (data[j] == ',') 00128 { 00129 found = true; 00130 break; 00131 } 00132 00133 } 00134 int iSize; 00135 if(found ==true) 00136 { 00137 String _id = data.substring(4, j); 00138 m_mux_id = _id.toInt(); 00139 String _size = data.substring(j+1, i); 00140 iSize = _size.toInt(); 00141 00142 String str = data.substring(i+1, i+1+iSize); 00143 strcpy(buf, str.c_str()); 00144 00145 00146 } 00147 else 00148 { 00149 String _size = data.substring(4, i); 00150 iSize = _size.toInt(); 00151 00152 00153 String str = data.substring(i+1, i+1+iSize); 00154 strcpy(buf, str.c_str()); 00155 00156 } 00157 return iSize; 00158 } 00159 } 00160 00161 return 0; 00162 } 00163 00164 String ESP8266::showMode() 00165 { 00166 String data; 00167 m_uart.println("AT+CWMODE?"); 00168 unsigned long start; 00169 start = millis(); 00170 while (millis()-start<2000) { 00171 if(m_uart.available()>0) 00172 { 00173 char a =m_uart.readChr(); 00174 data=data+a; 00175 } 00176 if (data.indexOf("OK")!=-1) 00177 { 00178 break; 00179 } 00180 } 00181 if(data.indexOf("1")!=-1) 00182 { 00183 return "Station"; 00184 }else if(data.indexOf("2")!=-1) 00185 { 00186 return "AP"; 00187 }else if(data.indexOf("3")!=-1) 00188 { 00189 return "AP+Station"; 00190 }else{ 00191 return "Invalid Mode!"; 00192 } 00193 } 00194 00195 bool ESP8266::confMode(ESP8266WorkMode mode) 00196 { 00197 String data; 00198 m_uart.flush(); 00199 m_uart.print("AT+CWMODE="); 00200 m_uart.println(String(mode)); 00201 unsigned long start; 00202 start = millis(); 00203 while (millis()-start<2000) { 00204 while(m_uart.available()>0) { 00205 char c = m_uart.readChr(); 00206 data += c; 00207 } 00208 if (data.indexOf("OK")!=-1 || data.indexOf("no change")!=-1) 00209 { 00210 return true; 00211 } else if (data.indexOf("ERROR")!=-1 || data.indexOf("busy")!=-1) 00212 { 00213 return false; 00214 } 00215 } 00216 return false; 00217 } 00218 00219 String ESP8266::showAP(void) 00220 { 00221 String data; 00222 m_uart.flush(); 00223 m_uart.print("AT+CWLAP\r\n"); 00224 delay(5000); 00225 00226 unsigned long start; 00227 start = millis(); 00228 while (millis()-start<8000) { 00229 if(m_uart.available()>0) 00230 { 00231 char a =m_uart.readChr(); 00232 data=data+a; 00233 } 00234 if (data.indexOf("OK")!=-1 || data.indexOf("ERROR")!=-1 ) 00235 { 00236 break; 00237 } 00238 } 00239 if(data.indexOf("ERROR")!=-1) 00240 { 00241 return "ERROR"; 00242 } 00243 else{ 00244 char head[4] = {0x0D,0x0A}; 00245 char tail[7] = {0x0D,0x0A,0x0D,0x0A}; 00246 data.replace("AT+CWLAP",""); 00247 data.replace("OK",""); 00248 data.replace("+CWLAP","ESP8266"); 00249 data.replace(tail,""); 00250 data.replace(head,""); 00251 00252 return data; 00253 } 00254 } 00255 00256 String ESP8266::showJAP(void) 00257 { 00258 bool ret = false; 00259 m_uart.flush(); 00260 m_uart.println("AT+CWJAP?"); 00261 00262 String data; 00263 unsigned long start; 00264 start = millis(); 00265 while (millis()-start < 3000) { 00266 while(m_uart.available() > 0) { 00267 char a = m_uart.readChr(); 00268 data += a; 00269 //printf("%c", a); 00270 } 00271 if (data.indexOf("OK") != -1) { 00272 ret = true; 00273 break; 00274 } else if (data.indexOf("ERROR") != -1) { 00275 ret = false; 00276 break; 00277 } 00278 } 00279 if (ret) { 00280 int index1 = data.indexOf(":\""); 00281 int index2 = data.indexOf("\"\r\n"); 00282 if (index1 != -1 && index2 != -1) { 00283 return data.substring(index1 + 2, index2); 00284 } else { 00285 return "not found"; 00286 } 00287 } else { 00288 return "null"; 00289 } 00290 } 00291 00292 bool ESP8266::confJAP(String ssid , String pwd) 00293 { 00294 bool ret = false; 00295 m_uart.flush(); 00296 m_uart.print("AT+CWJAP="); 00297 m_uart.print("\""); //"ssid" 00298 m_uart.print(ssid); 00299 m_uart.print("\""); 00300 00301 m_uart.print(","); 00302 00303 m_uart.print("\""); //"pwd" 00304 m_uart.print(pwd); 00305 m_uart.println("\""); 00306 00307 String data; 00308 unsigned long start; 00309 start = millis(); 00310 while (millis() - start < 10000) { 00311 while (m_uart.available() > 0) { 00312 char c = m_uart.readChr(); 00313 data += c; 00314 } 00315 if(data.indexOf("OK") != -1) { 00316 ret = true; 00317 break; 00318 } else if (data.indexOf("ERROR") != -1) { 00319 ret = false; 00320 break; 00321 } 00322 } 00323 00324 if (ret) { 00325 return true; 00326 } else { 00327 return false; 00328 } 00329 } 00330 00331 bool ESP8266::quitAP(void) 00332 { 00333 m_uart.println("AT+CWQAP"); 00334 unsigned long start; 00335 start = millis(); 00336 while (millis()-start<3000) { 00337 if(m_uart.find("OK")==true) 00338 { 00339 return true; 00340 00341 } 00342 } 00343 return false; 00344 00345 } 00346 00347 String ESP8266::showSAP() 00348 { 00349 m_uart.println("AT+CWSAP?"); 00350 String data; 00351 unsigned long start; 00352 start = millis(); 00353 while (millis()-start<3000) { 00354 if(m_uart.available()>0) 00355 { 00356 char a =m_uart.readChr(); 00357 data=data+a; 00358 } 00359 if (data.indexOf("OK")!=-1 || data.indexOf("ERROR")!=-1 ) 00360 { 00361 break; 00362 } 00363 } 00364 char head[4] = {0x0D,0x0A}; 00365 char tail[7] = {0x0D,0x0A,0x0D,0x0A}; 00366 data.replace("AT+CWSAP?",""); 00367 data.replace("+CWSAP","mySAP"); 00368 data.replace("OK",""); 00369 data.replace(tail,""); 00370 data.replace(head,""); 00371 00372 return data; 00373 } 00374 00375 bool ESP8266::confSAP(String ssid , String pwd , int chl , int ecn) 00376 { 00377 m_uart.print("AT+CWSAP="); 00378 m_uart.print("\""); //"ssid" 00379 m_uart.print(ssid); 00380 m_uart.print("\""); 00381 00382 m_uart.print(","); 00383 00384 m_uart.print("\""); //"pwd" 00385 m_uart.print(pwd); 00386 m_uart.print("\""); 00387 00388 m_uart.print(","); 00389 m_uart.print(String(chl)); 00390 00391 m_uart.print(","); 00392 m_uart.println(String(ecn)); 00393 unsigned long start; 00394 start = millis(); 00395 while (millis()-start<3000) { 00396 if(m_uart.find("OK")==true ) 00397 { 00398 return true; 00399 } 00400 } 00401 00402 return false; 00403 00404 } 00405 00406 00407 String ESP8266::showStatus(void) 00408 { 00409 m_uart.println("AT+CIPSTATUS"); 00410 String data; 00411 unsigned long start; 00412 start = millis(); 00413 while (millis()-start<3000) { 00414 if(m_uart.available()>0) 00415 { 00416 char a =m_uart.readChr(); 00417 data=data+a; 00418 } 00419 if (data.indexOf("OK")!=-1) 00420 { 00421 break; 00422 } 00423 } 00424 00425 char head[4] = {0x0D,0x0A}; 00426 char tail[7] = {0x0D,0x0A,0x0D,0x0A}; 00427 data.replace("AT+CIPSTATUS",""); 00428 data.replace("OK",""); 00429 data.replace(tail,""); 00430 data.replace(head,""); 00431 00432 return data; 00433 } 00434 00435 String ESP8266::showMux(void) 00436 { 00437 String data; 00438 m_uart.println("AT+CIPMUX?"); 00439 00440 unsigned long start; 00441 start = millis(); 00442 while (millis()-start<3000) { 00443 if(m_uart.available()>0) 00444 { 00445 char a =m_uart.readChr(); 00446 data=data+a; 00447 } 00448 if (data.indexOf("OK")!=-1) 00449 { 00450 break; 00451 } 00452 } 00453 char head[4] = {0x0D,0x0A}; 00454 char tail[7] = {0x0D,0x0A,0x0D,0x0A}; 00455 data.replace("AT+CIPMUX?",""); 00456 data.replace("+CIPMUX","showMux"); 00457 data.replace("OK",""); 00458 data.replace(tail,""); 00459 data.replace(head,""); 00460 00461 return data; 00462 } 00463 00464 bool ESP8266::confMux(ESP8266Mux mux) 00465 { 00466 m_uart.print("AT+CIPMUX="); 00467 m_uart.println(mux); 00468 unsigned long start; 00469 start = millis(); 00470 while (millis()-start<3000) { 00471 if(m_uart.find("OK")==true ) 00472 { 00473 return true; 00474 } 00475 } 00476 00477 return false; 00478 } 00479 00480 bool ESP8266::newMux(ESP8266CommType type, String addr, int port) 00481 00482 { 00483 String data; 00484 m_uart.flush(); 00485 m_uart.print("AT+CIPSTART="); 00486 if(ESP8266_COMM_TCP == type) { 00487 m_uart.print("\"TCP\""); 00488 } else if (ESP8266_COMM_UDP == type) { 00489 m_uart.print("\"UDP\""); 00490 } 00491 m_uart.print(","); 00492 m_uart.print("\""); 00493 m_uart.print(addr); 00494 m_uart.print("\""); 00495 m_uart.print(","); 00496 m_uart.println(String(port)); 00497 unsigned long start; 00498 start = millis(); 00499 while (millis()-start<10000) { 00500 if(m_uart.available()>0) 00501 { 00502 char a =m_uart.readChr(); 00503 data=data+a; 00504 } 00505 if (data.indexOf("OK")!=-1 || data.indexOf("ALREAY CONNECT")!=-1 || data.indexOf("ERROR")!=-1) 00506 { 00507 return true; 00508 } 00509 } 00510 return false; 00511 } 00512 00513 bool ESP8266::newMux( int id, ESP8266CommType type, String addr, int port) 00514 { 00515 m_uart.print("AT+CIPSTART="); 00516 m_uart.print("\""); 00517 m_uart.print(String(id)); 00518 m_uart.print("\""); 00519 if(ESP8266_COMM_TCP == type) { 00520 m_uart.print("\"TCP\""); 00521 } else if (ESP8266_COMM_UDP == type) { 00522 m_uart.print("\"UDP\""); 00523 } 00524 m_uart.print(","); 00525 m_uart.print("\""); 00526 m_uart.print(addr); 00527 m_uart.print("\""); 00528 m_uart.print(","); 00529 m_uart.println(String(port)); 00530 String data; 00531 unsigned long start; 00532 start = millis(); 00533 while (millis()-start<3000) { 00534 if(m_uart.available()>0) 00535 { 00536 char a =m_uart.readChr(); 00537 data=data+a; 00538 } 00539 if (data.indexOf("OK")!=-1 || data.indexOf("ALREAY CONNECT")!=-1 ) 00540 { 00541 return true; 00542 } 00543 } 00544 return false; 00545 00546 00547 } 00548 00549 bool ESP8266::send(String str) 00550 { 00551 m_uart.flush(); 00552 m_uart.print("AT+CIPSEND="); 00553 m_uart.println(str.length()); 00554 unsigned long start; 00555 start = millis(); 00556 bool found = false; 00557 while (millis()-start<5000) { 00558 if(m_uart.find(">")==true ) 00559 { 00560 found = true; 00561 break; 00562 } 00563 } 00564 if(found) 00565 m_uart.print(str); 00566 else 00567 { 00568 closeMux(); 00569 return false; 00570 } 00571 00572 00573 String data; 00574 start = millis(); 00575 while (millis()-start<5000) { 00576 if(m_uart.available()>0) 00577 { 00578 char a =m_uart.readChr(); 00579 data=data+a; 00580 } 00581 if (data.indexOf("SEND OK")!=-1) 00582 { 00583 return true; 00584 } 00585 } 00586 return false; 00587 } 00588 00589 bool ESP8266::send(int id, String str) 00590 { 00591 m_uart.print("AT+CIPSEND="); 00592 00593 m_uart.print(String(id)); 00594 m_uart.print(","); 00595 m_uart.println(str.length()); 00596 unsigned long start; 00597 start = millis(); 00598 bool found = false; 00599 while (millis()-start<5000) { 00600 if(m_uart.find(">")==true ) 00601 { 00602 found = true; 00603 break; 00604 } 00605 } 00606 if(found) 00607 m_uart.print(str); 00608 else 00609 { 00610 closeMux(id); 00611 return false; 00612 } 00613 00614 00615 String data; 00616 start = millis(); 00617 while (millis()-start<5000) { 00618 if(m_uart.available()>0) 00619 { 00620 char a =m_uart.readChr(); 00621 data=data+a; 00622 } 00623 if (data.indexOf("SEND OK")!=-1) 00624 { 00625 return true; 00626 } 00627 } 00628 return false; 00629 } 00630 00631 00632 void ESP8266::closeMux(void) 00633 { 00634 m_uart.println("AT+CIPCLOSE"); 00635 00636 String data; 00637 unsigned long start; 00638 start = millis(); 00639 while (millis()-start<3000) { 00640 if(m_uart.available()>0) 00641 { 00642 char a =m_uart.readChr(); 00643 data=data+a; 00644 } 00645 if (data.indexOf("Linked")!=-1 || data.indexOf("ERROR")!=-1 || data.indexOf("we must restart")!=-1) 00646 { 00647 break; 00648 } 00649 } 00650 } 00651 00652 void ESP8266::closeMux(int id) 00653 { 00654 m_uart.print("AT+CIPCLOSE="); 00655 m_uart.println(String(id)); 00656 String data; 00657 unsigned long start; 00658 start = millis(); 00659 while (millis()-start<3000) { 00660 if(m_uart.available()>0) 00661 { 00662 char a =m_uart.readChr(); 00663 data=data+a; 00664 } 00665 if (data.indexOf("OK")!=-1 || data.indexOf("Link is not")!=-1 || data.indexOf("Cant close")!=-1) 00666 { 00667 break; 00668 } 00669 } 00670 00671 } 00672 00673 String ESP8266::showIP(void) 00674 { 00675 bool ret = false; 00676 m_uart.flush(); 00677 m_uart.println("AT+CIFSR"); 00678 00679 String data; 00680 unsigned long start; 00681 start = millis(); 00682 while (millis()-start < 3000) { 00683 while(m_uart.available() > 0) { 00684 char a = m_uart.readChr(); 00685 data += a; 00686 } 00687 if (data.indexOf("OK") != -1) { 00688 ret = true; 00689 break; 00690 } else if (data.indexOf("ERROR") != -1) { 00691 ret = false; 00692 break; 00693 } 00694 } 00695 //printf("data = [%s]\r\n", data.c_str()); 00696 if (ret) { 00697 int index1 = data.indexOf("AT+CIFSR\r\r\n"); 00698 int index2 = data.indexOf("\r\n\r\nOK"); 00699 if (index1 != -1 && index2 != -1) { 00700 return data.substring(index1 + strlen("AT+CIFSR\r\r\n"), index2); 00701 } else { 00702 return "not found"; 00703 } 00704 } else { 00705 return "null"; 00706 } 00707 } 00708 00709 bool ESP8266::confServer(int mode, int port) 00710 { 00711 m_uart.print("AT+CIPSERVER="); 00712 m_uart.print(String(mode)); 00713 m_uart.print(","); 00714 m_uart.println(String(port)); 00715 00716 String data; 00717 unsigned long start; 00718 start = millis(); 00719 bool found = false; 00720 while (millis()-start<3000) { 00721 if(m_uart.available()>0) 00722 { 00723 char a =m_uart.readChr(); 00724 data=data+a; 00725 } 00726 if (data.indexOf("OK")!=-1 || data.indexOf("no charge")!=-1) 00727 { 00728 found = true; 00729 break; 00730 } 00731 } 00732 m_uart.flush(); 00733 return found; 00734 }
Generated on Tue Jul 12 2022 18:59:49 by
1.7.2