RTC auf true

Committer:
kevman
Date:
Wed Mar 13 11:03:24 2019 +0000
Revision:
2:7aab896b1a3b
2019-03-13

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kevman 2:7aab896b1a3b 1 /* ESP8266 implementation of NetworkInterfaceAPI
kevman 2:7aab896b1a3b 2 * Copyright (c) 2015 ARM Limited
kevman 2:7aab896b1a3b 3 *
kevman 2:7aab896b1a3b 4 * Licensed under the Apache License, Version 2.0 (the "License");
kevman 2:7aab896b1a3b 5 * you may not use this file except in compliance with the License.
kevman 2:7aab896b1a3b 6 * You may obtain a copy of the License at
kevman 2:7aab896b1a3b 7 *
kevman 2:7aab896b1a3b 8 * http://www.apache.org/licenses/LICENSE-2.0
kevman 2:7aab896b1a3b 9 *
kevman 2:7aab896b1a3b 10 * Unless required by applicable law or agreed to in writing, software
kevman 2:7aab896b1a3b 11 * distributed under the License is distributed on an "AS IS" BASIS,
kevman 2:7aab896b1a3b 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kevman 2:7aab896b1a3b 13 * See the License for the specific language governing permissions and
kevman 2:7aab896b1a3b 14 * limitations under the License.
kevman 2:7aab896b1a3b 15 */
kevman 2:7aab896b1a3b 16
kevman 2:7aab896b1a3b 17 #ifndef ESP8266_INTERFACE_H
kevman 2:7aab896b1a3b 18 #define ESP8266_INTERFACE_H
kevman 2:7aab896b1a3b 19
kevman 2:7aab896b1a3b 20 #include "mbed.h"
kevman 2:7aab896b1a3b 21 #include "ESP8266.h"
kevman 2:7aab896b1a3b 22
kevman 2:7aab896b1a3b 23
kevman 2:7aab896b1a3b 24 #define ESP8266_SOCKET_COUNT 5
kevman 2:7aab896b1a3b 25
kevman 2:7aab896b1a3b 26 /** ESP8266Interface class
kevman 2:7aab896b1a3b 27 * Implementation of the NetworkStack for the ESP8266
kevman 2:7aab896b1a3b 28 */
kevman 2:7aab896b1a3b 29 class ESP8266Interface : public NetworkStack, public WiFiInterface
kevman 2:7aab896b1a3b 30 {
kevman 2:7aab896b1a3b 31 public:
kevman 2:7aab896b1a3b 32 /**
kevman 2:7aab896b1a3b 33 * @brief ESP8266Interface default constructor
kevman 2:7aab896b1a3b 34 * Will use values defined in mbed_lib.json
kevman 2:7aab896b1a3b 35 */
kevman 2:7aab896b1a3b 36 ESP8266Interface();
kevman 2:7aab896b1a3b 37
kevman 2:7aab896b1a3b 38 /** ESP8266Interface lifetime
kevman 2:7aab896b1a3b 39 * @param tx TX pin
kevman 2:7aab896b1a3b 40 * @param rx RX pin
kevman 2:7aab896b1a3b 41 * @param debug Enable debugging
kevman 2:7aab896b1a3b 42 */
kevman 2:7aab896b1a3b 43 ESP8266Interface(PinName tx, PinName rx, bool debug = false);
kevman 2:7aab896b1a3b 44
kevman 2:7aab896b1a3b 45 /** Start the interface
kevman 2:7aab896b1a3b 46 *
kevman 2:7aab896b1a3b 47 * Attempts to connect to a WiFi network. Requires ssid and passphrase to be set.
kevman 2:7aab896b1a3b 48 * If passphrase is invalid, NSAPI_ERROR_AUTH_ERROR is returned.
kevman 2:7aab896b1a3b 49 *
kevman 2:7aab896b1a3b 50 * @return 0 on success, negative error code on failure
kevman 2:7aab896b1a3b 51 */
kevman 2:7aab896b1a3b 52 virtual int connect();
kevman 2:7aab896b1a3b 53
kevman 2:7aab896b1a3b 54 /** Start the interface
kevman 2:7aab896b1a3b 55 *
kevman 2:7aab896b1a3b 56 * Attempts to connect to a WiFi network.
kevman 2:7aab896b1a3b 57 *
kevman 2:7aab896b1a3b 58 * @param ssid Name of the network to connect to
kevman 2:7aab896b1a3b 59 * @param pass Security passphrase to connect to the network
kevman 2:7aab896b1a3b 60 * @param security Type of encryption for connection (Default: NSAPI_SECURITY_NONE)
kevman 2:7aab896b1a3b 61 * @param channel This parameter is not supported, setting it to anything else than 0 will result in NSAPI_ERROR_UNSUPPORTED
kevman 2:7aab896b1a3b 62 * @return 0 on success, or error code on failure
kevman 2:7aab896b1a3b 63 */
kevman 2:7aab896b1a3b 64 virtual int connect(const char *ssid, const char *pass, nsapi_security_t security = NSAPI_SECURITY_NONE,
kevman 2:7aab896b1a3b 65 uint8_t channel = 0);
kevman 2:7aab896b1a3b 66
kevman 2:7aab896b1a3b 67 /** Set the WiFi network credentials
kevman 2:7aab896b1a3b 68 *
kevman 2:7aab896b1a3b 69 * @param ssid Name of the network to connect to
kevman 2:7aab896b1a3b 70 * @param pass Security passphrase to connect to the network
kevman 2:7aab896b1a3b 71 * @param security Type of encryption for connection
kevman 2:7aab896b1a3b 72 * (defaults to NSAPI_SECURITY_NONE)
kevman 2:7aab896b1a3b 73 * @return 0 on success, or error code on failure
kevman 2:7aab896b1a3b 74 */
kevman 2:7aab896b1a3b 75 virtual int set_credentials(const char *ssid, const char *pass, nsapi_security_t security = NSAPI_SECURITY_NONE);
kevman 2:7aab896b1a3b 76
kevman 2:7aab896b1a3b 77 /** Set the WiFi network channel - NOT SUPPORTED
kevman 2:7aab896b1a3b 78 *
kevman 2:7aab896b1a3b 79 * This function is not supported and will return NSAPI_ERROR_UNSUPPORTED
kevman 2:7aab896b1a3b 80 *
kevman 2:7aab896b1a3b 81 * @param channel Channel on which the connection is to be made, or 0 for any (Default: 0)
kevman 2:7aab896b1a3b 82 * @return Not supported, returns NSAPI_ERROR_UNSUPPORTED
kevman 2:7aab896b1a3b 83 */
kevman 2:7aab896b1a3b 84 virtual int set_channel(uint8_t channel);
kevman 2:7aab896b1a3b 85
kevman 2:7aab896b1a3b 86 /** Stop the interface
kevman 2:7aab896b1a3b 87 * @return 0 on success, negative on failure
kevman 2:7aab896b1a3b 88 */
kevman 2:7aab896b1a3b 89 virtual int disconnect();
kevman 2:7aab896b1a3b 90
kevman 2:7aab896b1a3b 91 /** Get the internally stored IP address
kevman 2:7aab896b1a3b 92 * @return IP address of the interface or null if not yet connected
kevman 2:7aab896b1a3b 93 */
kevman 2:7aab896b1a3b 94 virtual const char *get_ip_address();
kevman 2:7aab896b1a3b 95
kevman 2:7aab896b1a3b 96 /** Get the internally stored MAC address
kevman 2:7aab896b1a3b 97 * @return MAC address of the interface
kevman 2:7aab896b1a3b 98 */
kevman 2:7aab896b1a3b 99 virtual const char *get_mac_address();
kevman 2:7aab896b1a3b 100
kevman 2:7aab896b1a3b 101 /** Get the local gateway
kevman 2:7aab896b1a3b 102 *
kevman 2:7aab896b1a3b 103 * @return Null-terminated representation of the local gateway
kevman 2:7aab896b1a3b 104 * or null if no network mask has been recieved
kevman 2:7aab896b1a3b 105 */
kevman 2:7aab896b1a3b 106 virtual const char *get_gateway();
kevman 2:7aab896b1a3b 107
kevman 2:7aab896b1a3b 108 /** Get the local network mask
kevman 2:7aab896b1a3b 109 *
kevman 2:7aab896b1a3b 110 * @return Null-terminated representation of the local network mask
kevman 2:7aab896b1a3b 111 * or null if no network mask has been recieved
kevman 2:7aab896b1a3b 112 */
kevman 2:7aab896b1a3b 113 virtual const char *get_netmask();
kevman 2:7aab896b1a3b 114
kevman 2:7aab896b1a3b 115 /** Gets the current radio signal strength for active connection
kevman 2:7aab896b1a3b 116 *
kevman 2:7aab896b1a3b 117 * @return Connection strength in dBm (negative value)
kevman 2:7aab896b1a3b 118 */
kevman 2:7aab896b1a3b 119 virtual int8_t get_rssi();
kevman 2:7aab896b1a3b 120
kevman 2:7aab896b1a3b 121 /** Scan for available networks
kevman 2:7aab896b1a3b 122 *
kevman 2:7aab896b1a3b 123 * This function will block.
kevman 2:7aab896b1a3b 124 *
kevman 2:7aab896b1a3b 125 * @param ap Pointer to allocated array to store discovered AP
kevman 2:7aab896b1a3b 126 * @param count Size of allocated @a res array, or 0 to only count available AP
kevman 2:7aab896b1a3b 127 * @param timeout Timeout in milliseconds; 0 for no timeout (Default: 0)
kevman 2:7aab896b1a3b 128 * @return Number of entries in @a, or if @a count was 0 number of available networks, negative on error
kevman 2:7aab896b1a3b 129 * see @a nsapi_error
kevman 2:7aab896b1a3b 130 */
kevman 2:7aab896b1a3b 131 virtual int scan(WiFiAccessPoint *res, unsigned count);
kevman 2:7aab896b1a3b 132
kevman 2:7aab896b1a3b 133 /** Translates a hostname to an IP address with specific version
kevman 2:7aab896b1a3b 134 *
kevman 2:7aab896b1a3b 135 * The hostname may be either a domain name or an IP address. If the
kevman 2:7aab896b1a3b 136 * hostname is an IP address, no network transactions will be performed.
kevman 2:7aab896b1a3b 137 *
kevman 2:7aab896b1a3b 138 * If no stack-specific DNS resolution is provided, the hostname
kevman 2:7aab896b1a3b 139 * will be resolve using a UDP socket on the stack.
kevman 2:7aab896b1a3b 140 *
kevman 2:7aab896b1a3b 141 * @param address Destination for the host SocketAddress
kevman 2:7aab896b1a3b 142 * @param host Hostname to resolve
kevman 2:7aab896b1a3b 143 * @param version IP version of address to resolve, NSAPI_UNSPEC indicates
kevman 2:7aab896b1a3b 144 * version is chosen by the stack (defaults to NSAPI_UNSPEC)
kevman 2:7aab896b1a3b 145 * @return 0 on success, negative error code on failure
kevman 2:7aab896b1a3b 146 */
kevman 2:7aab896b1a3b 147 using NetworkInterface::gethostbyname;
kevman 2:7aab896b1a3b 148
kevman 2:7aab896b1a3b 149 /** Add a domain name server to list of servers to query
kevman 2:7aab896b1a3b 150 *
kevman 2:7aab896b1a3b 151 * @param addr Destination for the host address
kevman 2:7aab896b1a3b 152 * @return 0 on success, negative error code on failure
kevman 2:7aab896b1a3b 153 */
kevman 2:7aab896b1a3b 154 using NetworkInterface::add_dns_server;
kevman 2:7aab896b1a3b 155
kevman 2:7aab896b1a3b 156 /** @copydoc NetworkStack::setsockopt
kevman 2:7aab896b1a3b 157 */
kevman 2:7aab896b1a3b 158 virtual nsapi_error_t setsockopt(nsapi_socket_t handle, int level,
kevman 2:7aab896b1a3b 159 int optname, const void *optval, unsigned optlen);
kevman 2:7aab896b1a3b 160
kevman 2:7aab896b1a3b 161 /** @copydoc NetworkStack::getsockopt
kevman 2:7aab896b1a3b 162 */
kevman 2:7aab896b1a3b 163 virtual nsapi_error_t getsockopt(nsapi_socket_t handle, int level, int optname,
kevman 2:7aab896b1a3b 164 void *optval, unsigned *optlen);
kevman 2:7aab896b1a3b 165
kevman 2:7aab896b1a3b 166 /** Register callback for status reporting
kevman 2:7aab896b1a3b 167 *
kevman 2:7aab896b1a3b 168 * The specified status callback function will be called on status changes
kevman 2:7aab896b1a3b 169 * on the network. The parameters on the callback are the event type and
kevman 2:7aab896b1a3b 170 * event-type dependent reason parameter.
kevman 2:7aab896b1a3b 171 *
kevman 2:7aab896b1a3b 172 * In ESP8266 the callback will be called when processing OOB-messages via
kevman 2:7aab896b1a3b 173 * AT-parser. Do NOT call any ESP8266Interface -functions or do extensive
kevman 2:7aab896b1a3b 174 * processing in the callback.
kevman 2:7aab896b1a3b 175 *
kevman 2:7aab896b1a3b 176 * @param status_cb The callback for status changes
kevman 2:7aab896b1a3b 177 */
kevman 2:7aab896b1a3b 178 virtual void attach(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb);
kevman 2:7aab896b1a3b 179
kevman 2:7aab896b1a3b 180 /** Get the connection status
kevman 2:7aab896b1a3b 181 *
kevman 2:7aab896b1a3b 182 * @return The connection status according to ConnectionStatusType
kevman 2:7aab896b1a3b 183 */
kevman 2:7aab896b1a3b 184 virtual nsapi_connection_status_t get_connection_status() const;
kevman 2:7aab896b1a3b 185
kevman 2:7aab896b1a3b 186 protected:
kevman 2:7aab896b1a3b 187 /** Open a socket
kevman 2:7aab896b1a3b 188 * @param handle Handle in which to store new socket
kevman 2:7aab896b1a3b 189 * @param proto Type of socket to open, NSAPI_TCP or NSAPI_UDP
kevman 2:7aab896b1a3b 190 * @return 0 on success, negative on failure
kevman 2:7aab896b1a3b 191 */
kevman 2:7aab896b1a3b 192 virtual int socket_open(void **handle, nsapi_protocol_t proto);
kevman 2:7aab896b1a3b 193
kevman 2:7aab896b1a3b 194 /** Close the socket
kevman 2:7aab896b1a3b 195 * @param handle Socket handle
kevman 2:7aab896b1a3b 196 * @return 0 on success, negative on failure
kevman 2:7aab896b1a3b 197 * @note On failure, any memory associated with the socket must still
kevman 2:7aab896b1a3b 198 * be cleaned up
kevman 2:7aab896b1a3b 199 */
kevman 2:7aab896b1a3b 200 virtual int socket_close(void *handle);
kevman 2:7aab896b1a3b 201
kevman 2:7aab896b1a3b 202 /** Bind a server socket to a specific port
kevman 2:7aab896b1a3b 203 * @param handle Socket handle
kevman 2:7aab896b1a3b 204 * @param address Local address to listen for incoming connections on
kevman 2:7aab896b1a3b 205 * @return 0 on success, negative on failure.
kevman 2:7aab896b1a3b 206 */
kevman 2:7aab896b1a3b 207 virtual int socket_bind(void *handle, const SocketAddress &address);
kevman 2:7aab896b1a3b 208
kevman 2:7aab896b1a3b 209 /** Start listening for incoming connections
kevman 2:7aab896b1a3b 210 * @param handle Socket handle
kevman 2:7aab896b1a3b 211 * @param backlog Number of pending connections that can be queued up at any
kevman 2:7aab896b1a3b 212 * one time [Default: 1]
kevman 2:7aab896b1a3b 213 * @return 0 on success, negative on failure
kevman 2:7aab896b1a3b 214 */
kevman 2:7aab896b1a3b 215 virtual int socket_listen(void *handle, int backlog);
kevman 2:7aab896b1a3b 216
kevman 2:7aab896b1a3b 217 /** Connects this TCP socket to the server
kevman 2:7aab896b1a3b 218 * @param handle Socket handle
kevman 2:7aab896b1a3b 219 * @param address SocketAddress to connect to
kevman 2:7aab896b1a3b 220 * @return 0 on success, negative on failure
kevman 2:7aab896b1a3b 221 */
kevman 2:7aab896b1a3b 222 virtual int socket_connect(void *handle, const SocketAddress &address);
kevman 2:7aab896b1a3b 223
kevman 2:7aab896b1a3b 224 /** Accept a new connection.
kevman 2:7aab896b1a3b 225 * @param handle Handle in which to store new socket
kevman 2:7aab896b1a3b 226 * @param server Socket handle to server to accept from
kevman 2:7aab896b1a3b 227 * @return 0 on success, negative on failure
kevman 2:7aab896b1a3b 228 * @note This call is not-blocking, if this call would block, must
kevman 2:7aab896b1a3b 229 * immediately return NSAPI_ERROR_WOULD_WAIT
kevman 2:7aab896b1a3b 230 */
kevman 2:7aab896b1a3b 231 virtual int socket_accept(void *handle, void **socket, SocketAddress *address);
kevman 2:7aab896b1a3b 232
kevman 2:7aab896b1a3b 233 /** Send data to the remote host
kevman 2:7aab896b1a3b 234 * @param handle Socket handle
kevman 2:7aab896b1a3b 235 * @param data The buffer to send to the host
kevman 2:7aab896b1a3b 236 * @param size The length of the buffer to send
kevman 2:7aab896b1a3b 237 * @return Number of written bytes on success, negative on failure
kevman 2:7aab896b1a3b 238 * @note This call is not-blocking, if this call would block, must
kevman 2:7aab896b1a3b 239 * immediately return NSAPI_ERROR_WOULD_WAIT
kevman 2:7aab896b1a3b 240 */
kevman 2:7aab896b1a3b 241 virtual int socket_send(void *handle, const void *data, unsigned size);
kevman 2:7aab896b1a3b 242
kevman 2:7aab896b1a3b 243 /** Receive data from the remote host
kevman 2:7aab896b1a3b 244 * @param handle Socket handle
kevman 2:7aab896b1a3b 245 * @param data The buffer in which to store the data received from the host
kevman 2:7aab896b1a3b 246 * @param size The maximum length of the buffer
kevman 2:7aab896b1a3b 247 * @return Number of received bytes on success, negative on failure
kevman 2:7aab896b1a3b 248 * @note This call is not-blocking, if this call would block, must
kevman 2:7aab896b1a3b 249 * immediately return NSAPI_ERROR_WOULD_WAIT
kevman 2:7aab896b1a3b 250 */
kevman 2:7aab896b1a3b 251 virtual int socket_recv(void *handle, void *data, unsigned size);
kevman 2:7aab896b1a3b 252
kevman 2:7aab896b1a3b 253 /** Send a packet to a remote endpoint
kevman 2:7aab896b1a3b 254 * @param handle Socket handle
kevman 2:7aab896b1a3b 255 * @param address The remote SocketAddress
kevman 2:7aab896b1a3b 256 * @param data The packet to be sent
kevman 2:7aab896b1a3b 257 * @param size The length of the packet to be sent
kevman 2:7aab896b1a3b 258 * @return The number of written bytes on success, negative on failure
kevman 2:7aab896b1a3b 259 * @note This call is not-blocking, if this call would block, must
kevman 2:7aab896b1a3b 260 * immediately return NSAPI_ERROR_WOULD_WAIT
kevman 2:7aab896b1a3b 261 */
kevman 2:7aab896b1a3b 262 virtual int socket_sendto(void *handle, const SocketAddress &address, const void *data, unsigned size);
kevman 2:7aab896b1a3b 263
kevman 2:7aab896b1a3b 264 /** Receive a packet from a remote endpoint
kevman 2:7aab896b1a3b 265 * @param handle Socket handle
kevman 2:7aab896b1a3b 266 * @param address Destination for the remote SocketAddress or null
kevman 2:7aab896b1a3b 267 * @param buffer The buffer for storing the incoming packet data
kevman 2:7aab896b1a3b 268 * If a packet is too long to fit in the supplied buffer,
kevman 2:7aab896b1a3b 269 * excess bytes are discarded
kevman 2:7aab896b1a3b 270 * @param size The length of the buffer
kevman 2:7aab896b1a3b 271 * @return The number of received bytes on success, negative on failure
kevman 2:7aab896b1a3b 272 * @note This call is not-blocking, if this call would block, must
kevman 2:7aab896b1a3b 273 * immediately return NSAPI_ERROR_WOULD_WAIT
kevman 2:7aab896b1a3b 274 */
kevman 2:7aab896b1a3b 275 virtual int socket_recvfrom(void *handle, SocketAddress *address, void *buffer, unsigned size);
kevman 2:7aab896b1a3b 276
kevman 2:7aab896b1a3b 277 /** Register a callback on state change of the socket
kevman 2:7aab896b1a3b 278 * @param handle Socket handle
kevman 2:7aab896b1a3b 279 * @param callback Function to call on state change
kevman 2:7aab896b1a3b 280 * @param data Argument to pass to callback
kevman 2:7aab896b1a3b 281 * @note Callback may be called in an interrupt context.
kevman 2:7aab896b1a3b 282 */
kevman 2:7aab896b1a3b 283 virtual void socket_attach(void *handle, void (*callback)(void *), void *data);
kevman 2:7aab896b1a3b 284
kevman 2:7aab896b1a3b 285 /** Provide access to the NetworkStack object
kevman 2:7aab896b1a3b 286 *
kevman 2:7aab896b1a3b 287 * @return The underlying NetworkStack object
kevman 2:7aab896b1a3b 288 */
kevman 2:7aab896b1a3b 289 virtual NetworkStack *get_stack()
kevman 2:7aab896b1a3b 290 {
kevman 2:7aab896b1a3b 291 return this;
kevman 2:7aab896b1a3b 292 }
kevman 2:7aab896b1a3b 293
kevman 2:7aab896b1a3b 294 private:
kevman 2:7aab896b1a3b 295 static const int ESP8266_SSID_MAX_LENGTH = 32; /* 32 is what 802.11 defines as longest possible name */
kevman 2:7aab896b1a3b 296 static const int ESP8266_PASSPHRASE_MAX_LENGTH = 63; /* The longest allowed passphrase */
kevman 2:7aab896b1a3b 297 static const int ESP8266_PASSPHRASE_MIN_LENGTH = 8; /* The shortest allowed passphrase */
kevman 2:7aab896b1a3b 298
kevman 2:7aab896b1a3b 299 ESP8266 _esp;
kevman 2:7aab896b1a3b 300 bool _ids[ESP8266_SOCKET_COUNT];
kevman 2:7aab896b1a3b 301 int _initialized;
kevman 2:7aab896b1a3b 302 int _started;
kevman 2:7aab896b1a3b 303
kevman 2:7aab896b1a3b 304 char ap_ssid[ESP8266_SSID_MAX_LENGTH + 1]; /* 32 is what 802.11 defines as longest possible name; +1 for the \0 */
kevman 2:7aab896b1a3b 305 nsapi_security_t ap_sec;
kevman 2:7aab896b1a3b 306 uint8_t ap_ch;
kevman 2:7aab896b1a3b 307 char ap_pass[ESP8266_PASSPHRASE_MAX_LENGTH + 1];
kevman 2:7aab896b1a3b 308 uint16_t _local_ports[ESP8266_SOCKET_COUNT];
kevman 2:7aab896b1a3b 309
kevman 2:7aab896b1a3b 310 bool _disable_default_softap();
kevman 2:7aab896b1a3b 311 void event();
kevman 2:7aab896b1a3b 312 bool _get_firmware_ok();
kevman 2:7aab896b1a3b 313 nsapi_error_t _init(void);
kevman 2:7aab896b1a3b 314 nsapi_error_t _startup(const int8_t wifi_mode);
kevman 2:7aab896b1a3b 315
kevman 2:7aab896b1a3b 316 struct {
kevman 2:7aab896b1a3b 317 void (*callback)(void *);
kevman 2:7aab896b1a3b 318 void *data;
kevman 2:7aab896b1a3b 319 } _cbs[ESP8266_SOCKET_COUNT];
kevman 2:7aab896b1a3b 320 };
kevman 2:7aab896b1a3b 321
kevman 2:7aab896b1a3b 322 #endif