modified by ohneta

Dependencies:   ESP8266

Dependents:   HelloESP8266Interface_mine

Fork of ESP8266Interface by NetworkSocketAPI

Committer:
sarahmarshy
Date:
Thu Jul 23 21:25:30 2015 +0000
Revision:
23:fd0f3197c30b
Parent:
22:312453862371
Child:
24:37504440f296
Child:
25:91c4e9d34b77
Moved AT commands to driver

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