hadif azli
/
TEST123
BLYNK TEST
Diff: ESP8266_HardSer.h
- Revision:
- 3:4cd9171ba989
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ESP8266_HardSer.h Thu Jun 16 08:08:30 2016 +0000 @@ -0,0 +1,720 @@ +/** + * @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" +#include "mbed.h" +#include "WString.h" + +extern Timer g_Timer; +extern Serial pc; +//#define LOG_ESP8266 +#ifdef LOG_ESP8266 +#define ESP8266_LOG pc.printf +#define LOG_ENTER ESP8266_LOG("Enter %s\r\n", __func__); +#else +#define ESP8266_LOG(...) +#define LOG_ENTER +#endif + +//#define ESP8266_USE_SOFTWARE_SERIAL + +#ifdef ESP8266_USE_SOFTWARE_SERIAL +//#include "SoftwareSerial.h" +#define SoftwareSerial Serial +#else +#define HardwareSerial Serial +#endif + +#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); + +#ifdef ESP8266_USE_SOFTWARE_SERIAL + /* + * Constuctor. + * + * @param uart - an reference of SoftwareSerial object. + * @warning parameter baud depends on the AT firmware. 9600 is an common value. + */ + + ESP8266(SoftwareSerial &uart); + + SoftwareSerial* getUart() { return m_puart; } + +#else /* HardwareSerial */ + /* + * Constuctor. + * + * @param uart - an reference of HardwareSerial object. + * @warning parameter baud depends on the AT firmware. 9600 is an common value. + */ + + ESP8266(HardwareSerial &uart); + + HardwareSerial* getUart() { return m_puart; } + +#endif /* #ifdef ESP8266_USE_SOFTWARE_SERIAL */ + + 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 + */ + +#ifdef ESP8266_USE_SOFTWARE_SERIAL + SoftwareSerial *m_puart; /* The UART to communicate with ESP8266 */ +#else + HardwareSerial *m_puart; /* The UART to communicate with ESP8266 */ +#endif + onData m_onData; + void* m_onDataPtr; +}; + +#endif /* #ifndef __ESP8266_H__ */ + +