Files

680 lines
21 KiB
C++

/**
* @file ESP8266.h
* @brief The definition of class ESP8266.
* @author Wu Pengfei<pengfei.wu@itead.cc>
* @date 2015.02
*
* @par Copyright:
* Copyright (c) 2015 ITEAD Intelligent Systems Co., Ltd. \n\n
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version. \n\n
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef __ESP8266_H__
#define __ESP8266_H__
#include "Arduino.h"
#define VERSION_18 0X18
#define VERSION_22 0X22
#define DEFAULT_PATTERN 3
/**
* You can modify the macro to choose a different version
*/
#define USER_SEL_VERSION VERSION_22
/**
* Provide an easy-to-use way to manipulate ESP8266.
*/
class ESP8266 {
public:
typedef void (*onData)(uint8_t mux_id, uint32_t len, void* ptr);
/*
* Constuctor.
*
* @param uart - an ponter of Serial object.
* @warning parameter baud depends on the AT firmware. 9600 is an common value.
*/
ESP8266(Stream* uart = &Serial);
Stream* getUart() { return m_puart; }
void setOnData(onData cbk, void* ptr) {
m_onData = cbk;
m_onDataPtr = ptr;
}
void run();
/**
* Verify ESP8266 whether live or not.
*
* Actually, this method will send command "AT" to ESP8266 and waiting for "OK".
*
* @retval true - alive.
* @retval false - dead.
*/
bool kick(void);
/**
* Restart ESP8266 by "AT+RST".
*
* This method will take 3 seconds or more.
*
* @retval true - success.
* @retval false - failure.
*/
bool restart(void);
/**
* Get the version of AT Command Set.
*
* @return the string of version.
*/
String getVersion(void);
/**
* Start function of deep sleep.
*
* @param time - the sleep time.
* @retval true - success.
* @retval false - failure.
* @note the feature requires hardware support.
*/
bool deepSleep(uint32_t time);
/**
* Switch the echo function.
*
* @param mode - 1 start echo -0 stop echo
* @retval true - success.
* @retval false - failure.
*
*/
bool setEcho(uint8_t mode);
/**
* Restore factory.
* @retval true - success.
* @retval false - failure.
* @note The operation can lead to restart the machine.
*/
bool restore(void);
/**
* Set up a serial port configuration.
*
* @param pattern -1 send "AT+UART=", -2 send "AT+UART_CUR=", -3 send "AT+UART_DEF=".
* @param baudrate - the uart baudrate.
* @retval true - success.
* @retval false - failure.
* @note Only allows baud rate design, for the other parameters:databits- 8,stopbits -1,parity -0,flow control -0 .
*/
bool setUart(uint32_t baudrate,uint8_t pattern);
/**
* Set operation mode to station.
*
* @param pattern1 -1, send "AT+CWMODE_DEF?",-2,send "AT+CWMODE_CUR?",-3,send "AT+CWMODE?".
* @param pattern2 -1, send "AT+CWMODE_DEF=",-2,send "AT+CWMODE_CUR=",-3,send "AT+CWMODE=".
* @retval true - success.
* @retval false - failure.
*
*/
bool setOprToStation(uint8_t pattern1=DEFAULT_PATTERN,uint8_t pattern2=DEFAULT_PATTERN);
/**
* Get the model values list.
*
* @return the list of model.
*/
String getWifiModeList(void);
/**
* Set operation mode to softap.
* @param pattern1 -1, send "AT+CWMODE_DEF?",-2,send "AT+CWMODE_CUR?",-3,send "AT+CWMODE?".
* @param pattern2 -1, send "AT+CWMODE_DEF=",-2,send "AT+CWMODE_CUR=",-3,send "AT+CWMODE=".
*
* @retval true - success.
* @retval false - failure.
*/
bool setOprToSoftAP(uint8_t pattern1=DEFAULT_PATTERN,uint8_t pattern2=DEFAULT_PATTERN);
/**
* Set operation mode to station + softap.
* @param pattern1 -1, send "AT+CWMODE_DEF?",-2,send "AT+CWMODE_CUR?",-3,send "AT+CWMODE?".
* @param pattern2 -1, send "AT+CWMODE_DEF=",-2,send "AT+CWMODE_CUR=",-3,send "AT+CWMODE=".
*
* @retval true - success.
* @retval false - failure.
*/
bool setOprToStationSoftAP(uint8_t pattern1=DEFAULT_PATTERN,uint8_t pattern2=DEFAULT_PATTERN);
/**
* Get the operation mode.
* @param pattern1 -1, send "AT+CWMODE_DEF?",-2,send "AT+CWMODE_CUR?",-3,send "AT+CWMODE?".
*
* @retval 0 - failure.
* @retval 1 - mode Station.
* @retval 2 - mode AP.
* @retval 3 - mode AP + station.
*/
uint8_t getOprMode(uint8_t pattern1=DEFAULT_PATTERN);
/**
* Search available AP list and return it.
*
* @return the list of available APs.
* @note This method will occupy a lot of memeory(hundreds of Bytes to a couple of KBytes).
* Do not call this method unless you must and ensure that your board has enough memery left.
*/
String getAPList(void);
/**
* Search and returns the current connect AP.
*
* @param pattern -1, send "AT+CWJAP_DEF?",-2,send "AT+CWJAP_CUR?",-3,send "AT+CWJAP?".
* @return the ssid of AP connected now.
*/
String getNowConecAp(uint8_t pattern=DEFAULT_PATTERN);
/**
* Join in AP.
*
* @param pattern -1 send "AT+CWJAP_DEF=" -2 send "AT+CWJAP_CUR=" -3 send "AT+CWJAP=".
* @param ssid - SSID of AP to join in.
* @param pwd - Password of AP to join in.
* @retval true - success.
* @retval false - failure.
* @note This method will take a couple of seconds.
*/
bool joinAP(String ssid, String pwd,uint8_t pattern=DEFAULT_PATTERN);
/**
* Leave AP joined before.
*
* @retval true - success.
* @retval false - failure.
*/
bool leaveAP(void);
/**
* Set SoftAP parameters.
*
* @param pattern -1 send "AT+CWSAP_DEF=" -2 send "AT+CWSAP_CUR=" -3 send "AT+CWSAP=".
* @param ssid - SSID of SoftAP.
* @param pwd - PASSWORD of SoftAP.
* @param chl - the channel (1 - 13, default: 7).
* @param ecn - the way of encrypstion (0 - OPEN, 1 - WEP,
* 2 - WPA_PSK, 3 - WPA2_PSK, 4 - WPA_WPA2_PSK, default: 4).
* @retval true - success.
* @retval false - failure.
* @note This method should not be called when station mode.
*/
bool setSoftAPParam(String ssid, String pwd, uint8_t chl = 7, uint8_t ecn = 4,uint8_t pattern=DEFAULT_PATTERN);
/**
* get SoftAP parameters.
*
* @param pattern -1 send "AT+CWSAP_DEF?" -2 send "AT+CWSAP_CUR?" -3 send "AT+CWSAP?".
* @note This method should not be called when station mode.
*/
String getSoftAPParam(uint8_t pattern=DEFAULT_PATTERN);
/**
* Get the IP list of devices connected to SoftAP.
*
* @return the list of IP.
* @note This method should not be called when station mode.
*/
String getJoinedDeviceIP(void);
/**
* Get the current state of DHCP.
*
* @param pattern -1 send "AT+CWDHCP_DEF?" -2 send "AT+CWDHCP_CUR?" -3 send "AT+CWDHCP?".
* @return the state of DHCP.
*
*/
String getDHCP(uint8_t pattern=DEFAULT_PATTERN);
/**
* Set the state of DHCP.
* @param pattern -1 send "AT+CWDHCP_DEF=" -2 send "AT+CWDHCP_CUR=" -3 send "AT+CWDHCP=".
* @param mode - set ap or set station or set ap + station.
* @param en - 0 disable DHCP - 1 enable DHCP.
* @retval true - success.
* @retval false - failure.
*/
bool setDHCP(uint8_t mode, uint8_t en, uint8_t pattern=DEFAULT_PATTERN);
/**
* make boot automatically connected.
* @param en -1 enable -0 disable.
* @retval true - success.
* @retval false - failure.
*/
bool setAutoConnect(uint8_t en);
/**
* Get the station's MAC address.
* @param pattern -1 send "AT+CIPSTAMAC_DEF?=" -2 send "AT+CIPSTAMAC_CUR?" -3 send "AT+CIPSTAMAC?".
* @return mac address.
* @note This method should not be called when ap mode.
*/
String getStationMac(uint8_t pattern=DEFAULT_PATTERN);
/**
* Set the station's MAC address.
* @param pattern -1 send "AT+CIPSTAMAC_DEF=" -2 send "AT+CIPSTAMAC_CUR=" -3 send "AT+CIPSTAMAC=".
* @param mac - the mac address of station.
* @retval true - success.
* @retval false - failure.
*/
bool setStationMac(String mac,uint8_t pattern=DEFAULT_PATTERN);
/**
* Get the station's IP.
* @param pattern -1 send "AT+CIPSTA_DEF?" -2 send "AT+CIPSTA_CUR?" -3 send "AT+CIPSTA?".
* @return the station's IP.
* @note This method should not be called when ap mode.
*/
String getStationIp(uint8_t pattern=DEFAULT_PATTERN);
/**
* Set the station's IP.
* @param pattern -1 send "AT+CIPSTA_DEF=" -2 send "AT+CIPSTA_CUR=" -3 send "AT+CIPSTA=".
* @param ip - the ip of station.
* @param gateway -the gateway of station.
* @param netmask -the netmask of station.
* @retval true - success.
* @retval false - failure.
* @note This method should not be called when ap mode.
*/
bool setStationIp(String ip,String gateway,String netmask,uint8_t pattern=DEFAULT_PATTERN);
/**
* Get the AP's IP.
* @param pattern -1 send "AT+CIPAP_DEF?" -2 send "AT+CIPAP_CUR?" -3 send "AT+CIPAP?".
* @return ap's ip.
* @note This method should not be called when station mode.
*
*/
String getAPIp(uint8_t pattern=DEFAULT_PATTERN);
/**
* Set the AP IP.
* @param pattern -1 send "AT+CIPAP_DEF=" -2 send "AT+CIPAP_CUR=" -3 send "AT+CIPAP=".
* @param ip - the ip of AP.
* @retval true - success.
* @retval false - failure.
* @note This method should not be called when station mode.
*/
bool setAPIp(String ip,uint8_t pattern=DEFAULT_PATTERN);
/**
* start smartconfig.
* @param type -1:ESP_TOUCH -2:AirKiss.
* @retval true - success.
* @retval false - failure.
*/
bool startSmartConfig(uint8_t type);
/**
* stop smartconfig.
*
* @retval true - success.
* @retval false - failure.
*/
bool stopSmartConfig(void);
/**
* Get the current status of connection(UDP and TCP).
*
* @return the status.
*/
String getIPStatus(void);
/**
* Get the IP address of ESP8266.
*
* @return the IP list.
*/
String getLocalIP(void);
/**
* Enable IP MUX(multiple connection mode).
*
* In multiple connection mode, a couple of TCP and UDP communication can be builded.
* They can be distinguished by the identifier of TCP or UDP named mux_id.
*
* @retval true - success.
* @retval false - failure.
*/
bool enableMUX(void);
/**
* Disable IP MUX(single connection mode).
*
* In single connection mode, only one TCP or UDP communication can be builded.
*
* @retval true - success.
* @retval false - failure.
*/
bool disableMUX(void);
/**
* Create TCP connection in single mode.
*
* @param addr - the IP or domain name of the target host.
* @param port - the port number of the target host.
* @retval true - success.
* @retval false - failure.
*/
bool createTCP(String addr, uint32_t port);
/**
* Release TCP connection in single mode.
*
* @retval true - success.
* @retval false - failure.
*/
bool releaseTCP(void);
/**
* Register UDP port number in single mode.
*
* @param addr - the IP or domain name of the target host.
* @param port - the port number of the target host.
* @retval true - success.
* @retval false - failure.
*/
bool registerUDP(String addr, uint32_t port);
/**
* Unregister UDP port number in single mode.
*
* @retval true - success.
* @retval false - failure.
*/
bool unregisterUDP(void);
/**
* Create TCP connection in multiple mode.
*
* @param mux_id - the identifier of this TCP(available value: 0 - 4).
* @param addr - the IP or domain name of the target host.
* @param port - the port number of the target host.
* @retval true - success.
* @retval false - failure.
*/
bool createTCP(uint8_t mux_id, String addr, uint32_t port);
/**
* Release TCP connection in multiple mode.
*
* @param mux_id - the identifier of this TCP(available value: 0 - 4).
* @retval true - success.
* @retval false - failure.
*/
bool releaseTCP(uint8_t mux_id);
/**
* Register UDP port number in multiple mode.
*
* @param mux_id - the identifier of this TCP(available value: 0 - 4).
* @param addr - the IP or domain name of the target host.
* @param port - the port number of the target host.
* @retval true - success.
* @retval false - failure.
*/
bool registerUDP(uint8_t mux_id, String addr, uint32_t port);
/**
* Unregister UDP port number in multiple mode.
*
* @param mux_id - the identifier of this TCP(available value: 0 - 4).
* @retval true - success.
* @retval false - failure.
*/
bool unregisterUDP(uint8_t mux_id);
/**
* Set the timeout of TCP Server.
*
* @param timeout - the duration for timeout by second(0 ~ 28800, default:180).
* @retval true - success.
* @retval false - failure.
*/
bool setTCPServerTimeout(uint32_t timeout = 180);
/**
* Start TCP Server(Only in multiple mode).
*
* After started, user should call method: getIPStatus to know the status of TCP connections.
* The methods of receiving data can be called for user's any purpose. After communication,
* release the TCP connection is needed by calling method: releaseTCP with mux_id.
*
* @param port - the port number to listen(default: 333).
* @retval true - success.
* @retval false - failure.
*
* @see String getIPStatus(void);
* @see uint32_t recv(uint8_t *coming_mux_id, uint8_t *buffer, uint32_t len, uint32_t timeout);
* @see bool releaseTCP(uint8_t mux_id);
*/
bool startTCPServer(uint32_t port = 333);
/**
* Stop TCP Server(Only in multiple mode).
*
* @retval true - success.
* @retval false - failure.
*/
bool stopTCPServer(void);
/**
*Set the module transfer mode
*
* @retval true - success.
* @retval false - failure.
*/
bool setCIPMODE(uint8_t mode);
/**
* Start Server(Only in multiple mode).
*
* @param port - the port number to listen(default: 333).
* @retval true - success.
* @retval false - failure.
*
* @see String getIPStatus(void);
* @see uint32_t recv(uint8_t *coming_mux_id, uint8_t *buffer, uint32_t len, uint32_t timeout);
*/
bool startServer(uint32_t port = 333);
/**
* Stop Server(Only in multiple mode).
*
* @retval true - success.
* @retval false - failure.
*/
bool stopServer(void);
/**
* Save the passthrough links
*
* @retval true - success.
* @retval false - failure.
*/
bool saveTransLink (uint8_t mode,String ip,uint32_t port);
/**
* PING COMMAND.
*
* @retval true - success.
* @retval false - failure.
*/
bool setPing(String ip);
/**
* Send data based on TCP or UDP builded already in single mode.
*
* @param buffer - the buffer of data to send.
* @param len - the length of data to send.
* @retval true - success.
* @retval false - failure.
*/
bool send(const uint8_t *buffer, uint32_t len);
/**
* Send data based on one of TCP or UDP builded already in multiple mode.
*
* @param mux_id - the identifier of this TCP(available value: 0 - 4).
* @param buffer - the buffer of data to send.
* @param len - the length of data to send.
* @retval true - success.
* @retval false - failure.
*/
bool send(uint8_t mux_id, const uint8_t *buffer, uint32_t len);
/**
* Send data based on TCP or UDP builded already in single mode.
*
* @param buffer - the buffer of data to send from flash memeory.
* @param len - the length of data to send.
* @retval true - success.
* @retval false - failure.
*/
bool sendFromFlash(const uint8_t *buffer, uint32_t len);
/**
* Send data based on one of TCP or UDP builded already in multiple mode.
*
* @param mux_id - the identifier of this TCP(available value: 0 - 4).
* @param buffer - the buffer of data to send from flash memeory.
* @param len - the length of data to send.
* @retval true - success.
* @retval false - failure.
*/
bool sendFromFlash(uint8_t mux_id, const uint8_t *buffer, uint32_t len);
private:
/*
* Empty the buffer or UART RX.
*/
void rx_empty(void);
/*
* Recvive data from uart. Return all received data if target found or timeout.
*/
String recvString(String target, uint32_t timeout = 1000);
/*
* Recvive data from uart. Return all received data if one of target1 and target2 found or timeout.
*/
String recvString(String target1, String target2, uint32_t timeout = 1000);
/*
* Recvive data from uart. Return all received data if one of target1, target2 and target3 found or timeout.
*/
String recvString(String target1, String target2, String target3, uint32_t timeout = 1000);
/*
* Recvive data from uart and search first target. Return true if target found, false for timeout.
*/
bool recvFind(String target, uint32_t timeout = 1000);
/*
* Recvive data from uart and search first target and cut out the substring between begin and end(excluding begin and end self).
* Return true if target found, false for timeout.
*/
bool recvFindAndFilter(String target, String begin, String end, String &data, uint32_t timeout = 1000);
/*
* Receive a package from uart.
*
* @param buffer - the buffer storing data.
* @param buffer_size - guess what!
* @param data_len - the length of data actually received(maybe more than buffer_size, the remained data will be abandoned).
* @param timeout - the duration waitting data comming.
* @param coming_mux_id - in single connection mode, should be NULL and not NULL in multiple.
*/
uint32_t checkIPD(String& data);
bool eAT(void);
bool eATRST(void);
bool eATGMR(String &version);
bool eATGSLP(uint32_t time);
bool eATE(uint8_t mode);
bool eATRESTORE(void);
bool eATSETUART(uint32_t baudrate,uint8_t pattern);
bool qATCWMODE(uint8_t *mode,uint8_t pattern=3);
bool eATCWMODE(String &list) ;
bool sATCWMODE(uint8_t mode,uint8_t pattern=3);
bool qATCWJAP(String &ssid,uint8_t pattern=3) ;
bool sATCWJAP(String ssid, String pwd,uint8_t pattern=3);
bool eATCWLAP(String &list);
bool eATCWQAP(void);
bool qATCWSAP(String &List,uint8_t pattern=3);
bool sATCWSAP(String ssid, String pwd, uint8_t chl, uint8_t ecn,uint8_t pattern=3);
bool eATCWLIF(String &list);
bool qATCWDHCP(String &List,uint8_t pattern=3);
bool sATCWDHCP(uint8_t mode, uint8_t en, uint8_t pattern=3);
bool eATCWAUTOCONN(uint8_t en);
bool qATCIPSTAMAC(String &mac,uint8_t pattern=3);
bool eATCIPSTAMAC(String mac,uint8_t pattern=3);
bool qATCIPSTAIP(String &ip,uint8_t pattern=3);
bool eATCIPSTAIP(String ip,String gateway,String netmask,uint8_t pattern=3);
bool qATCIPAP(String &ip,uint8_t pattern=3);
bool eATCIPAP(String ip,uint8_t pattern=3);
bool eCWSTARTSMART(uint8_t type);
bool eCWSTOPSMART(void);
bool eATCIPSTATUS(String &list);
bool sATCIPSTARTSingle(String type, String addr, uint32_t port);
bool sATCIPSTARTMultiple(uint8_t mux_id, String type, String addr, uint32_t port);
bool sATCIPSENDSingle(const uint8_t *buffer, uint32_t len);
bool sATCIPSENDMultiple(uint8_t mux_id, const uint8_t *buffer, uint32_t len);
bool sATCIPSENDSingleFromFlash(const uint8_t *buffer, uint32_t len);
bool sATCIPSENDMultipleFromFlash(uint8_t mux_id, const uint8_t *buffer, uint32_t len);
bool sATCIPCLOSEMulitple(uint8_t mux_id);
bool eATCIPCLOSESingle(void);
bool eATCIFSR(String &list);
bool sATCIPMUX(uint8_t mode);
bool sATCIPSERVER(uint8_t mode, uint32_t port = 333);
bool sATCIPMODE(uint8_t mode);
bool eATSAVETRANSLINK(uint8_t mode,String ip,uint32_t port);
bool eATPING(String ip);
bool sATCIPSTO(uint32_t timeout);
/*
* +IPD,len:data
* +IPD,id,len:data
*/
Stream *m_puart; /* The UART to communicate with ESP8266 */
onData m_onData;
void* m_onDataPtr;
};
#endif /* #ifndef __ESP8266_H__ */