Socket interface for ESP8266. Implements the NetworkSocketAPI. Requires device to use the Espressif Firmware.

Dependencies:   ESP8266

Dependents:   ESP8266InterfaceTests HelloESP8266Interface

Fork of ESP8266Interface by NetworkSocketAPI

Note

This library assumes your ESP8266 is running the Espressif Firmware. For instructions on how to update your ESP8266 to use the correct firmware see the Firmware Update Wiki Page.

Currently the ESP8266Interface LIbrary has the following Abilities:

Working

  • TCP Client
  • UDP Client
  • Transparent mode (single connection of 1 type at a time)
  • Station Mode (connects to AP)

To be implimented

  • TCP Server
  • UDP Server
  • Multi Connection Mode (able to have up to 5 sockets at a time)
  • AP Mode (Make ESP Chip act like access point)
  • DNS Support (currently websites must be looked up by IP)
  • Error Recovery

Nice but not necessary

  • colorized text for ESP AT Commands in Command line (easier to differentiate from other text)
Committer:
sam_grove
Date:
Mon Dec 28 05:39:05 2015 +0000
Revision:
30:c19f1e61063b
Parent:
29:f2ae8f47729b
Child:
33:276cb279df57
expose debug through the constructor. Fix bug when deallocating sockets if they haven't been allocated (check for null)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sarahmarshy 18:9fc7976c7b27 1 /* ESP8266Interface Example
sam_grove 11:288c15b80a26 2 * Copyright (c) 2015 ARM Limited
sam_grove 11:288c15b80a26 3 *
sam_grove 11:288c15b80a26 4 * Licensed under the Apache License, Version 2.0 (the "License");
sam_grove 11:288c15b80a26 5 * you may not use this file except in compliance with the License.
sam_grove 11:288c15b80a26 6 * You may obtain a copy of the License at
sam_grove 11:288c15b80a26 7 *
sam_grove 11:288c15b80a26 8 * http://www.apache.org/licenses/LICENSE-2.0
sam_grove 11:288c15b80a26 9 *
sam_grove 11:288c15b80a26 10 * Unless required by applicable law or agreed to in writing, software
sam_grove 11:288c15b80a26 11 * distributed under the License is distributed on an "AS IS" BASIS,
sam_grove 11:288c15b80a26 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
sam_grove 11:288c15b80a26 13 * See the License for the specific language governing permissions and
sam_grove 11:288c15b80a26 14 * limitations under the License.
sam_grove 11:288c15b80a26 15 */
sam_grove 24:37504440f296 16
sarahmarshy 18:9fc7976c7b27 17 #include "ESP8266Interface.h"
sam_grove 11:288c15b80a26 18
sam_grove 30:c19f1e61063b 19 ESP8266Interface::ESP8266Interface(PinName tx, PinName rx, uint8_t trace) : esp8266(tx, rx, trace)
sam_grove 11:288c15b80a26 20 {
sarahmarshy 22:312453862371 21 uuidCounter = 0;
sam_grove 24:37504440f296 22 std::fill_n(availableID, sizeof(availableID)/sizeof(int), -1);
sam_grove 11:288c15b80a26 23 }
sam_grove 11:288c15b80a26 24
sam_grove 24:37504440f296 25 int32_t ESP8266Interface::init(void)
sam_grove 24:37504440f296 26 {
sam_grove 24:37504440f296 27 if (!esp8266.startup()) {
sarahmarshy 18:9fc7976c7b27 28 return -1;
sam_grove 24:37504440f296 29 }
sam_grove 24:37504440f296 30 if (!esp8266.reset()) {
sarahmarshy 18:9fc7976c7b27 31 return -1;
sam_grove 24:37504440f296 32 }
sam_grove 24:37504440f296 33 if (!esp8266.wifiMode(3)) {
sarahmarshy 18:9fc7976c7b27 34 return -1;
sam_grove 24:37504440f296 35 }
sam_grove 24:37504440f296 36 if (!esp8266.multipleConnections(true)) {
sarahmarshy 18:9fc7976c7b27 37 return -1;
sam_grove 24:37504440f296 38 }
sarahmarshy 18:9fc7976c7b27 39 return 0;
sam_grove 11:288c15b80a26 40 }
sam_grove 11:288c15b80a26 41
sam_grove 24:37504440f296 42 int32_t ESP8266Interface::init(const char *ip, const char *mask, const char *gateway)
sam_grove 11:288c15b80a26 43 {
sarahmarshy 23:fd0f3197c30b 44 return -1;
sam_grove 11:288c15b80a26 45 }
sam_grove 11:288c15b80a26 46
sam_grove 24:37504440f296 47 int32_t ESP8266Interface::connect(uint32_t timeout_ms)
sam_grove 11:288c15b80a26 48 {
sam_grove 11:288c15b80a26 49 return -1;
sam_grove 11:288c15b80a26 50 }
sam_grove 11:288c15b80a26 51
sarahmarshy 18:9fc7976c7b27 52 int32_t ESP8266Interface::connect(const char *ap, const char *pass_phrase, wifi_security_t security, uint32_t timeout_ms)
sam_grove 11:288c15b80a26 53 {
sarahmarshy 23:fd0f3197c30b 54 esp8266.setTimeout(timeout_ms);
sam_grove 24:37504440f296 55 if (!esp8266.dhcp(1, true)) {
sarahmarshy 18:9fc7976c7b27 56 return -1;
sarahmarshy 18:9fc7976c7b27 57 }
sam_grove 24:37504440f296 58 if (!esp8266.connect(ap, pass_phrase)) {
sam_grove 24:37504440f296 59 return -1;
sam_grove 24:37504440f296 60 }
sam_grove 24:37504440f296 61 return 0;
sam_grove 11:288c15b80a26 62 }
sam_grove 11:288c15b80a26 63
sarahmarshy 22:312453862371 64 int32_t ESP8266Interface::disconnect(void)
sam_grove 11:288c15b80a26 65 {
sam_grove 24:37504440f296 66 if (!esp8266.disconnect()) {
sarahmarshy 22:312453862371 67 return -1;
sam_grove 24:37504440f296 68 }
sam_grove 30:c19f1e61063b 69 for (int i=0; i<numSockets; i++) {
sarahmarshy 22:312453862371 70 SocketInterface *socket = sockets[availableID[i]];
sam_grove 30:c19f1e61063b 71 if (socket) {
sam_grove 30:c19f1e61063b 72 deallocateSocket(socket);
sam_grove 30:c19f1e61063b 73 }
sarahmarshy 22:312453862371 74 }
sarahmarshy 22:312453862371 75 return 0;
sam_grove 11:288c15b80a26 76 }
sam_grove 11:288c15b80a26 77
sarahmarshy 18:9fc7976c7b27 78 char *ESP8266Interface::getIPAddress(void)
sarahmarshy 18:9fc7976c7b27 79 {
sam_grove 24:37504440f296 80 if(!esp8266.getIPAddress(ip)) {
sarahmarshy 18:9fc7976c7b27 81 return NULL;
sam_grove 24:37504440f296 82 }
sarahmarshy 18:9fc7976c7b27 83 return ip;
sarahmarshy 18:9fc7976c7b27 84 }
sarahmarshy 18:9fc7976c7b27 85
sarahmarshy 18:9fc7976c7b27 86 char *ESP8266Interface::getGateway(void) const
sam_grove 11:288c15b80a26 87 {
sam_grove 11:288c15b80a26 88 return 0;
sam_grove 11:288c15b80a26 89 }
sam_grove 11:288c15b80a26 90
sarahmarshy 18:9fc7976c7b27 91 char *ESP8266Interface::getNetworkMask(void) const
sam_grove 11:288c15b80a26 92 {
sam_grove 11:288c15b80a26 93 return 0;
sam_grove 11:288c15b80a26 94 }
sam_grove 11:288c15b80a26 95
sarahmarshy 18:9fc7976c7b27 96 char *ESP8266Interface::getMACAddress(void) const
sam_grove 11:288c15b80a26 97 {
sam_grove 11:288c15b80a26 98 return 0;
sam_grove 11:288c15b80a26 99 }
sam_grove 11:288c15b80a26 100
sam_grove 24:37504440f296 101 int32_t ESP8266Interface::isConnected(void)
sam_grove 11:288c15b80a26 102 {
sam_grove 24:37504440f296 103 return (getIPAddress() == NULL) ? -1 : 0;
sam_grove 11:288c15b80a26 104 }
sam_grove 11:288c15b80a26 105
sam_grove 24:37504440f296 106 SocketInterface *ESP8266Interface::allocateSocket(socket_protocol_t socketProtocol)
sam_grove 24:37504440f296 107 {
sarahmarshy 18:9fc7976c7b27 108 int id = -1;
sarahmarshy 18:9fc7976c7b27 109 //Look through the array of available sockets for an unused ID
sam_grove 24:37504440f296 110 for(int i=0; i<numSockets; i++) {
sam_grove 24:37504440f296 111 if (availableID[i] == -1) {
sam_grove 24:37504440f296 112 id = i;
sarahmarshy 18:9fc7976c7b27 113 availableID[i] = uuidCounter;
sarahmarshy 18:9fc7976c7b27 114 break;
sarahmarshy 18:9fc7976c7b27 115 }
sarahmarshy 18:9fc7976c7b27 116 }
sam_grove 24:37504440f296 117 if (id == -1) {
sam_grove 24:37504440f296 118 return NULL;//tried to allocate more than the maximum 5 sockets
sarahmarshy 18:9fc7976c7b27 119 }
sam_grove 24:37504440f296 120 ESP8266Socket *socket = new ESP8266Socket(uuidCounter++, esp8266, socketProtocol, (uint8_t)id);
sarahmarshy 22:312453862371 121 sockets[socket->getHandle()] = socket;
sarahmarshy 18:9fc7976c7b27 122 return socket;
sam_grove 11:288c15b80a26 123 }
sam_grove 13:0186e9e35a24 124
sam_grove 24:37504440f296 125 int ESP8266Interface::deallocateSocket(SocketInterface *socket)
bridadan 16:b2f781416464 126 {
sarahmarshy 18:9fc7976c7b27 127 int id = (int)static_cast<ESP8266Socket*>(socket)->getID();
sarahmarshy 18:9fc7976c7b27 128 availableID[id] = -1;
sam_grove 24:37504440f296 129
sarahmarshy 22:312453862371 130 std::map<uint32_t, SocketInterface*>::iterator it;
sam_grove 24:37504440f296 131
sarahmarshy 22:312453862371 132 // Check if socket is owned by WiFiRadioInterface
sarahmarshy 22:312453862371 133 it = sockets.find(socket->getHandle());
sam_grove 24:37504440f296 134
sarahmarshy 22:312453862371 135 if (it != sockets.end()) {
sarahmarshy 22:312453862371 136 // If so, erase it from the internal socket map and deallocate the socket
sarahmarshy 22:312453862371 137 sockets.erase(it);
sarahmarshy 22:312453862371 138 delete socket;
sarahmarshy 22:312453862371 139 } else {
sarahmarshy 22:312453862371 140 // Socket is not owned by WiFiRadioInterface, so return -1 error
sarahmarshy 22:312453862371 141 return -1;
sarahmarshy 22:312453862371 142 }
sam_grove 24:37504440f296 143 return 0;
bridadan 16:b2f781416464 144 }
sarahmarshy 25:91c4e9d34b77 145 void ESP8266Interface::getHostByName(const char *name, char* hostIP)
sarahmarshy 25:91c4e9d34b77 146 {
sarahmarshy 25:91c4e9d34b77 147 SocketInterface* sock = this->allocateSocket(SOCK_UDP);
sarahmarshy 29:f2ae8f47729b 148 DnsQuery dns(sock, name, hostIP);
sarahmarshy 25:91c4e9d34b77 149 this->deallocateSocket(sock);
sarahmarshy 25:91c4e9d34b77 150 }
bridadan 16:b2f781416464 151
sam_grove 24:37504440f296 152 ESP8266Socket::ESP8266Socket(uint32_t handle, ESP8266 &driver, socket_protocol_t type, uint8_t id)
sarahmarshy 18:9fc7976c7b27 153 {
sarahmarshy 22:312453862371 154 _handle = handle;
sam_grove 24:37504440f296 155 _driver = &driver;
sam_grove 24:37504440f296 156 _type = type;
sam_grove 24:37504440f296 157 _id = id;
sarahmarshy 18:9fc7976c7b27 158 }
sarahmarshy 18:9fc7976c7b27 159
sarahmarshy 18:9fc7976c7b27 160 const char *ESP8266Socket::getHostByName(const char *name) const
sam_grove 13:0186e9e35a24 161 {
sam_grove 13:0186e9e35a24 162 return 0;
sam_grove 13:0186e9e35a24 163 }
sam_grove 13:0186e9e35a24 164
sarahmarshy 18:9fc7976c7b27 165 void ESP8266Socket::setAddress(const char* addr)
bridadan 16:b2f781416464 166 {
sam_grove 24:37504440f296 167 _addr = addr;
sarahmarshy 18:9fc7976c7b27 168 }
sarahmarshy 18:9fc7976c7b27 169
sam_grove 24:37504440f296 170 void ESP8266Socket::setPort(uint16_t port)
sarahmarshy 18:9fc7976c7b27 171 {
sam_grove 24:37504440f296 172 _port = port;
bridadan 16:b2f781416464 173 }
bridadan 16:b2f781416464 174
sarahmarshy 18:9fc7976c7b27 175 void ESP8266Socket::setAddressPort(const char* addr, uint16_t port)
bridadan 16:b2f781416464 176 {
sam_grove 24:37504440f296 177 _addr = addr;
sarahmarshy 18:9fc7976c7b27 178 _port = port;
bridadan 16:b2f781416464 179 }
bridadan 16:b2f781416464 180
sarahmarshy 18:9fc7976c7b27 181 const char *ESP8266Socket::getAddress(void) const
sarahmarshy 18:9fc7976c7b27 182 {
sam_grove 24:37504440f296 183 return _addr;
sarahmarshy 18:9fc7976c7b27 184 }
sarahmarshy 18:9fc7976c7b27 185
sarahmarshy 18:9fc7976c7b27 186 uint16_t ESP8266Socket::getPort(void) const
sarahmarshy 18:9fc7976c7b27 187 {
sarahmarshy 18:9fc7976c7b27 188 return _port;
sarahmarshy 18:9fc7976c7b27 189 }
sarahmarshy 18:9fc7976c7b27 190
sarahmarshy 18:9fc7976c7b27 191
sarahmarshy 18:9fc7976c7b27 192 int32_t ESP8266Socket::bind(uint16_t port) const
sam_grove 13:0186e9e35a24 193 {
sam_grove 13:0186e9e35a24 194 return -1;
sam_grove 13:0186e9e35a24 195 }
sam_grove 13:0186e9e35a24 196
sarahmarshy 18:9fc7976c7b27 197 int32_t ESP8266Socket::listen(void) const
sam_grove 13:0186e9e35a24 198 {
sam_grove 13:0186e9e35a24 199 return -1;
sam_grove 13:0186e9e35a24 200 }
sam_grove 13:0186e9e35a24 201
sarahmarshy 18:9fc7976c7b27 202 int32_t ESP8266Socket::accept() const
sam_grove 13:0186e9e35a24 203 {
sam_grove 13:0186e9e35a24 204 return -1;
sam_grove 13:0186e9e35a24 205 }
sam_grove 13:0186e9e35a24 206
sam_grove 24:37504440f296 207 int32_t ESP8266Socket::open()
sam_grove 13:0186e9e35a24 208 {
sarahmarshy 26:6e36dd3cec3f 209
sam_grove 24:37504440f296 210 string sock_type = (SOCK_UDP == _type) ? "UDP" : "TCP";
sam_grove 24:37504440f296 211 if (!_driver->openSocket(sock_type, _id, _port, _addr)) {
sam_grove 24:37504440f296 212 return -1;
sarahmarshy 18:9fc7976c7b27 213 }
sam_grove 13:0186e9e35a24 214 return 0;
sam_grove 24:37504440f296 215
sam_grove 13:0186e9e35a24 216 }
sam_grove 13:0186e9e35a24 217
sam_grove 24:37504440f296 218 int32_t ESP8266Socket::send(const void *data, uint32_t amount, uint32_t timeout_ms)
bridadan 16:b2f781416464 219 {
sam_grove 24:37504440f296 220 _driver->setTimeout((int)timeout_ms);
sam_grove 24:37504440f296 221 if(!_driver->sendData(_id, data, amount)) {
sarahmarshy 18:9fc7976c7b27 222 return -1;
sarahmarshy 18:9fc7976c7b27 223 }
bridadan 16:b2f781416464 224 return 0;
bridadan 16:b2f781416464 225 }
bridadan 16:b2f781416464 226
sarahmarshy 18:9fc7976c7b27 227 uint32_t ESP8266Socket::recv(void *data, uint32_t amount, uint32_t timeout_ms)
sam_grove 13:0186e9e35a24 228 {
sarahmarshy 27:eaeecaaae611 229 _driver->setTimeout((int)timeout_ms);
sam_grove 24:37504440f296 230 return _driver->recv(data, amount);
sam_grove 13:0186e9e35a24 231 }
sam_grove 13:0186e9e35a24 232
sarahmarshy 18:9fc7976c7b27 233 int32_t ESP8266Socket::close() const
sam_grove 13:0186e9e35a24 234 {
sam_grove 24:37504440f296 235 if (!_driver->close(_id)) {
sarahmarshy 23:fd0f3197c30b 236 return -1;//closing socket not succesful
sarahmarshy 18:9fc7976c7b27 237 }
sam_grove 13:0186e9e35a24 238 return 0;
sam_grove 13:0186e9e35a24 239 }
sarahmarshy 22:312453862371 240
sarahmarshy 22:312453862371 241 uint32_t ESP8266Socket::getHandle()const
sarahmarshy 22:312453862371 242 {
sarahmarshy 22:312453862371 243 return _handle;
sarahmarshy 22:312453862371 244 }
sarahmarshy 22:312453862371 245
sarahmarshy 18:9fc7976c7b27 246 uint8_t ESP8266Socket::getID()
sam_grove 13:0186e9e35a24 247 {
sam_grove 24:37504440f296 248 return _id;
sarahmarshy 25:91c4e9d34b77 249 }