@@ -40,6 +40,7 @@ const char AT_CIPSTATUS[] PROGMEM = "AT+CIPSTATUS";
4040const char CIPSTATUS[] PROGMEM = " +CIPSTATUS" ;
4141const char CIPSTA[] PROGMEM = " +CIPSTA" ;
4242const char CIPAP[] PROGMEM = " +CIPAP" ;
43+ const char CIPETH[] PROGMEM = " +CIPETH" ;
4344const char QOUT_COMMA_QOUT[] PROGMEM = " \" ,\" " ;
4445const char PROCESSED[] PROGMEM = " ...processed" ;
4546const char IGNORED[] PROGMEM = " ...ignored" ;
@@ -169,7 +170,7 @@ int EspAtDrvClass::staStatus() {
169170 LOG_INFO_PRINT_PREFIX ();
170171 LOG_INFO_PRINTLN (F (" wifi status" ));
171172
172- if (wifiModeDef == 0 ) { // reset() was not executed successful
173+ if (wifiModeDef == - 1 ) { // reset() was not executed successful
173174 LOG_ERROR_PRINT_PREFIX ();
174175 LOG_ERROR_PRINTLN (F (" AT firmware was not initialized" ));
175176 lastErrorCode = EspAtDrvError::NOT_INITIALIZED;
@@ -183,6 +184,12 @@ int EspAtDrvClass::staStatus() {
183184 return readOK () ? status : -1 ;
184185}
185186
187+ int EspAtDrvClass::ethStatus () {
188+ maintain ();
189+
190+ return ethConnected;
191+ }
192+
186193uint8_t EspAtDrvClass::listAP (WiFiApData apData[], uint8_t size) {
187194 maintain ();
188195
@@ -256,16 +263,13 @@ bool EspAtDrvClass::staStaticIp(const IPAddress& ip, const IPAddress& gw, const
256263 return sendCommand ();
257264}
258265
259- bool EspAtDrvClass::staDNS (const IPAddress& dns1, const IPAddress& dns2) {
266+ bool EspAtDrvClass::setDNS (const IPAddress& dns1, const IPAddress& dns2) {
260267 maintain ();
261268
262269 LOG_INFO_PRINT_PREFIX ();
263270 LOG_INFO_PRINT (F (" set static DNS " ));
264271 LOG_INFO_PRINTLN (persistent ? F (" persistent" ) : F (" current" ) );
265272
266- uint8_t mode = wifiMode | WIFI_MODE_STA; // turn on STA, leave SoftAP as it is
267- if (!setWifiMode (mode, false ))
268- return false ; // can't set dns without sta mode
269273#ifdef WIFIESPAT1 // AT+CIPDNS doesn't work in AT 1
270274 if (persistent) {
271275 cmd->print (F (" AT+CIPDNS_DEF=" ));
@@ -329,11 +333,11 @@ bool EspAtDrvClass::staIpQuery(IPAddress& ip, IPAddress& gwip, IPAddress& mask)
329333 return readOK ();
330334}
331335
332- bool EspAtDrvClass::staDnsQuery (IPAddress& dns1, IPAddress& dns2) {
336+ bool EspAtDrvClass::dnsQuery (IPAddress& dns1, IPAddress& dns2) {
333337 maintain ();
334338
335339 LOG_INFO_PRINT_PREFIX ();
336- LOG_INFO_PRINTLN (F (" STA DNS query" ));
340+ LOG_INFO_PRINTLN (F (" DNS query" ));
337341
338342#ifdef WIFIESPAT1 // AT+CIPDNS? has different output in AT 2
339343 cmd->print (F (" AT+CIPDNS_CUR?" ));
@@ -456,12 +460,13 @@ bool EspAtDrvClass::quitAP(bool save) {
456460 LOG_INFO_PRINT (F (" quit AP " ));
457461 LOG_INFO_PRINTLN ((persistent || save) ? F (" persistent" ) : F (" current" ) );
458462
459- if (wifiMode == WIFI_MODE_SAP ) { // STA is off
463+ if (!( wifiMode & WIFI_MODE_STA) ) { // STA is off
460464 LOG_WARN_PRINT_PREFIX ();
461465 LOG_WARN_PRINTLN (F (" STA is off" ));
462466 return false ;
463467 }
464468#ifdef WIFIESPAT1
469+ // AT 1 AT+CWDHCP= parameters are strange. first parameter is 0, 1, 2. second is 0/1
465470 if (persistent || save) {
466471 simpleCommand (PSTR (" AT+CWAUTOCONN=0" )); // don't reconnect on reset
467472 simpleCommand (PSTR (" AT+CIPDNS_DEF=0" )); // clear static DNS servers
@@ -471,13 +476,14 @@ bool EspAtDrvClass::quitAP(bool save) {
471476 simpleCommand (PSTR (" AT+CWDHCP_CUR=1,1" )); // enable DHCP back in case static IP disabled it
472477 }
473478#else
479+ // AT 2 AT+CWDHCP= first parameter is 0/1 and second parameter are bits for net. interfaces
474480 if (persistent != save && !sysStoreInternal (save))
475481 return false ;
476482 if (persistent || save) {
477483 simpleCommand (PSTR (" AT+CWAUTOCONN=0" )); // don't reconnect on reset. always stored
478484 }
479485 simpleCommand (PSTR (" AT+CIPDNS=0" )); // clear static DNS servers
480- simpleCommand (PSTR (" AT+CWDHCP=1,3 " )); // enable DHCP back in case static IP disabled it
486+ simpleCommand (PSTR (" AT+CWDHCP=1,1 " )); // enable STA DHCP back in case static IP disabled it
481487 if (persistent != save && !sysStoreInternal (persistent)) {
482488 persistent = save;
483489 }
@@ -505,7 +511,7 @@ bool EspAtDrvClass::apQuery(char* ssid, uint8_t* bssid, uint8_t& channel, int32_
505511 ssid[0 ] = 0 ;
506512 }
507513
508- if (wifiMode == WIFI_MODE_SAP ) { // STA is off
514+ if (!( wifiMode & WIFI_MODE_STA) ) { // STA is off
509515 LOG_ERROR_PRINT_PREFIX ();
510516 LOG_ERROR_PRINTLN (F (" STA is off" ));
511517 return false ;
@@ -663,7 +669,7 @@ bool EspAtDrvClass::softApQuery(char* ssid, char* passphrase, uint8_t& channel,
663669 LOG_INFO_PRINT_PREFIX ();
664670 LOG_INFO_PRINTLN (F (" SoftAP query" ));
665671
666- if (wifiMode == WIFI_MODE_STA ) { // SoftAP is off
672+ if (!( wifiMode & WIFI_MODE_SAP) ) { // SoftAP is off
667673 LOG_ERROR_PRINT_PREFIX ();
668674 LOG_ERROR_PRINTLN (F (" SoftAP is off" ));
669675 return false ;
@@ -694,6 +700,138 @@ bool EspAtDrvClass::softApQuery(char* ssid, char* passphrase, uint8_t& channel,
694700 return readOK ();
695701}
696702
703+ bool EspAtDrvClass::ethSetMac (uint8_t * mac) {
704+ maintain ();
705+
706+ LOG_INFO_PRINT_PREFIX ();
707+ LOG_INFO_PRINT (F (" set ETH MAC " ));
708+ // LOG_INFO_PRINT(ip);
709+ LOG_INFO_PRINTLN (persistent ? F (" persistent" ) : F (" current" ) );
710+
711+ #ifdef WIFIESPAT1
712+ if (persistent) {
713+ #endif
714+ cmd->print (F (" AT+CIPETHMAC=\" " ));
715+ #ifdef WIFIESPAT1
716+ } else {
717+ cmd->print (F (" AT+CIPETHMAC_CUR=\" " ));
718+ }
719+ #endif
720+ printMAC (cmd, mac);
721+ cmd->print (' "' );
722+ return sendCommand ();
723+ }
724+
725+ bool EspAtDrvClass::ethStaticIp (const IPAddress& ip, const IPAddress& gw, const IPAddress& nm) {
726+ maintain ();
727+
728+ LOG_INFO_PRINT_PREFIX ();
729+ LOG_INFO_PRINT (F (" set ETH static IP " ));
730+ LOG_INFO_PRINT (ip);
731+ LOG_INFO_PRINTLN (persistent ? F (" persistent" ) : F (" current" ) );
732+
733+ #ifdef WIFIESPAT1
734+ if (persistent) {
735+ #endif
736+ cmd->print (F (" AT+CIPETH=\" " ));
737+ #ifdef WIFIESPAT1
738+ } else {
739+ cmd->print (F (" AT+CIPETH_CUR=\" " ));
740+ }
741+ #endif
742+ ip.printTo (*cmd);
743+ if (gw[0 ]) {
744+ cmd->print ((FSH_P) QOUT_COMMA_QOUT);
745+ gw.printTo (*cmd);
746+ if (nm[0 ]) {
747+ cmd->print ((FSH_P) QOUT_COMMA_QOUT);
748+ nm.printTo (*cmd);
749+ }
750+ }
751+ cmd->print (' "' );
752+ return sendCommand ();
753+ }
754+
755+ bool EspAtDrvClass::ethEnableDHCP () {
756+ LOG_INFO_PRINT_PREFIX ();
757+ LOG_INFO_PRINT (F (" enable Eth DHCP " ));
758+ LOG_INFO_PRINTLN (persistent ? F (" persistent" ) : F (" current" ) );
759+ #ifdef WIFIESPAT1
760+ if (persistent) {
761+ return simpleCommand (PSTR (" AT+CWDHCP=3,1" ));
762+ }
763+ return simpleCommand (PSTR (" AT+CWDHCP_CUR=3,1" ));
764+ #else
765+ return simpleCommand (PSTR (" AT+CWDHCP=1,4" ));
766+ #endif
767+ }
768+
769+ bool EspAtDrvClass::ethMacQuery (uint8_t * mac) {
770+ maintain ();
771+
772+ LOG_INFO_PRINT_PREFIX ();
773+ LOG_INFO_PRINTLN (F (" ETH MAC query " ));
774+
775+ cmd->print (F (" AT+CIPETHMAC?" ));
776+ if (!sendCommand (PSTR (" +CIPETHMAC" )))
777+ return false ;
778+ const char * delims = " :\" " ;
779+ char * tok = strtok (buffer, delims); // +CIPETHMAC:"
780+ for (int i = 0 ; i < 6 ; i++) {
781+ tok = strtok (NULL , delims); // <mac>[i]
782+ mac[i] = strtol (tok, NULL , 16 );
783+ }
784+ return readOK ();
785+ }
786+
787+ bool EspAtDrvClass::ethIpQuery (IPAddress& ip, IPAddress& gwip, IPAddress& mask) {
788+ maintain ();
789+
790+ LOG_INFO_PRINT_PREFIX ();
791+ LOG_INFO_PRINTLN (F (" ETH IP query" ));
792+
793+ cmd->print (F (" AT+CIPETH?" ));
794+ if (!sendCommand (CIPETH))
795+ return false ;
796+ buffer[strlen (buffer) - 1 ] = 0 ; // delete last char '\"'
797+ ip.fromString (buffer + strlen (" +CIPETH:ip:\" " ));
798+ if (!readRX (CIPETH))
799+ return false ;
800+ buffer[strlen (buffer) - 1 ] = 0 ;
801+ gwip.fromString (buffer + strlen (" +CIPETH:gateway:\" " ));
802+ if (!readRX (CIPETH))
803+ return false ;
804+ buffer[strlen (buffer) - 1 ] = 0 ;
805+ mask.fromString (buffer + strlen (" +CIPETH:netmask:\" " ));
806+ return readOK ();
807+ }
808+
809+ bool EspAtDrvClass::setEthHostname (const char * hostname) {
810+ maintain ();
811+
812+ LOG_INFO_PRINT_PREFIX ();
813+ LOG_INFO_PRINT (F (" set eth hostname " ));
814+ LOG_INFO_PRINTLN (hostname);
815+
816+ cmd->print (F (" AT+CEHOSTNAME=\" " ));
817+ cmd->print (hostname);
818+ cmd->print (' "' );
819+ return sendCommand ();
820+ }
821+
822+ bool EspAtDrvClass::ethHostnameQuery (char * hostname) {
823+ maintain ();
824+
825+ LOG_INFO_PRINT_PREFIX ();
826+ LOG_INFO_PRINTLN (F (" eth hostname query" ));
827+
828+ cmd->print (F (" AT+CEHOSTNAME?" ));
829+ if (!sendCommand (PSTR (" +CEHOSTNAME" )))
830+ return false ;
831+ strcpy (hostname, buffer + strlen (" +CEHOSTNAME:" ));
832+ return readOK ();
833+ }
834+
697835bool EspAtDrvClass::serverBegin (uint16_t port, uint8_t maxConnCount, uint16_t serverTimeout, bool ssl, bool ca) {
698836 maintain ();
699837
@@ -1288,7 +1426,7 @@ bool EspAtDrvClass::hostnameQuery(char* hostname) {
12881426 return readOK ();
12891427}
12901428
1291- bool EspAtDrvClass::dhcpStateQuery (bool & staDHCP, bool & softApDHCP) {
1429+ bool EspAtDrvClass::dhcpStateQuery (bool & staDHCP, bool & softApDHCP, bool & ethDHCP ) {
12921430 maintain ();
12931431
12941432 LOG_INFO_PRINT_PREFIX ();
@@ -1304,7 +1442,8 @@ bool EspAtDrvClass::dhcpStateQuery(bool& staDHCP, bool& softApDHCP) {
13041442#else
13051443 softApDHCP = state & 0b10 ;
13061444 staDHCP = state & 0b01 ;
1307- #endif
1445+ #endif
1446+ ethDHCP = state & 0b100 ;
13081447 return readOK ();
13091448}
13101449
@@ -1404,6 +1543,11 @@ bool EspAtDrvClass::sleepMode(EspAtSleepMode mode) {
14041543 return sendCommand ();
14051544}
14061545
1546+ bool EspAtDrvClass::wifiOff (bool save) {
1547+ maintain ();
1548+ return setWifiMode (0 , save);
1549+ }
1550+
14071551bool EspAtDrvClass::deepSleep () {
14081552 maintain ();
14091553
@@ -1482,7 +1626,7 @@ bool EspAtDrvClass::readRX(PGM_P expected, bool bufferData, bool listItem) {
14821626 } else {
14831627 l += serial->readBytes (buffer + l, 1 ); // read second byte with stream's timeout
14841628 if (l < 2 )
1485- continue ; // We haven't read requested 2 bytes, something went wrong
1629+ continue ; // We haven't read requested 2 bytes, something went wrong
14861630 timeout = 0 ; // AT firmware responded
14871631 if (buffer[0 ] == ' \r ' && buffer[1 ] == ' \n ' ) // empty line. skip it
14881632 continue ;
@@ -1600,6 +1744,9 @@ bool EspAtDrvClass::readRX(PGM_P expected, bool bufferData, bool listItem) {
16001744 } else if (listItem && !strcmp_P (buffer, OK)) { // OK ends the listing of unknown items count
16011745 LOG_DEBUG_PRINTLN (F (" ...end of list" ));
16021746 return false ;
1747+ } else if (!strncmp_P (buffer, PSTR (" +ETH" ), strlen (" +ETH" ))) {
1748+ ethConnected = (buffer[strlen (" +ETH_" )] != ' D' ); // +ETH_DISCONNECTED
1749+ LOG_DEBUG_PRINTLN ((FSH_P) PROCESSED);
16031750 } else {
16041751 ignoredCount++;
16051752 if (ignoredCount > 70 ) { // reset() has many ignored lines
@@ -1634,17 +1781,13 @@ bool EspAtDrvClass::simpleCommand(PGM_P command) {
16341781
16351782bool EspAtDrvClass::setWifiMode (uint8_t mode, bool save) {
16361783
1637- if (wifiModeDef == 0 ) { // reset() was not executed successful
1784+ if (wifiModeDef == - 1 ) { // reset() was not executed successful
16381785 LOG_ERROR_PRINT_PREFIX ();
16391786 LOG_ERROR_PRINTLN (F (" AT firmware was not initialized" ));
16401787 lastErrorCode = EspAtDrvError::NOT_INITIALIZED;
16411788 return false ;
16421789 }
16431790
1644- if (mode == 0 ) {
1645- mode = WIFI_MODE_STA;
1646- }
1647-
16481791 if (mode == wifiMode && (!save || mode == wifiModeDef)) // no change
16491792 return true ;
16501793
@@ -1763,4 +1906,16 @@ bool EspAtDrvClass::checkLinks() {
17631906}
17641907#endif
17651908
1909+ void EspAtDrvClass::printMAC (Print* out, uint8_t * mac) {
1910+ for (int i = 0 ; i < 6 ; i++) {
1911+ if (i > 0 ) {
1912+ out->print (" :" );
1913+ }
1914+ if (mac[i] < 16 ) {
1915+ out->print (" 0" );
1916+ }
1917+ out->print (mac[i], HEX);
1918+ }
1919+ }
1920+
17661921EspAtDrvClass EspAtDrv;
0 commit comments