The driver for the ESP32 WiFi module

The ESP32 WiFi driver for Mbed OS

The Mbed OS driver for the ESP32 WiFi module.

Firmware version

How to write mbed-os compatible firmware : https://github.com/d-kato/GR-Boards_ESP32_Serial_Bridge

Restrictions

  • Setting up an UDP server is not possible
  • The serial port does not have hardware flow control enabled. The AT command set does not either have a way to limit the download rate. Therefore, downloading anything larger than the serial port input buffer is unreliable. An application should be able to read fast enough to stay ahead of the network. This affects mostly the TCP protocol where data would be lost with no notification. On UDP, this would lead to only packet losses which the higher layer protocol should recover from.

Committer:
dkato
Date:
Mon Jul 09 10:26:03 2018 +0000
Revision:
2:cb5c0d3fa776
Parent:
1:5d78eedef723
Synchronized with git revision 78a139f3bce17e23f2b4bd9342dd7adca023d248

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dkato 0:92d12d355ba9 1 /* ESP32Interface Example
dkato 0:92d12d355ba9 2 * Copyright (c) 2015 ARM Limited
dkato 0:92d12d355ba9 3 * Copyright (c) 2017 Renesas Electronics Corporation
dkato 0:92d12d355ba9 4 *
dkato 0:92d12d355ba9 5 * Licensed under the Apache License, Version 2.0 (the "License");
dkato 0:92d12d355ba9 6 * you may not use this file except in compliance with the License.
dkato 0:92d12d355ba9 7 * You may obtain a copy of the License at
dkato 0:92d12d355ba9 8 *
dkato 0:92d12d355ba9 9 * http://www.apache.org/licenses/LICENSE-2.0
dkato 0:92d12d355ba9 10 *
dkato 0:92d12d355ba9 11 * Unless required by applicable law or agreed to in writing, software
dkato 0:92d12d355ba9 12 * distributed under the License is distributed on an "AS IS" BASIS,
dkato 0:92d12d355ba9 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dkato 0:92d12d355ba9 14 * See the License for the specific language governing permissions and
dkato 0:92d12d355ba9 15 * limitations under the License.
dkato 0:92d12d355ba9 16 */
dkato 0:92d12d355ba9 17
dkato 0:92d12d355ba9 18 #ifndef ESP32_H
dkato 0:92d12d355ba9 19 #define ESP32_H
dkato 0:92d12d355ba9 20
dkato 0:92d12d355ba9 21 #include <vector>
dkato 0:92d12d355ba9 22 #include "ATCmdParser.h"
dkato 0:92d12d355ba9 23
dkato 0:92d12d355ba9 24 #ifndef ESP32_CONNECT_TIMEOUT
dkato 0:92d12d355ba9 25 #define ESP32_CONNECT_TIMEOUT 15000
dkato 0:92d12d355ba9 26 #endif
dkato 0:92d12d355ba9 27 #ifndef ESP32_RECV_TIMEOUT
dkato 0:92d12d355ba9 28 #define ESP32_RECV_TIMEOUT 2000
dkato 0:92d12d355ba9 29 #endif
dkato 0:92d12d355ba9 30 #ifndef ESP32_MISC_TIMEOUT
dkato 0:92d12d355ba9 31 #define ESP32_MISC_TIMEOUT 2000
dkato 0:92d12d355ba9 32 #endif
dkato 0:92d12d355ba9 33
dkato 0:92d12d355ba9 34 /** ESP32Interface class.
dkato 0:92d12d355ba9 35 This is an interface to a ESP32 radio.
dkato 0:92d12d355ba9 36 */
dkato 0:92d12d355ba9 37 class ESP32
dkato 0:92d12d355ba9 38 {
dkato 0:92d12d355ba9 39 public:
dkato 0:92d12d355ba9 40 /**
dkato 0:92d12d355ba9 41 * Static method to create or retrieve the single ESP32 instance
dkato 0:92d12d355ba9 42 */
dkato 1:5d78eedef723 43 static ESP32 * getESP32Inst(PinName en, PinName io0, PinName tx, PinName rx, bool debug,
dkato 1:5d78eedef723 44 PinName rts, PinName cts, int baudrate);
dkato 0:92d12d355ba9 45
dkato 1:5d78eedef723 46 ESP32(PinName en, PinName io0, PinName tx, PinName rx, bool debug,
dkato 1:5d78eedef723 47 PinName rts, PinName cts, int baudrate);
dkato 0:92d12d355ba9 48
dkato 0:92d12d355ba9 49 /**
dkato 0:92d12d355ba9 50 * Check firmware version of ESP8266
dkato 0:92d12d355ba9 51 *
dkato 0:92d12d355ba9 52 * @return integer firmware version or -1 if firmware query command gives outdated response
dkato 0:92d12d355ba9 53 */
dkato 0:92d12d355ba9 54 int get_firmware_version(void);
dkato 0:92d12d355ba9 55
dkato 0:92d12d355ba9 56 /**
dkato 0:92d12d355ba9 57 * Sets the Wi-Fi Mode
dkato 0:92d12d355ba9 58 *
dkato 0:92d12d355ba9 59 * @param mode mode of WIFI 1-client, 2-host, 3-both
dkato 0:92d12d355ba9 60 * @return true only if ESP32 was setup correctly
dkato 0:92d12d355ba9 61 */
dkato 0:92d12d355ba9 62 bool set_mode(int mode);
dkato 0:92d12d355ba9 63
dkato 0:92d12d355ba9 64 /**
dkato 0:92d12d355ba9 65 * Enable/Disable DHCP
dkato 0:92d12d355ba9 66 *
dkato 0:92d12d355ba9 67 * @param enabled DHCP enabled when true
dkato 0:92d12d355ba9 68 * @param mode mode of DHCP 0-softAP, 1-station, 2-both
dkato 0:92d12d355ba9 69 * @return true only if ESP32 enables/disables DHCP successfully
dkato 0:92d12d355ba9 70 */
dkato 0:92d12d355ba9 71 bool dhcp(bool enabled, int mode);
dkato 0:92d12d355ba9 72
dkato 0:92d12d355ba9 73 /**
dkato 0:92d12d355ba9 74 * Connect ESP32 to AP
dkato 0:92d12d355ba9 75 *
dkato 0:92d12d355ba9 76 * @param ap the name of the AP
dkato 0:92d12d355ba9 77 * @param passPhrase the password of AP
dkato 0:92d12d355ba9 78 * @return true only if ESP32 is connected successfully
dkato 0:92d12d355ba9 79 */
dkato 0:92d12d355ba9 80 bool connect(const char *ap, const char *passPhrase);
dkato 0:92d12d355ba9 81
dkato 0:92d12d355ba9 82 /**
dkato 0:92d12d355ba9 83 * Disconnect ESP32 from AP
dkato 0:92d12d355ba9 84 *
dkato 0:92d12d355ba9 85 * @return true only if ESP32 is disconnected successfully
dkato 0:92d12d355ba9 86 */
dkato 0:92d12d355ba9 87 bool disconnect(void);
dkato 0:92d12d355ba9 88
dkato 0:92d12d355ba9 89 /**
dkato 0:92d12d355ba9 90 * Get the IP address of ESP32
dkato 0:92d12d355ba9 91 *
dkato 0:92d12d355ba9 92 * @return null-teriminated IP address or null if no IP address is assigned
dkato 0:92d12d355ba9 93 */
dkato 0:92d12d355ba9 94 const char *getIPAddress(void);
dkato 0:92d12d355ba9 95 const char *getIPAddress_ap(void);
dkato 0:92d12d355ba9 96
dkato 0:92d12d355ba9 97 /**
dkato 0:92d12d355ba9 98 * Get the MAC address of ESP32
dkato 0:92d12d355ba9 99 *
dkato 0:92d12d355ba9 100 * @return null-terminated MAC address or null if no MAC address is assigned
dkato 0:92d12d355ba9 101 */
dkato 0:92d12d355ba9 102 const char *getMACAddress(void);
dkato 0:92d12d355ba9 103 const char *getMACAddress_ap(void);
dkato 0:92d12d355ba9 104
dkato 0:92d12d355ba9 105 /** Get the local gateway
dkato 0:92d12d355ba9 106 *
dkato 0:92d12d355ba9 107 * @return Null-terminated representation of the local gateway
dkato 0:92d12d355ba9 108 * or null if no network mask has been recieved
dkato 0:92d12d355ba9 109 */
dkato 0:92d12d355ba9 110 const char *getGateway();
dkato 0:92d12d355ba9 111 const char *getGateway_ap();
dkato 0:92d12d355ba9 112
dkato 0:92d12d355ba9 113 /** Get the local network mask
dkato 0:92d12d355ba9 114 *
dkato 0:92d12d355ba9 115 * @return Null-terminated representation of the local network mask
dkato 0:92d12d355ba9 116 * or null if no network mask has been recieved
dkato 0:92d12d355ba9 117 */
dkato 0:92d12d355ba9 118 const char *getNetmask();
dkato 0:92d12d355ba9 119 const char *getNetmask_ap();
dkato 0:92d12d355ba9 120
dkato 0:92d12d355ba9 121 /* Return RSSI for active connection
dkato 0:92d12d355ba9 122 *
dkato 0:92d12d355ba9 123 * @return Measured RSSI
dkato 0:92d12d355ba9 124 */
dkato 0:92d12d355ba9 125 int8_t getRSSI();
dkato 0:92d12d355ba9 126
dkato 0:92d12d355ba9 127 /**
dkato 0:92d12d355ba9 128 * Check if ESP32 is conenected
dkato 0:92d12d355ba9 129 *
dkato 0:92d12d355ba9 130 * @return true only if the chip has an IP address
dkato 0:92d12d355ba9 131 */
dkato 0:92d12d355ba9 132 bool isConnected(void);
dkato 0:92d12d355ba9 133
dkato 0:92d12d355ba9 134 /** Scan for available networks
dkato 0:92d12d355ba9 135 *
dkato 0:92d12d355ba9 136 * @param ap Pointer to allocated array to store discovered AP
dkato 0:92d12d355ba9 137 * @param limit Size of allocated @a res array, or 0 to only count available AP
dkato 0:92d12d355ba9 138 * @return Number of entries in @a res, or if @a count was 0 number of available networks, negative on error
dkato 0:92d12d355ba9 139 * see @a nsapi_error
dkato 0:92d12d355ba9 140 */
dkato 0:92d12d355ba9 141 int scan(WiFiAccessPoint *res, unsigned limit);
dkato 0:92d12d355ba9 142
dkato 0:92d12d355ba9 143 /**
dkato 0:92d12d355ba9 144 * Open a socketed connection
dkato 0:92d12d355ba9 145 *
dkato 0:92d12d355ba9 146 * @param type the type of socket to open "UDP" or "TCP"
dkato 0:92d12d355ba9 147 * @param id id to give the new socket, valid 0-4
dkato 0:92d12d355ba9 148 * @param port port to open connection with
dkato 0:92d12d355ba9 149 * @param addr the IP address of the destination
dkato 0:92d12d355ba9 150 * @param addr the IP address of the destination
dkato 0:92d12d355ba9 151 * @param opt type=" UDP" : UDP socket's local port, zero means any
dkato 0:92d12d355ba9 152 * type=" TCP" : TCP connection's keep alive time, zero means disabled
dkato 0:92d12d355ba9 153 * @return true only if socket opened successfully
dkato 0:92d12d355ba9 154 */
dkato 0:92d12d355ba9 155 bool open(const char *type, int id, const char* addr, int port, int opt = 0);
dkato 0:92d12d355ba9 156
dkato 0:92d12d355ba9 157 /**
dkato 0:92d12d355ba9 158 * Sends data to an open socket
dkato 0:92d12d355ba9 159 *
dkato 0:92d12d355ba9 160 * @param id id of socket to send to
dkato 0:92d12d355ba9 161 * @param data data to be sent
dkato 0:92d12d355ba9 162 * @param amount amount of data to be sent - max 1024
dkato 0:92d12d355ba9 163 * @return true only if data sent successfully
dkato 0:92d12d355ba9 164 */
dkato 0:92d12d355ba9 165 bool send(int id, const void *data, uint32_t amount);
dkato 0:92d12d355ba9 166
dkato 0:92d12d355ba9 167 /**
dkato 0:92d12d355ba9 168 * Receives data from an open socket
dkato 0:92d12d355ba9 169 *
dkato 0:92d12d355ba9 170 * @param id id to receive from
dkato 0:92d12d355ba9 171 * @param data placeholder for returned information
dkato 0:92d12d355ba9 172 * @param amount number of bytes to be received
dkato 0:92d12d355ba9 173 * @return the number of bytes received
dkato 0:92d12d355ba9 174 */
dkato 0:92d12d355ba9 175 int32_t recv(int id, void *data, uint32_t amount, uint32_t timeout = ESP32_RECV_TIMEOUT);
dkato 0:92d12d355ba9 176
dkato 0:92d12d355ba9 177 /**
dkato 0:92d12d355ba9 178 * Closes a socket
dkato 0:92d12d355ba9 179 *
dkato 0:92d12d355ba9 180 * @param id id of socket to close, valid only 0-4
dkato 0:92d12d355ba9 181 * @param wait_close
dkato 0:92d12d355ba9 182 * @return true only if socket is closed successfully
dkato 0:92d12d355ba9 183 */
dkato 0:92d12d355ba9 184 bool close(int id, bool wait_close = false);
dkato 0:92d12d355ba9 185
dkato 0:92d12d355ba9 186 /**
dkato 0:92d12d355ba9 187 * Allows timeout to be changed between commands
dkato 0:92d12d355ba9 188 *
dkato 0:92d12d355ba9 189 * @param timeout_ms timeout of the connection
dkato 0:92d12d355ba9 190 */
dkato 0:92d12d355ba9 191 void setTimeout(uint32_t timeout_ms = ESP32_MISC_TIMEOUT);
dkato 0:92d12d355ba9 192
dkato 0:92d12d355ba9 193 /**
dkato 0:92d12d355ba9 194 * Checks if data is available
dkato 0:92d12d355ba9 195 */
dkato 0:92d12d355ba9 196 bool readable();
dkato 0:92d12d355ba9 197
dkato 0:92d12d355ba9 198 /**
dkato 0:92d12d355ba9 199 * Checks if data can be written
dkato 0:92d12d355ba9 200 */
dkato 0:92d12d355ba9 201 bool writeable();
dkato 0:92d12d355ba9 202
dkato 0:92d12d355ba9 203 void socket_attach(int id, void (*callback)(void *), void *data);
dkato 0:92d12d355ba9 204 int get_free_id();
dkato 0:92d12d355ba9 205
dkato 0:92d12d355ba9 206 bool config_soft_ap(const char *ap, const char *passPhrase, uint8_t chl, uint8_t ecn);
dkato 0:92d12d355ba9 207
dkato 0:92d12d355ba9 208 bool restart();
dkato 0:92d12d355ba9 209 bool get_ssid(char *ap);
dkato 0:92d12d355ba9 210 bool cre_server(int port);
dkato 0:92d12d355ba9 211 bool del_server();
dkato 0:92d12d355ba9 212 bool accept(int * p_id);
dkato 0:92d12d355ba9 213
dkato 0:92d12d355ba9 214 bool set_network(const char *ip_address, const char *netmask, const char *gateway);
dkato 0:92d12d355ba9 215 bool set_network_ap(const char *ip_address, const char *netmask, const char *gateway);
dkato 0:92d12d355ba9 216
dkato 0:92d12d355ba9 217 /**
dkato 0:92d12d355ba9 218 * Attach a function to call whenever network state has changed
dkato 0:92d12d355ba9 219 *
dkato 0:92d12d355ba9 220 * @param func A pointer to a void function, or 0 to set as none
dkato 0:92d12d355ba9 221 */
dkato 0:92d12d355ba9 222 void attach_wifi_status(mbed::Callback<void(int8_t)> status_cb);
dkato 0:92d12d355ba9 223
dkato 0:92d12d355ba9 224 /** Get the connection status
dkato 0:92d12d355ba9 225 *
dkato 0:92d12d355ba9 226 * @return The connection status according to ConnectionStatusType
dkato 0:92d12d355ba9 227 */
dkato 0:92d12d355ba9 228 int8_t get_wifi_status() const;
dkato 0:92d12d355ba9 229
dkato 0:92d12d355ba9 230 static const int8_t WIFIMODE_STATION = 1;
dkato 0:92d12d355ba9 231 static const int8_t WIFIMODE_SOFTAP = 2;
dkato 0:92d12d355ba9 232 static const int8_t WIFIMODE_STATION_SOFTAP = 3;
dkato 0:92d12d355ba9 233 static const int8_t SOCKET_COUNT = 5;
dkato 0:92d12d355ba9 234
dkato 0:92d12d355ba9 235 static const int8_t STATUS_DISCONNECTED = 0;
dkato 0:92d12d355ba9 236 static const int8_t STATUS_CONNECTED = 1;
dkato 0:92d12d355ba9 237 static const int8_t STATUS_GOT_IP = 2;
dkato 0:92d12d355ba9 238
dkato 0:92d12d355ba9 239 private:
dkato 0:92d12d355ba9 240 DigitalOut * _p_wifi_en;
dkato 0:92d12d355ba9 241 DigitalOut * _p_wifi_io0;
dkato 0:92d12d355ba9 242 bool init_end;
dkato 0:92d12d355ba9 243 UARTSerial _serial;
dkato 0:92d12d355ba9 244 ATCmdParser _parser;
dkato 0:92d12d355ba9 245 struct packet {
dkato 0:92d12d355ba9 246 struct packet *next;
dkato 0:92d12d355ba9 247 int id;
dkato 0:92d12d355ba9 248 uint32_t len;
dkato 0:92d12d355ba9 249 uint32_t index;
dkato 0:92d12d355ba9 250 // data follows
dkato 0:92d12d355ba9 251 } *_packets, **_packets_end;
dkato 0:92d12d355ba9 252 int _wifi_mode;
dkato 0:92d12d355ba9 253 int _baudrate;
dkato 1:5d78eedef723 254 PinName _rts;
dkato 1:5d78eedef723 255 PinName _cts;
dkato 1:5d78eedef723 256 int _flow_control;
dkato 1:5d78eedef723 257 uint32_t last_timeout_ms;
dkato 0:92d12d355ba9 258
dkato 0:92d12d355ba9 259 std::vector<int> _accept_id;
dkato 0:92d12d355ba9 260 uint32_t _id_bits;
dkato 0:92d12d355ba9 261 uint32_t _id_bits_close;
dkato 0:92d12d355ba9 262 bool _server_act;
dkato 0:92d12d355ba9 263 rtos::Mutex _smutex; // Protect serial port access
dkato 0:92d12d355ba9 264 static ESP32 * instESP32;
dkato 0:92d12d355ba9 265 int8_t _wifi_status;
dkato 0:92d12d355ba9 266 Callback<void(int8_t)> _wifi_status_cb;
dkato 0:92d12d355ba9 267
dkato 0:92d12d355ba9 268 bool _ids[SOCKET_COUNT];
dkato 0:92d12d355ba9 269 struct {
dkato 0:92d12d355ba9 270 void (*callback)(void *);
dkato 0:92d12d355ba9 271 void *data;
dkato 0:92d12d355ba9 272 int Notified;
dkato 0:92d12d355ba9 273 } _cbs[SOCKET_COUNT];
dkato 0:92d12d355ba9 274
dkato 0:92d12d355ba9 275 bool startup();
dkato 0:92d12d355ba9 276 bool reset(void);
dkato 0:92d12d355ba9 277 void debugOn(bool debug);
dkato 0:92d12d355ba9 278 void socket_handler(bool connect, int id);
dkato 0:92d12d355ba9 279 void _connect_handler_0();
dkato 0:92d12d355ba9 280 void _connect_handler_1();
dkato 0:92d12d355ba9 281 void _connect_handler_2();
dkato 0:92d12d355ba9 282 void _connect_handler_3();
dkato 0:92d12d355ba9 283 void _connect_handler_4();
dkato 0:92d12d355ba9 284 void _closed_handler_0();
dkato 0:92d12d355ba9 285 void _closed_handler_1();
dkato 0:92d12d355ba9 286 void _closed_handler_2();
dkato 0:92d12d355ba9 287 void _closed_handler_3();
dkato 0:92d12d355ba9 288 void _closed_handler_4();
dkato 0:92d12d355ba9 289 void _connection_status_handler();
dkato 0:92d12d355ba9 290 void _packet_handler();
dkato 1:5d78eedef723 291 void _clear_socket_packets(int id);
dkato 0:92d12d355ba9 292 void event();
dkato 0:92d12d355ba9 293 bool recv_ap(nsapi_wifi_ap_t *ap);
dkato 0:92d12d355ba9 294
dkato 0:92d12d355ba9 295 char _ip_buffer[16];
dkato 0:92d12d355ba9 296 char _gateway_buffer[16];
dkato 0:92d12d355ba9 297 char _netmask_buffer[16];
dkato 0:92d12d355ba9 298 char _mac_buffer[18];
dkato 0:92d12d355ba9 299
dkato 0:92d12d355ba9 300 char _ip_buffer_ap[16];
dkato 0:92d12d355ba9 301 char _gateway_buffer_ap[16];
dkato 0:92d12d355ba9 302 char _netmask_buffer_ap[16];
dkato 0:92d12d355ba9 303 char _mac_buffer_ap[18];
dkato 0:92d12d355ba9 304 };
dkato 0:92d12d355ba9 305
dkato 0:92d12d355ba9 306 #endif