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 /* ESP32 implementation of NetworkInterfaceAPI
dkato 0:92d12d355ba9 2 * Copyright (c) 2017 Renesas Electronics Corporation
dkato 0:92d12d355ba9 3 *
dkato 0:92d12d355ba9 4 * Licensed under the Apache License, Version 2.0 (the "License");
dkato 0:92d12d355ba9 5 * you may not use this file except in compliance with the License.
dkato 0:92d12d355ba9 6 * You may obtain a copy of the License at
dkato 0:92d12d355ba9 7 *
dkato 0:92d12d355ba9 8 * http://www.apache.org/licenses/LICENSE-2.0
dkato 0:92d12d355ba9 9 *
dkato 0:92d12d355ba9 10 * Unless required by applicable law or agreed to in writing, software
dkato 0:92d12d355ba9 11 * distributed under the License is distributed on an "AS IS" BASIS,
dkato 0:92d12d355ba9 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
dkato 0:92d12d355ba9 13 * See the License for the specific language governing permissions and
dkato 0:92d12d355ba9 14 * limitations under the License.
dkato 0:92d12d355ba9 15 */
dkato 0:92d12d355ba9 16
dkato 0:92d12d355ba9 17 #include <string.h>
dkato 0:92d12d355ba9 18 #include "ESP32InterfaceAP.h"
dkato 0:92d12d355ba9 19
dkato 0:92d12d355ba9 20 // ESP32InterfaceAP implementation
dkato 1:5d78eedef723 21 ESP32InterfaceAP::ESP32InterfaceAP(PinName en, PinName io0, PinName tx, PinName rx, bool debug,
dkato 1:5d78eedef723 22 PinName rts, PinName cts, int baudrate) :
dkato 1:5d78eedef723 23 ESP32Stack(en, io0, tx, rx, debug, rts, cts, baudrate),
dkato 0:92d12d355ba9 24 _dhcp(true),
dkato 0:92d12d355ba9 25 _own_ch(1),
dkato 0:92d12d355ba9 26 _own_ssid(),
dkato 0:92d12d355ba9 27 _own_pass(),
dkato 0:92d12d355ba9 28 _own_sec(NSAPI_SECURITY_NONE),
dkato 0:92d12d355ba9 29 _ip_address(),
dkato 0:92d12d355ba9 30 _netmask(),
dkato 0:92d12d355ba9 31 _gateway(),
dkato 0:92d12d355ba9 32 _connection_status(NSAPI_STATUS_DISCONNECTED),
dkato 0:92d12d355ba9 33 _connection_status_cb(NULL)
dkato 0:92d12d355ba9 34 {
dkato 0:92d12d355ba9 35 }
dkato 0:92d12d355ba9 36
dkato 1:5d78eedef723 37 ESP32InterfaceAP::ESP32InterfaceAP(PinName tx, PinName rx, bool debug) :
dkato 1:5d78eedef723 38 ESP32Stack(NC, NC, tx, rx, debug, NC, NC, 230400),
dkato 0:92d12d355ba9 39 _dhcp(true),
dkato 0:92d12d355ba9 40 _own_ch(1),
dkato 0:92d12d355ba9 41 _own_ssid(),
dkato 0:92d12d355ba9 42 _own_pass(),
dkato 0:92d12d355ba9 43 _own_sec(NSAPI_SECURITY_NONE),
dkato 0:92d12d355ba9 44 _ip_address(),
dkato 0:92d12d355ba9 45 _netmask(),
dkato 0:92d12d355ba9 46 _gateway(),
dkato 0:92d12d355ba9 47 _connection_status(NSAPI_STATUS_DISCONNECTED),
dkato 0:92d12d355ba9 48 _connection_status_cb(NULL)
dkato 0:92d12d355ba9 49 {
dkato 0:92d12d355ba9 50 }
dkato 0:92d12d355ba9 51
dkato 0:92d12d355ba9 52 nsapi_error_t ESP32InterfaceAP::set_network(const char *ip_address, const char *netmask, const char *gateway)
dkato 0:92d12d355ba9 53 {
dkato 0:92d12d355ba9 54 _dhcp = false;
dkato 0:92d12d355ba9 55
dkato 0:92d12d355ba9 56 strncpy(_ip_address, ip_address ? ip_address : "", sizeof(_ip_address));
dkato 0:92d12d355ba9 57 _ip_address[sizeof(_ip_address) - 1] = '\0';
dkato 0:92d12d355ba9 58 strncpy(_netmask, netmask ? netmask : "", sizeof(_netmask));
dkato 0:92d12d355ba9 59 _netmask[sizeof(_netmask) - 1] = '\0';
dkato 0:92d12d355ba9 60 strncpy(_gateway, gateway ? gateway : "", sizeof(_gateway));
dkato 0:92d12d355ba9 61 _gateway[sizeof(_gateway) - 1] = '\0';
dkato 0:92d12d355ba9 62
dkato 0:92d12d355ba9 63 return NSAPI_ERROR_OK;
dkato 0:92d12d355ba9 64 }
dkato 0:92d12d355ba9 65
dkato 0:92d12d355ba9 66 nsapi_error_t ESP32InterfaceAP::set_dhcp(bool dhcp)
dkato 0:92d12d355ba9 67 {
dkato 0:92d12d355ba9 68 _dhcp = dhcp;
dkato 0:92d12d355ba9 69
dkato 0:92d12d355ba9 70 return NSAPI_ERROR_OK;
dkato 0:92d12d355ba9 71 }
dkato 0:92d12d355ba9 72
dkato 0:92d12d355ba9 73 int ESP32InterfaceAP::connect(const char *ssid, const char *pass, nsapi_security_t security,
dkato 0:92d12d355ba9 74 uint8_t channel)
dkato 0:92d12d355ba9 75 {
dkato 0:92d12d355ba9 76 int ret;
dkato 0:92d12d355ba9 77
dkato 0:92d12d355ba9 78 ret = set_credentials(ssid, pass, security);
dkato 0:92d12d355ba9 79 if (ret != 0) {
dkato 0:92d12d355ba9 80 return ret;
dkato 0:92d12d355ba9 81 }
dkato 0:92d12d355ba9 82
dkato 0:92d12d355ba9 83 ret = set_channel(channel);
dkato 0:92d12d355ba9 84 if (ret != 0) {
dkato 0:92d12d355ba9 85 return ret;
dkato 0:92d12d355ba9 86 }
dkato 0:92d12d355ba9 87
dkato 0:92d12d355ba9 88 return connect();
dkato 0:92d12d355ba9 89 }
dkato 0:92d12d355ba9 90
dkato 0:92d12d355ba9 91 int ESP32InterfaceAP::connect()
dkato 0:92d12d355ba9 92 {
dkato 0:92d12d355ba9 93 if (!_esp->set_mode(ESP32::WIFIMODE_STATION_SOFTAP)) {
dkato 0:92d12d355ba9 94 return NSAPI_ERROR_DEVICE_ERROR;
dkato 0:92d12d355ba9 95 }
dkato 0:92d12d355ba9 96
dkato 0:92d12d355ba9 97 if (!_esp->dhcp(_dhcp, 1)) {
dkato 0:92d12d355ba9 98 return NSAPI_ERROR_DHCP_FAILURE;
dkato 0:92d12d355ba9 99 }
dkato 0:92d12d355ba9 100
dkato 0:92d12d355ba9 101 if (!_dhcp) {
dkato 0:92d12d355ba9 102 if (!_esp->set_network_ap(_ip_address, _netmask, _gateway)) {
dkato 0:92d12d355ba9 103 return NSAPI_ERROR_DEVICE_ERROR;
dkato 0:92d12d355ba9 104 }
dkato 0:92d12d355ba9 105 }
dkato 0:92d12d355ba9 106
dkato 0:92d12d355ba9 107 if (!_esp->config_soft_ap(_own_ssid, _own_pass, _own_ch, (uint8_t)_own_sec)) {
dkato 0:92d12d355ba9 108 return NSAPI_ERROR_DEVICE_ERROR;
dkato 0:92d12d355ba9 109 }
dkato 0:92d12d355ba9 110
dkato 0:92d12d355ba9 111 _connection_status = NSAPI_STATUS_GLOBAL_UP;
dkato 0:92d12d355ba9 112 if (_connection_status_cb) {
dkato 0:92d12d355ba9 113 _connection_status_cb(NSAPI_EVENT_CONNECTION_STATUS_CHANGE, _connection_status);
dkato 0:92d12d355ba9 114 }
dkato 0:92d12d355ba9 115
dkato 0:92d12d355ba9 116 return NSAPI_ERROR_OK;
dkato 0:92d12d355ba9 117 }
dkato 0:92d12d355ba9 118
dkato 0:92d12d355ba9 119 int ESP32InterfaceAP::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
dkato 0:92d12d355ba9 120 {
dkato 0:92d12d355ba9 121 switch (security) {
dkato 0:92d12d355ba9 122 case NSAPI_SECURITY_NONE:
dkato 0:92d12d355ba9 123 case NSAPI_SECURITY_WPA:
dkato 0:92d12d355ba9 124 case NSAPI_SECURITY_WPA2:
dkato 0:92d12d355ba9 125 case NSAPI_SECURITY_WPA_WPA2:
dkato 0:92d12d355ba9 126 _own_sec = security;
dkato 0:92d12d355ba9 127 break;
dkato 0:92d12d355ba9 128 case NSAPI_SECURITY_UNKNOWN:
dkato 0:92d12d355ba9 129 case NSAPI_SECURITY_WEP:
dkato 0:92d12d355ba9 130 default:
dkato 0:92d12d355ba9 131 return NSAPI_ERROR_UNSUPPORTED;
dkato 0:92d12d355ba9 132 }
dkato 0:92d12d355ba9 133
dkato 0:92d12d355ba9 134 memset(_own_ssid, 0, sizeof(_own_ssid));
dkato 0:92d12d355ba9 135 strncpy(_own_ssid, ssid, sizeof(_own_ssid));
dkato 0:92d12d355ba9 136
dkato 0:92d12d355ba9 137 memset(_own_pass, 0, sizeof(_own_pass));
dkato 0:92d12d355ba9 138 strncpy(_own_pass, pass, sizeof(_own_pass));
dkato 0:92d12d355ba9 139
dkato 0:92d12d355ba9 140 return 0;
dkato 0:92d12d355ba9 141 }
dkato 0:92d12d355ba9 142
dkato 0:92d12d355ba9 143 int ESP32InterfaceAP::set_channel(uint8_t channel)
dkato 0:92d12d355ba9 144 {
dkato 0:92d12d355ba9 145 if (channel != 0) {
dkato 0:92d12d355ba9 146 _own_ch = channel;
dkato 0:92d12d355ba9 147 }
dkato 0:92d12d355ba9 148
dkato 0:92d12d355ba9 149 return 0;
dkato 0:92d12d355ba9 150 }
dkato 0:92d12d355ba9 151
dkato 0:92d12d355ba9 152 int ESP32InterfaceAP::disconnect()
dkato 0:92d12d355ba9 153 {
dkato 0:92d12d355ba9 154 if (!_esp->set_mode(ESP32::WIFIMODE_STATION)) {
dkato 0:92d12d355ba9 155 return NSAPI_ERROR_DEVICE_ERROR;
dkato 0:92d12d355ba9 156 }
dkato 0:92d12d355ba9 157
dkato 0:92d12d355ba9 158 _connection_status = NSAPI_STATUS_DISCONNECTED;
dkato 0:92d12d355ba9 159 if (_connection_status_cb) {
dkato 0:92d12d355ba9 160 _connection_status_cb(NSAPI_EVENT_CONNECTION_STATUS_CHANGE, _connection_status);
dkato 0:92d12d355ba9 161 }
dkato 0:92d12d355ba9 162
dkato 0:92d12d355ba9 163 return NSAPI_ERROR_OK;
dkato 0:92d12d355ba9 164 }
dkato 0:92d12d355ba9 165
dkato 0:92d12d355ba9 166 const char *ESP32InterfaceAP::get_ip_address()
dkato 0:92d12d355ba9 167 {
dkato 0:92d12d355ba9 168 return _esp->getIPAddress_ap();
dkato 0:92d12d355ba9 169 }
dkato 0:92d12d355ba9 170
dkato 0:92d12d355ba9 171 const char *ESP32InterfaceAP::get_mac_address()
dkato 0:92d12d355ba9 172 {
dkato 0:92d12d355ba9 173 return _esp->getMACAddress_ap();
dkato 0:92d12d355ba9 174 }
dkato 0:92d12d355ba9 175
dkato 0:92d12d355ba9 176 const char *ESP32InterfaceAP::get_gateway()
dkato 0:92d12d355ba9 177 {
dkato 0:92d12d355ba9 178 return _esp->getGateway_ap();
dkato 0:92d12d355ba9 179 }
dkato 0:92d12d355ba9 180
dkato 0:92d12d355ba9 181 const char *ESP32InterfaceAP::get_netmask()
dkato 0:92d12d355ba9 182 {
dkato 0:92d12d355ba9 183 return _esp->getNetmask_ap();
dkato 0:92d12d355ba9 184 }
dkato 0:92d12d355ba9 185
dkato 0:92d12d355ba9 186 int8_t ESP32InterfaceAP::get_rssi()
dkato 0:92d12d355ba9 187 {
dkato 0:92d12d355ba9 188 return 0;
dkato 0:92d12d355ba9 189 }
dkato 0:92d12d355ba9 190
dkato 0:92d12d355ba9 191 int ESP32InterfaceAP::scan(WiFiAccessPoint *res, unsigned count)
dkato 0:92d12d355ba9 192 {
dkato 0:92d12d355ba9 193 return _esp->scan(res, count);
dkato 0:92d12d355ba9 194 }
dkato 0:92d12d355ba9 195
dkato 0:92d12d355ba9 196 void ESP32InterfaceAP::attach(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb)
dkato 0:92d12d355ba9 197 {
dkato 0:92d12d355ba9 198 _connection_status_cb = status_cb;
dkato 0:92d12d355ba9 199 }
dkato 0:92d12d355ba9 200
dkato 0:92d12d355ba9 201 nsapi_connection_status_t ESP32InterfaceAP::get_connection_status() const
dkato 0:92d12d355ba9 202 {
dkato 0:92d12d355ba9 203 return _connection_status;
dkato 0:92d12d355ba9 204 }
dkato 0:92d12d355ba9 205