Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: ATParser
Fork of ESP8266 by
Revision 8:80048194de79, committed 2015-07-23
- 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
--- /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
