Dopasowany do naszego firmware'u

Dependencies:   ArduinoAPI

Fork of WeeESP8266 by ITEAD STUDIO

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ESP8266.cpp Source File

ESP8266.cpp

Go to the documentation of this file.
00001 /**
00002  * @file ESP8266.cpp
00003  * @brief The implementation of class ESP8266. 
00004  * @author Wu Pengfei<pengfei.wu@itead.cc> 
00005  * @date 2015.02
00006  * 
00007  * @par Copyright:
00008  * Copyright (c) 2015 ITEAD Intelligent Systems Co., Ltd. \n\n
00009  * This program is free software; you can redistribute it and/or
00010  * modify it under the terms of the GNU General Public License as
00011  * published by the Free Software Foundation; either version 2 of
00012  * the License, or (at your option) any later version. \n\n
00013  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00014  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00015  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00016  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00017  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00018  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00019  * THE SOFTWARE.
00020  */
00021 #include "ESP8266.h"
00022 #include "log.h"
00023 
00024 ESP8266::ESP8266(ArduinoSerial &uart): m_puart(&uart)
00025 {
00026     m_puart->begin(9600);
00027     m_puart->flush();
00028 }
00029 
00030 void ESP8266::clear_serial()
00031 {
00032     m_puart->flush();
00033     // 510 zer (długosc bufora)
00034     m_puart->println("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0");  
00035 }
00036 
00037 
00038 bool ESP8266::kick(void)
00039 {
00040     return eAT();
00041 }
00042 
00043 bool ESP8266::restart(void)
00044 {
00045     unsigned long start;
00046     if (eATRST()) {
00047         delay(2000);
00048         start = millis();
00049         while (millis() - start < 3000) {
00050             if (eAT()) {
00051                 delay(1500); /* Waiting for stable */
00052                 return true;
00053             }
00054             delay(100);
00055         }
00056     }
00057     return false;
00058 }
00059 
00060 String ESP8266::getVersion(void)
00061 {
00062     String version;
00063     eATGMR(version);
00064     return version;
00065 }
00066 
00067 bool ESP8266::setOprToStation(void)
00068 {
00069     uint8_t mode;
00070     if (!qATCWMODE(&mode)) {
00071         return false;
00072     }
00073     if (mode == 1) {
00074         return true;
00075     } else {
00076         if (sATCWMODE(1) && restart()) {
00077             return true;
00078         } else {
00079             return false;
00080         }
00081     }
00082 }
00083 
00084 bool ESP8266::setOprToSoftAP(void)
00085 {
00086     uint8_t mode;
00087     if (!qATCWMODE(&mode)) {
00088         return false;
00089     }
00090     if (mode == 2) {
00091         return true;
00092     } else {
00093         if (sATCWMODE(2) && restart()) {
00094             return true;
00095         } else {
00096             return false;
00097         }
00098     }
00099 }
00100 
00101 bool ESP8266::setOprToStationSoftAP(void)
00102 {
00103     uint8_t mode;
00104     if (!qATCWMODE(&mode)) {
00105         return false;
00106     }
00107     if (mode == 3) {
00108         return true;
00109     } else {
00110         if (sATCWMODE(3) && restart()) {
00111             return true;
00112         } else {
00113             return false;
00114         }
00115     }
00116 }
00117 
00118 String ESP8266::getAPList(void)
00119 {
00120     String list;
00121     eATCWLAP(list);
00122     return list;
00123 }
00124 
00125 bool ESP8266::joinAP(String ssid, String pwd)
00126 {
00127     return sATCWJAP(ssid, pwd);
00128 }
00129 
00130 bool ESP8266::leaveAP(void)
00131 {
00132     return eATCWQAP();
00133 }
00134 
00135 bool ESP8266::setSoftAPParam(String ssid, String pwd, uint8_t chl, uint8_t ecn)
00136 {
00137     return sATCWSAP(ssid, pwd, chl, ecn);
00138 }
00139 
00140 String ESP8266::getJoinedDeviceIP(void)
00141 {
00142     String list;
00143     eATCWLIF(list);
00144     return list;
00145 }
00146 
00147 int ESP8266::getIPStatus(void)
00148 {
00149     String komenda = "AT+CIPSTATUS";
00150     
00151     String  data;
00152     char a;
00153     unsigned long start;
00154     m_puart->flush();
00155     clear_serial();
00156     m_puart -> println(komenda);        
00157     start = millis();
00158     while (millis() - start < 1000) {
00159         while(m_puart ->available() > 0) {
00160             a = m_puart ->readChr();
00161             data +=a;
00162             }
00163         if (data.indexOf("OK") != -1) {
00164             break;
00165         }
00166         if (data.indexOf("ERROR") != -1 ) {
00167             return -1;  //jak zle to powtarzam; 
00168         } 
00169     }
00170     char num;
00171     num = data[21];
00172     return num-48;   
00173 //    String list;
00174 //    eATCIPSTATUS(list);
00175 //    return list;
00176 }
00177 
00178 String ESP8266::getLocalIP(void)
00179 {
00180     String list;
00181     eATCIFSR(list);
00182     return list;
00183 }
00184 
00185 bool ESP8266::enableMUX(void)
00186 {
00187     return sATCIPMUX(1);
00188 }
00189 
00190 bool ESP8266::disableMUX(void)
00191 {
00192     return sATCIPMUX(0);
00193 }
00194 
00195 bool ESP8266::createTCP(String addr, uint32_t port)
00196 {
00197     return sATCIPSTARTSingle("TCP", addr, port);
00198 }
00199 
00200 bool ESP8266::releaseTCP(void)
00201 {
00202     return eATCIPCLOSESingle();
00203 }
00204 
00205 bool ESP8266::registerUDP(String addr, uint32_t port)
00206 {
00207     return sATCIPSTARTSingle("UDP", addr, port);
00208 }
00209 
00210 bool ESP8266::unregisterUDP(void)
00211 {
00212     return eATCIPCLOSESingle();
00213 }
00214 
00215 bool ESP8266::createTCP(uint8_t mux_id, String addr, uint32_t port)
00216 {
00217     return sATCIPSTARTMultiple(mux_id, "TCP", addr, port);
00218 }
00219 
00220 bool ESP8266::releaseTCP(uint8_t mux_id)
00221 {
00222     return sATCIPCLOSEMulitple(mux_id);
00223 }
00224 
00225 bool ESP8266::registerUDP(uint8_t mux_id, String addr, uint32_t port)
00226 {
00227     return sATCIPSTARTMultiple(mux_id, "UDP", addr, port);
00228 }
00229 
00230 bool ESP8266::unregisterUDP(uint8_t mux_id)
00231 {
00232     return sATCIPCLOSEMulitple(mux_id);
00233 }
00234 
00235 bool ESP8266::setTCPServerTimeout(uint32_t timeout)
00236 {
00237     return sATCIPSTO(timeout);
00238 }
00239 
00240 bool ESP8266::startTCPServer(uint32_t port)
00241 {
00242     if (sATCIPSERVER(1, port)) {
00243         return true;
00244     }
00245     return false;
00246 }
00247 
00248 bool ESP8266::stopTCPServer(void)
00249 {
00250     sATCIPSERVER(0);
00251     restart();
00252     return false;
00253 }
00254 
00255 bool ESP8266::send(const uint8_t *buffer, uint32_t len)
00256 {
00257     return sATCIPSENDSingle(buffer, len);
00258 }
00259 
00260 bool ESP8266::send(uint8_t mux_id, const uint8_t *buffer, uint32_t len)
00261 {
00262     return sATCIPSENDMultiple(mux_id, buffer, len);
00263 }
00264 
00265 uint32_t ESP8266::recv(uint8_t *buffer, uint32_t buffer_size, uint32_t timeout)
00266 {
00267     return recvPkg(buffer, buffer_size, NULL, timeout, NULL);
00268 }
00269 
00270 uint32_t ESP8266::recv(uint8_t mux_id, uint8_t *buffer, uint32_t buffer_size, uint32_t timeout)
00271 {
00272     uint8_t id;
00273     uint32_t ret;
00274     ret = recvPkg(buffer, buffer_size, NULL, timeout, &id);
00275     if (ret > 0 && id == mux_id) {
00276         return ret;
00277     }
00278     return 0;
00279 }
00280 
00281 uint32_t ESP8266::recv(uint8_t *coming_mux_id, uint8_t *buffer, uint32_t buffer_size, uint32_t timeout)
00282 {
00283     return recvPkg(buffer, buffer_size, NULL, timeout, coming_mux_id);
00284 }
00285 
00286 /*----------------------------------------------------------------------------*/
00287 
00288 uint32_t ESP8266::recvPkg(uint8_t *buffer, uint32_t buffer_size, uint32_t *data_len, uint32_t timeout, uint8_t *coming_mux_id)
00289 {
00290     String data;
00291     char a;
00292     int32_t index_PIPDcomma = -1;
00293     int32_t index_colon = -1; /* : */
00294     int32_t index_comma = -1; /* , */
00295     int32_t len = -1;
00296     int8_t id = -1;
00297     bool has_data = false;
00298     logDebug("start recv pkg");
00299     
00300     unsigned long start = millis();
00301     while (millis() - start < timeout) {
00302         while(m_puart->available() > 0) {
00303             a = m_puart->readChr();
00304             data += a;
00305         }
00306         
00307         index_PIPDcomma = data.indexOf("+IPD,");
00308         if (index_PIPDcomma != -1) {
00309             logDebug("index_PIPDcomma found = %d", index_PIPDcomma);
00310             index_colon = data.indexOf(':', index_PIPDcomma + 5);
00311             if (index_colon != -1) {
00312                 logDebug("data1 = %s\r\n", data.c_str());
00313                 logDebug("index_colon found = %d", index_colon);
00314                 
00315                 index_comma = data.indexOf(',', index_PIPDcomma + 5);
00316                 logDebug("index_comma found = %d", index_comma);
00317                 
00318                 if (index_comma != -1 && index_comma < index_colon) { /* +IPD,id,len:data */
00319                     logDebug("id = %d", id);
00320                     id = data.substring(index_PIPDcomma + 5, index_comma).toInt();
00321                     logDebug("id = %d", id);
00322                     if (id < 0 || id > 4) {
00323                         return 0;
00324                     }
00325                     logDebug("len = %d", len);
00326                     len = data.substring(index_comma + 1, index_colon).toInt();
00327                     logDebug("len = %d", len);
00328                     if (len <= 0) {
00329                         return 0;
00330                     }
00331                     logDebug("has id");
00332                 } else { /* +IPD,len:data */
00333                     len = data.substring(index_PIPDcomma + 5, index_colon).toInt();
00334                     logDebug("len = %d", len);
00335                     if (len <= 0) {
00336                         return 0;
00337                     }
00338                     logDebug("no id");
00339                 }
00340                 has_data = true;
00341                 logDebug("has_data true");
00342                 break;
00343             }
00344         }
00345     }
00346     //logDebug("has_data = %u\r\n", has_data);
00347     //logDebug("data2 = %s\r\n", data.c_str());
00348     
00349     if (has_data) {
00350         start = millis();
00351         while (millis() - start < 3000) {
00352             while(m_puart->available() > 0) {
00353                 a = m_puart->readChr();
00354                 data += a;
00355             }
00356             //logDebug("data3 = %s\r\n", data.c_str());
00357             if (data.length() >= index_colon + 1 + len) {
00358                 if (data_len) {
00359                     *data_len = len;    
00360                 }
00361                 if (index_comma != -1 && coming_mux_id) {
00362                     *coming_mux_id = id;
00363                 }
00364                 //logDebug("len = %d", len);
00365                 //logDebug("buffer_size = %d", buffer_size);
00366                 uint32_t ret = len > buffer_size ? buffer_size : len;
00367                 
00368                 memcpy(buffer, 
00369                     data.substring(index_colon + 1, index_colon + 1 + len).c_str(), 
00370                     ret);
00371                 logDebug("ret = %u\r\n", ret);
00372                 return ret;
00373             }
00374         }
00375     }
00376     logDebug("end recv pkg");
00377     return 0;
00378 }
00379 
00380 String ESP8266::recvString(String target, uint32_t timeout)
00381 {
00382     String data;
00383     char a;
00384     unsigned long start = millis();
00385     while (millis() - start < timeout) {
00386         while(m_puart->available() > 0) {
00387             a = m_puart->readChr();
00388             data += a;
00389         }
00390         if (data.indexOf(target) != -1) {
00391             break;
00392         }   
00393     }
00394     return data;
00395 }
00396 
00397 String ESP8266::recvString(String target1, String target2, uint32_t timeout)
00398 {
00399     String data;
00400     char a;
00401     unsigned long start = millis();
00402     while (millis() - start < timeout) {
00403         while(m_puart->available() > 0) {
00404             a = m_puart->readChr();
00405             data += a;
00406         }
00407         if (data.indexOf(target1) != -1) {
00408             break;
00409         } else if (data.indexOf(target2) != -1) {
00410             break;
00411         }
00412     }
00413     return data;
00414 }
00415 
00416 String ESP8266::recvString(String target1, String target2, String target3, uint32_t timeout)
00417 {
00418     String data;
00419     char a;
00420     unsigned long start = millis();
00421     while (millis() - start < timeout) {
00422         while(m_puart->available() > 0) {
00423             a = m_puart->readChr();
00424             data += a;
00425         }
00426         if (data.indexOf(target1) != -1) {
00427             break;
00428         } else if (data.indexOf(target2) != -1) {
00429             break;
00430         } else if (data.indexOf(target3) != -1) {
00431             break;
00432         }
00433     }
00434     return data;
00435 }
00436 
00437 bool ESP8266::recvFind(String target, uint32_t timeout)
00438 {
00439     String data_tmp;
00440     data_tmp = recvString(target, timeout);
00441     if (data_tmp.indexOf(target) != -1) {
00442         return true;
00443     }
00444     return false;
00445 }
00446 
00447 bool ESP8266::recvFindAndFilter(String target, String begin, String end, String &data, uint32_t timeout)
00448 {
00449     String data_tmp;
00450     data_tmp = recvString(target, timeout);
00451     if (data_tmp.indexOf(target) != -1) {
00452         int32_t index1 = data_tmp.indexOf(begin);
00453         int32_t index2 = data_tmp.indexOf(end);
00454         if (index1 != -1 && index2 != -1) {
00455             index1 += begin.length();
00456             data = data_tmp.substring(index1, index2);
00457             return true;
00458         }
00459     }
00460     data = "";
00461     return false;
00462 }
00463 
00464 bool ESP8266::eAT(void)
00465 {
00466     m_puart->flush();
00467     m_puart->println("AT");
00468     return recvFind("OK");
00469 }
00470 
00471 bool ESP8266::eATRST(void) 
00472 {
00473     m_puart->flush();
00474     m_puart->println("AT+RST");
00475     return recvFind("OK");
00476 }
00477 
00478 bool ESP8266::eATGMR(String &version)
00479 {
00480     m_puart->flush();
00481     m_puart->println("AT+GMR");
00482     return recvFindAndFilter("OK", "\r\r\n", "\r\n\r\nOK", version); 
00483 }
00484 
00485 bool ESP8266::qATCWMODE(uint8_t *mode) 
00486 {
00487     String str_mode;
00488     bool ret;
00489     if (!mode) {
00490         return false;
00491     }
00492     m_puart->flush();
00493     m_puart->println("AT+CWMODE?");
00494     ret = recvFindAndFilter("OK", "+CWMODE:", "\r\n\r\nOK", str_mode); 
00495     if (ret) {
00496         *mode = (uint8_t)str_mode.toInt();
00497         return true;
00498     } else {
00499         return false;
00500     }
00501 }
00502 
00503 bool ESP8266::sATCWMODE(uint8_t mode)
00504 {
00505     String data;
00506     m_puart->flush();
00507     m_puart->print("AT+CWMODE=");
00508     m_puart->println(mode);
00509     
00510     data = recvString("OK", "no change");
00511     if (data.indexOf("OK") != -1 || data.indexOf("no change") != -1) {
00512         return true;
00513     }
00514     return false;
00515 }
00516 
00517 bool ESP8266::sATCWJAP(String ssid, String pwd)
00518 {
00519     String data;
00520     String komunikat = "";
00521     komunikat += "AT+CWJAP=\"";
00522     komunikat += ssid;
00523     komunikat += "\",\"";
00524     komunikat += pwd;
00525     komunikat += "\"";
00526     komunikat+="\r\n";
00527 //    
00528 //    for(int i = 0; i<=komunikat.length(); i++){
00529 //       m_puart->printf("%c",komunikat[i]);
00530 //       m_puart->flush();
00531 //    }     
00532 
00533 //    m_puart->print("AT+CWJAP=\"");
00534 //    m_puart->print(ssid);
00535 //    m_puart->print("\",\"");
00536 //    m_puart->print(pwd);
00537 
00538     m_puart->flush();
00539     clear_serial();
00540     m_puart->println(komunikat);
00541     
00542     data = recvString("OK", "FAIL", 20000);
00543     if (data.indexOf("OK") != -1) {
00544         return true;
00545     }
00546     return false;
00547 }
00548 
00549 bool ESP8266::eATCWLAP(String &list)
00550 {
00551     String data;
00552     m_puart->flush();
00553     m_puart->println("AT+CWLAP");
00554     return recvFindAndFilter("OK", "\r\r\n", "\r\n\r\nOK", list, 10000);
00555 }
00556 
00557 bool ESP8266::eATCWQAP(void)
00558 {
00559     String data;
00560     m_puart->flush();
00561     m_puart->println("AT+CWQAP");
00562     return recvFind("OK");
00563 }
00564 
00565 bool ESP8266::sATCWSAP(String ssid, String pwd, uint8_t chl, uint8_t ecn)
00566 {
00567     String data;
00568     m_puart->flush();
00569     m_puart->print("AT+CWSAP=\"");
00570     m_puart->print(ssid);
00571     m_puart->print("\",\"");
00572     m_puart->print(pwd);
00573     m_puart->print("\",");
00574     m_puart->print(chl);
00575     m_puart->print(",");
00576     m_puart->println(ecn);
00577     
00578     data = recvString("OK", "ERROR", 5000);
00579     if (data.indexOf("OK") != -1) {
00580         return true;
00581     }
00582     return false;
00583 }
00584 
00585 bool ESP8266::eATCWLIF(String &list)
00586 {
00587     String data;
00588     m_puart->flush();
00589     m_puart->println("AT+CWLIF");
00590     return recvFindAndFilter("OK", "\r\r\n", "\r\n\r\nOK", list);
00591 }
00592 bool ESP8266::eATCIPSTATUS(String &list)
00593 {
00594     String data;
00595     delay(100);
00596     m_puart->flush();
00597     m_puart->println("AT+CIPSTATUS");
00598     return recvFindAndFilter("OK", "\r\r\n", "\r\n\r\nOK", list);
00599 }
00600 bool ESP8266::sATCIPSTARTSingle(String type, String addr, uint32_t port)
00601 {
00602     String data;
00603     m_puart->flush();
00604     m_puart->print("AT+CIPSTART=\"");
00605     m_puart->print(type);
00606     m_puart->print("\",\"");
00607     m_puart->print(addr);
00608     m_puart->print("\",");
00609     m_puart->println(port);
00610     
00611     data = recvString("OK", "ERROR", "ALREADY CONNECT", 10000);
00612     if (data.indexOf("OK") != -1 || data.indexOf("ALREADY CONNECT") != -1) {
00613         return true;
00614     }
00615     return false;
00616 }
00617 bool ESP8266::sATCIPSTARTMultiple(uint8_t mux_id, String type, String addr, uint32_t port)
00618 {
00619     String data;
00620     m_puart->flush();
00621     String komunikat = "";
00622     komunikat += "AT+CIPSTART=";
00623     komunikat += mux_id;
00624     komunikat += ",\"";
00625     komunikat += type;
00626     komunikat += "\",\"";
00627     komunikat += addr;
00628     komunikat += "\",";
00629     komunikat += port;
00630     komunikat+="\r\n";
00631 
00632     m_puart->flush();
00633     clear_serial();
00634     m_puart->println(komunikat);
00635 
00636  
00637     data = recvString("OK", "ERROR", "CONNECT", 10000);
00638     if ((data.indexOf("OK") != -1) ||(data.indexOf("CONNECT")!= -1)|| (data.indexOf("ALREADY CONNECT") != -1)) {
00639         return true;
00640     }
00641     return false;
00642 }
00643 bool ESP8266::sATCIPSENDSingle(const uint8_t *buffer, uint32_t len)
00644 {
00645     m_puart->flush();
00646     m_puart->print("AT+CIPSEND=");
00647     m_puart->println(len);
00648     if (recvFind(">", 5000)) {
00649         m_puart->flush();
00650         for (uint32_t i = 0; i < len; i++) {
00651             m_puart->write(buffer[i]);
00652         }
00653         return recvFind("SEND OK", 10000);
00654     }
00655     return false;
00656 }
00657 bool ESP8266::sATCIPSENDMultiple(uint8_t mux_id, const uint8_t *buffer, uint32_t len)
00658 {
00659     m_puart->flush();
00660     m_puart->print("AT+CIPSEND=");
00661     m_puart->print(mux_id);
00662     m_puart->print(",");
00663     m_puart->println(len);
00664     if (recvFind(">", 5000)) {
00665         m_puart->flush();
00666         for (uint32_t i = 0; i < len; i++) {
00667             m_puart->write(buffer[i]);
00668         }
00669         return recvFind("SEND OK", 10000);
00670     }
00671     return false;
00672 }
00673 bool ESP8266::sATCIPCLOSEMulitple(uint8_t mux_id)
00674 {
00675     String data;
00676     m_puart->flush();
00677     m_puart->print("AT+CIPCLOSE=");
00678     m_puart->println(mux_id);
00679     
00680     data = recvString("OK", "Link is not", 5000);
00681     if (data.indexOf("OK") != -1 || data.indexOf("Link is not") != -1) {
00682         return true;
00683     }
00684     return false;
00685 }
00686 bool ESP8266::eATCIPCLOSESingle(void)
00687 {
00688     m_puart->flush();
00689     m_puart->println("AT+CIPCLOSE");
00690     return recvFind("OK", 5000);
00691 }
00692 bool ESP8266::eATCIFSR(String &list)
00693 {
00694     m_puart->flush();
00695     m_puart->println("AT+CIFSR");
00696     return recvFindAndFilter("OK", "\r\r\n", "\r\n\r\nOK", list);
00697 }
00698 bool ESP8266::sATCIPMUX(uint8_t mode)
00699 {
00700     String data;
00701     m_puart->flush();
00702     m_puart->print("AT+CIPMUX=");
00703     m_puart->println(mode);
00704     
00705     data = recvString("OK", "Link is builded");
00706     if (data.indexOf("OK") != -1) {
00707         return true;
00708     }
00709     return false;
00710 }
00711 bool ESP8266::sATCIPSERVER(uint8_t mode, uint32_t port)
00712 {
00713     String data;
00714     if (mode) {
00715         m_puart->flush();
00716         m_puart->print("AT+CIPSERVER=1,");
00717         m_puart->println(port);
00718         
00719         data = recvString("OK", "no change",1000);
00720         if (data.indexOf("OK") != -1 || data.indexOf("no change") != -1) {
00721             return true;
00722         }
00723         return false;
00724     } else {
00725         m_puart->flush();
00726         m_puart->println("AT+CIPSERVER=0");
00727         return recvFind("\r\r\n");
00728     }
00729 }
00730 bool ESP8266::sATCIPSTO(uint32_t timeout)
00731 {
00732     m_puart->flush();
00733     m_puart->print("AT+CIPSTO=");
00734     m_puart->println(timeout);
00735     return recvFind("OK");
00736 }