Components / ESP8266

Dependencies:   ATParser

Dependents:   ESP8266Interface

Fork of ESP8266 by NetworkSocketAPI

Files at this revision

API Documentation at this revision

Comitter:
sarahmarshy
Date:
Thu Jul 23 21:25:06 2015 +0000
Parent:
7:a91e1e139a6a
Child:
9:dcf3aa250bc1
Child:
10:965fbbf4169d
Commit message:
Moved AT commands to ESP8266 driver.

Changed in this revision

ESP8266.cpp Show annotated file Show diff for this revision Revisions of this file
ESP8266.h Show annotated file Show diff for this revision Revisions of this file
hwnamedriver.cpp Show diff for this revision Revisions of this file
hwnamedriver.h Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ESP8266.cpp	Thu Jul 23 21:25:06 2015 +0000
@@ -0,0 +1,148 @@
+/* ESP8266 Example
+ * Copyright (c) 2015 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+ 
+#include "ESP8266.h"
+
+ESP8266::ESP8266(PinName tx, PinName rx)
+: serial(tx, rx), atParser(&serial)
+{
+    serial.baud(115200);
+}
+
+
+bool ESP8266::startup(void)
+{
+    return (atParser.send("AT") && atParser.recv("OK"));
+}
+bool ESP8266::reset(void)
+{
+    return (atParser.send("AT+RST") && atParser.recv("OK\r\nready"));
+}
+bool ESP8266::wifiMode(int mode)
+{
+    //only 3 valid modes
+    if(mode < 1 || mode > 3)
+        return false;
+    
+    char modestr[1];
+    sprintf(modestr,"%d",mode);
+    string mode_command = "AT+CWMODE="+string(modestr);
+    return (atParser.send(mode_command.c_str()) && atParser.recv("OK"));   
+}
+bool ESP8266::multipleConnections(bool enabled)
+{
+    int on = (int)enabled;
+    char enable[1];
+    sprintf(enable,"%d",on);
+    string mux_command = "AT+CIPMUX="+string(enable);
+    return (atParser.send(mux_command.c_str()) && atParser.recv("OK"));  
+}
+bool ESP8266::dhcp(int mode, bool enabled)
+{
+    //only 3 valid modes
+    if(mode < 0 || mode > 2)
+        return false;
+        
+    int on = (int)enabled;
+    char enable[1];
+    sprintf(enable,"%d",on);
+    char modestr[1];
+    sprintf(modestr,"%d",mode);
+    string mode_command = "AT+CWDHCP="+string(modestr)+","+string(enable);
+    return (atParser.send(mode_command.c_str()) && atParser.recv("OK"));
+}
+
+bool ESP8266::connect(const char *ap, const char *passPhrase)
+{
+    string connect_command = "AT+CWJAP=\""+(string)ap+"\",\""+(string)passPhrase+"\"";
+    return (atParser.send(connect_command.c_str()) && atParser.recv("OK")); 
+}
+
+bool ESP8266::disconnect(void)
+{
+    return (atParser.send("AT+CWQAP") && atParser.recv("OK"));
+}
+
+bool ESP8266::getIPAddress(char* ip)
+{
+    return (atParser.send("AT+CIPSTA?") && atParser.recv("+CIPSTA:\"%[^\"]\"", ip));
+}
+bool ESP8266::isConnected(void) 
+{
+    char* ip;
+    return getIPAddress(ip);
+}
+bool ESP8266::openSocket(string sockType, int id, int port, char* addr)
+{
+    //IDs only 0-4
+    if(id > 4)
+        return false;
+    
+    char portstr[5];
+    char idstr[2];
+    sprintf(idstr,"%d",id);
+    sprintf(portstr, "%d", port);
+
+    string start_command = "AT+CIPSTART="+(string)idstr+",\""+sockType+"\",\""+(string)addr+"\","+(string)portstr;
+    if (!(atParser.send(start_command.c_str()) && atParser.recv("OK"))){
+        return false;//opening socket not succesful
+    }
+    return true;
+    
+}
+
+bool ESP8266::sendData(int id, const void *data, uint32_t amount)
+{
+    char idstr[2];
+    sprintf(idstr,"%d",id);
+    char lenstr[5];
+    sprintf(lenstr,"%d",(int)amount);
+    
+    string send_command = "AT+CIPSEND="+(string)idstr+","+(string)lenstr;
+    if(!atParser.send(send_command.c_str(), "SEND OK")){ 
+        return false;
+    } 
+    atParser.write((char*)data, (int)amount);
+    return true;
+}
+
+uint32_t ESP8266::recv(void *data, uint32_t amount)
+{
+    int length;
+    int id;
+    if (!(atParser.recv("+IPD,%d,%d:", &id, &length) && 
+      atParser.read((char*)data, length) &&
+      atParser.recv("OK"))){  
+        return 0;
+    }
+    return length;   
+}
+bool ESP8266::close(int id) 
+{
+    //IDs only 0-4
+    if(id > 4)
+        return false;
+    
+    char idstr[2];
+    sprintf(idstr,"%d",id);
+    string close_command = "AT+CIPCLOSE="+(string)idstr;  
+    
+    return (atParser.send(close_command.c_str()) && atParser.recv("OK"));
+}
+void ESP8266::setTimeout(uint32_t timeout_ms)
+{
+    atParser.setTimeout(timeout_ms);
+}   
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ESP8266.h	Thu Jul 23 21:25:06 2015 +0000
@@ -0,0 +1,151 @@
+/* ESP8266Interface Example
+ * Copyright (c) 2015 ARM Limited
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ESP8266_H
+#define ESP8266_H
+
+#include "ATParser.h"
+#include <string>
+
+/** ESP8266Interface class.
+    This is an interface to a ESP8266 radio.
+ */
+class ESP8266 
+{
+public:
+    ESP8266(PinName tx, PinName rx);
+    
+    /**
+    * Test startup of ESP8266
+    *
+    * @return true only if ESP8266 AT system working correctly
+    */
+    bool startup(void);
+    
+    /**
+    * Reset ESP8266
+    *
+    * @return true only if ESP8266 resets successfully 
+    */
+    bool reset(void);
+    
+    /**
+    * Set WiFi mode
+    *
+    * @param mode mode of WiFi 1-client, 2-host, 3-both
+    * @return true only if ESP8266 enables/disables DHCP successfully
+    */
+    bool wifiMode(int mode);
+    
+    /**
+    * Enable/Disable multiple connections
+    *
+    * @param enabled multiple connections enabled when true
+    * @return true only if ESP8266 enables/disables multiple connections successfully
+    */
+    bool multipleConnections(bool enabled);
+    
+    /**
+    * Enable/Disable DHCP
+    *
+    * @param mode mode of DHCP 0-softAP, 1-station, 2-both
+    * @param enabled DHCP enabled when true
+    * @return true only if ESP8266 enables/disables DHCP successfully
+    */
+    bool dhcp(int mode, bool enabled);
+    
+    /**
+    * Connect ESP8266 to AP
+    *
+    * @param ap the name of the AP
+    * @param passPhrase the password of AP
+    * @return true only if ESP8266 is connected successfully
+    */
+    bool connect(const char *ap, const char *passPhrase);
+    
+    /**
+    * Disconnect ESP8266 from AP
+    *
+    * @return true only if ESP8266 is disconnected successfully
+    */
+    bool disconnect(void);
+    
+    /**
+    * Get the IP address of ESP8266
+    *
+    * @param ip data placeholder for IP address
+    * @return true only if ESP8266 is assigned an IP address
+    */
+    bool getIPAddress(char* ip);
+    
+    /**
+    * Check if ESP8266 is conenected
+    *
+    * @return true only if the chip has an IP address
+    */
+    bool isConnected(void);
+    
+    /**
+    * Open a socketed connection 
+    *
+    * @param sockType the type of socket to open "UDP" or "TCP"
+    * @param id id to give the new socket, valid 0-4
+    * @param port port to open connection with
+    * @param addr the IP address of the destination 
+    * @return true only if socket opened successfully
+    */
+    bool openSocket(string sockType, int id, int port, char* addr);
+    
+    /**
+    * Sends data to an open socket
+    *
+    * @param id id of socket to send to
+    * @param data data to be sent
+    * @param amount amount of data to be sent - max 1024
+    * @return true only if data sent successfully
+    */
+    bool sendData(int id, const void *data, uint32_t amount);
+    
+    /**
+    * Receives data from an open socket 
+    *
+    * @param data placeholder for returned information
+    * @param amount number of bytes to be received
+    * @return the number of bytes actually received
+    */
+    uint32_t recv(void *data, uint32_t amount);
+    
+    /**
+    * Closes a socket
+    *
+    * @param id id of socket to close, valid only 0-4
+    * @return true only if socket is closed successfully
+    */
+    bool close(int id);
+    
+    /**
+    * Allows timeout to be changed between commands
+    *
+    * @param timeout_ms timeout of the connection
+    */
+    void setTimeout(uint32_t timeout_ms);
+    
+private:
+    BufferedSerial serial;
+    ATParser atParser;
+};
+
+#endif
--- a/hwnamedriver.cpp	Tue Jul 21 19:54:23 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-/* NetworkInterface Base Class
- * Copyright (c) 2015 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- 
- #include "hwnamedriver.h"
- 
- // TODO: User must impliment functions from hwnamedriver.h here. 
- // These functions can vary widely between devices, additional functions beyond
- // what is described in hwnamedriver.h can be added. This layer is used directly
- // by the Interface layer and thus should provide whatever functionality is 
- // required by that layer. 
\ No newline at end of file
--- a/hwnamedriver.h	Tue Jul 21 19:54:23 2015 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,228 +0,0 @@
-/* NetworkInterface Base Class
- * Copyright (c) 2015 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- 
- #ifndef HWNAME_DRIVER_H
- #define HWNAME_DRIVER_H
- 
- /*
-  These functions are a reference / sample implimentation. 
-  The functions usedcan vary greatly between networking devices. 
-  The only requirement is they provide the functionality needed by the Socket and Interface API's. 
- */
- 
- /*
- Functions to impliment
-- Initialize(SingleConnection/MultiConnection) // return object to track current endpoint? 
-- Reset() // its initialize but as a handy human readable implimentation
-- OpenConnection(Type TCP/UDP, IPV4/6, blocking/non-blocking)
-- CloseConnection() //  empty if single mode, provide return from initialize if in multi mode
-- Send(data) // make a vector to have implicit size?
-- Recieve(dataBuffer, blocking timeout?) // recieve data with a blocking timeout 
- 
- */
-
-//class HWNameDriver : 
-//{
-//public:
-//
-//	/**
-//     *    This enum defines the possible connect types.
-//     */
-//    enum connectType {
-//        TCP,
-//        UDP,
-//    };
-//
-//    /**
-//     *    Initialize the network hardware.
-//     *
-//     *    \returns 1 on success, 0 on failure
-//     */
-//    virtual init (void ) const {
-//        return 0;
-//    }
-//
-//    /**
-//     *    Reset the newtwork hardware
-//     *
-//     *    \returns 1 on success, 0 on failure
-//     */
-//    virtual int reset(void) const {
-//        return 0;
-//    }
-//
-//    /**
-//     *    Start a connection, either TCP or UDP 
-//     *
-//     *    \returns 1 on success, 0 on failure
-//     */
-//    virtual int connect(connectType type) const {
-//        return 0;
-//    }
-//
-//    /**
-//     *    Send data over the open connection 
-//     *
-//     *	  @param data 		The data to send.
-//     *	  @param dataLen 	The number of bytes of data to send.
-//     *	  @param timeout 	The timeout time to wait in ms, default to 1500ms.
-//     *
-//     *    \returns # of bytes sent on success, -1 on failure
-//     */
-//    virtual int send(uint8_t *data, int dataLen, int timeout = 1500) const {
-//        return 0;
-//    }
-//
-//    /**
-//     *    Receive data over the open connection 
-//     *
-//     *	  @param data 			Buffer to put received data into.
-//     *	  @param dataMaxSize 	The maximum size of the data buffer to put received data into.
-//     *    @param timeout 		The	timeout time to wait in ms, default to 1500ms.
-//     *
-//     *    \returns # of bytes recieved on success, -1 on failure
-//     */
-//    virtual int receive(uint8_t *data, int dataMaxSize,int timeout = 1500) const {
-//        return 0;
-//    }
-//
-//    /**
-//     *    Stop the interface, bringing down dhcp if necessary.
-//     *
-//     *    \returns 1 on success, 0 on failure
-//     */
-//    virtual int disconnect(void) const {
-//        return 0;
-//    }
-//
-//    /**
-//     *    Put the hardware to sleep / low power mode.
-//     *
-//     *    \returns 1 on success, 0 on failure
-//     */
-//    virtual int sleep(void) const {
-//        return 0;
-//    }
-//
-//    /**
-//     *    Wakeup the hardware.
-//     *
-//     *    \returns 1 on success, 0 on failure
-//     */
-//    virtual int wakeup(void) const {
-//        return 0;
-//    }
-//
-//    /**
-//     *    Set the current IP address.
-//     *
-//     *    @param ip The IP Address to use.
-//     *
-//     *    \returns 1 on success, 0 on failure
-//     */
-//    virtual int setIPAddress(const char *ip) const {
-//        return 0;
-//    }
-//
-//    /**
-//     *    Get the current IP address.
-//     *
-//     *    \returns a pointer to a string containing the IP address on success, 0 on failure.
-//     */
-//    virtual char *getIPAddress(void) const {
-//        return 0;
-//    }
-//
-//   /**
-//     *    Set the current gateway address.
-//     *
-//     *    @param gateway The Gateway to use.
-//     *
-//     *    \returns 1 on success, 0 on failure
-//     */
-//    virtual int setGateway(const char *gateway) const {
-//        return 0;
-//    }
-//
-//    /**
-//     *    Get the current gateway address.
-//     *
-//     *    \returns a pointer to a string containing the gateway address on success, 0 on failure.
-//     */
-//    virtual char *getGateway(void) const {
-//        return 0;
-//    }
-//
-//	/**
-//     *    Set the Network of the HWDevice
-//     *
-//     *    @param netmask The networkMask to use.
-//     *
-//     *    \returns 1 on success, 0 on failure
-//     */
-//    virtual int setNetworkMask(const char *netmask) const {
-//        return 0;
-//    };
-//
-//    /**
-//     *    Get the current network mask.
-//     *
-//     *    \returns a pointer to a string containing the network mask on success, 0 on failure.
-//     */
-//    virtual char *getNetworkMask(void) const {
-//        return 0;
-//    }
-//
-//    /**
-//     *    Set the MAC Address of the HWDevice
-//     *
-//     *    @param mac The static IP address to use
-//     *
-//     *    \returns 1 on success, 0 on failure
-//     */
-//    virtual int setMACAddress(const char *mac) const {
-//        return 0;
-//    };
-//
-//    /**
-//     *    Get the devices MAC address.
-//     *
-//     *    \returns a pointer to a string containing the mac address on success, 0 on failure.
-//     */
-//    virtual char *getMACAddress(void) const {
-//        return 0;
-//    }
-//
-//    /**
-//     *    Get the current status of the interface connection.
-//     *
-//     *    \returns true if connected, false otherwise.
-//     */
-//    virtual bool isConnected(void) const {
-//        return false;
-//    }
-//
-//private:
-//	char IPAddress[15]; 	// "xxx.xxx.xxx.xxx" IPV4
-//	char NetworkMask[15];	// "xxx.xxx.xxx.xxx"
-//	char Gateway[15];		// "xxx.xxx.xxx.xxx"
-//	char MacAddress[17];	// "xx:xx:xx:xx:xx:xx"
-//	bool connected;
-//
-//};
-
- 
- #endif // HWNAME_DRIVER_H
\ No newline at end of file