modified by ohneta

Dependencies:   ESP8266

Dependents:   HelloESP8266Interface_mine

Fork of ESP8266Interface by NetworkSocketAPI

Committer:
ohneta
Date:
Wed Nov 11 05:59:49 2015 +0000
Revision:
33:dcc7d9bd1ae2
Parent:
26:6e36dd3cec3f
modiried by ohneta

Who changed what in which revision?

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