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:
Fri Jun 29 06:17:38 2018 +0000
Revision:
0:92d12d355ba9
Child:
1:5d78eedef723
first commit

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 0:92d12d355ba9 21 ESP32InterfaceAP::ESP32InterfaceAP(PinName en, PinName io0, PinName tx, PinName rx, bool debug, int baudrate) :
dkato 0:92d12d355ba9 22 ESP32Stack(en, io0, tx, rx, debug, baudrate),
dkato 0:92d12d355ba9 23 _dhcp(true),
dkato 0:92d12d355ba9 24 _own_ch(1),
dkato 0:92d12d355ba9 25 _own_ssid(),
dkato 0:92d12d355ba9 26 _own_pass(),
dkato 0:92d12d355ba9 27 _own_sec(NSAPI_SECURITY_NONE),
dkato 0:92d12d355ba9 28 _ip_address(),
dkato 0:92d12d355ba9 29 _netmask(),
dkato 0:92d12d355ba9 30 _gateway(),
dkato 0:92d12d355ba9 31 _connection_status(NSAPI_STATUS_DISCONNECTED),
dkato 0:92d12d355ba9 32 _connection_status_cb(NULL)
dkato 0:92d12d355ba9 33 {
dkato 0:92d12d355ba9 34 }
dkato 0:92d12d355ba9 35
dkato 0:92d12d355ba9 36 ESP32InterfaceAP::ESP32InterfaceAP(PinName tx, PinName rx, bool debug, int baudrate) :
dkato 0:92d12d355ba9 37 ESP32Stack(NC, NC, tx, rx, debug, baudrate),
dkato 0:92d12d355ba9 38 _dhcp(true),
dkato 0:92d12d355ba9 39 _own_ch(1),
dkato 0:92d12d355ba9 40 _own_ssid(),
dkato 0:92d12d355ba9 41 _own_pass(),
dkato 0:92d12d355ba9 42 _own_sec(NSAPI_SECURITY_NONE),
dkato 0:92d12d355ba9 43 _ip_address(),
dkato 0:92d12d355ba9 44 _netmask(),
dkato 0:92d12d355ba9 45 _gateway(),
dkato 0:92d12d355ba9 46 _connection_status(NSAPI_STATUS_DISCONNECTED),
dkato 0:92d12d355ba9 47 _connection_status_cb(NULL)
dkato 0:92d12d355ba9 48 {
dkato 0:92d12d355ba9 49 }
dkato 0:92d12d355ba9 50
dkato 0:92d12d355ba9 51 nsapi_error_t ESP32InterfaceAP::set_network(const char *ip_address, const char *netmask, const char *gateway)
dkato 0:92d12d355ba9 52 {
dkato 0:92d12d355ba9 53 _dhcp = false;
dkato 0:92d12d355ba9 54
dkato 0:92d12d355ba9 55 strncpy(_ip_address, ip_address ? ip_address : "", sizeof(_ip_address));
dkato 0:92d12d355ba9 56 _ip_address[sizeof(_ip_address) - 1] = '\0';
dkato 0:92d12d355ba9 57 strncpy(_netmask, netmask ? netmask : "", sizeof(_netmask));
dkato 0:92d12d355ba9 58 _netmask[sizeof(_netmask) - 1] = '\0';
dkato 0:92d12d355ba9 59 strncpy(_gateway, gateway ? gateway : "", sizeof(_gateway));
dkato 0:92d12d355ba9 60 _gateway[sizeof(_gateway) - 1] = '\0';
dkato 0:92d12d355ba9 61
dkato 0:92d12d355ba9 62 return NSAPI_ERROR_OK;
dkato 0:92d12d355ba9 63 }
dkato 0:92d12d355ba9 64
dkato 0:92d12d355ba9 65 nsapi_error_t ESP32InterfaceAP::set_dhcp(bool dhcp)
dkato 0:92d12d355ba9 66 {
dkato 0:92d12d355ba9 67 _dhcp = dhcp;
dkato 0:92d12d355ba9 68
dkato 0:92d12d355ba9 69 return NSAPI_ERROR_OK;
dkato 0:92d12d355ba9 70 }
dkato 0:92d12d355ba9 71
dkato 0:92d12d355ba9 72 int ESP32InterfaceAP::connect(const char *ssid, const char *pass, nsapi_security_t security,
dkato 0:92d12d355ba9 73 uint8_t channel)
dkato 0:92d12d355ba9 74 {
dkato 0:92d12d355ba9 75 int ret;
dkato 0:92d12d355ba9 76
dkato 0:92d12d355ba9 77 ret = set_credentials(ssid, pass, security);
dkato 0:92d12d355ba9 78 if (ret != 0) {
dkato 0:92d12d355ba9 79 return ret;
dkato 0:92d12d355ba9 80 }
dkato 0:92d12d355ba9 81
dkato 0:92d12d355ba9 82 ret = set_channel(channel);
dkato 0:92d12d355ba9 83 if (ret != 0) {
dkato 0:92d12d355ba9 84 return ret;
dkato 0:92d12d355ba9 85 }
dkato 0:92d12d355ba9 86
dkato 0:92d12d355ba9 87 return connect();
dkato 0:92d12d355ba9 88 }
dkato 0:92d12d355ba9 89
dkato 0:92d12d355ba9 90 int ESP32InterfaceAP::connect()
dkato 0:92d12d355ba9 91 {
dkato 0:92d12d355ba9 92 if (!_esp->set_mode(ESP32::WIFIMODE_STATION_SOFTAP)) {
dkato 0:92d12d355ba9 93 return NSAPI_ERROR_DEVICE_ERROR;
dkato 0:92d12d355ba9 94 }
dkato 0:92d12d355ba9 95
dkato 0:92d12d355ba9 96 if (!_esp->dhcp(_dhcp, 1)) {
dkato 0:92d12d355ba9 97 return NSAPI_ERROR_DHCP_FAILURE;
dkato 0:92d12d355ba9 98 }
dkato 0:92d12d355ba9 99
dkato 0:92d12d355ba9 100 if (!_dhcp) {
dkato 0:92d12d355ba9 101 if (!_esp->set_network_ap(_ip_address, _netmask, _gateway)) {
dkato 0:92d12d355ba9 102 return NSAPI_ERROR_DEVICE_ERROR;
dkato 0:92d12d355ba9 103 }
dkato 0:92d12d355ba9 104 }
dkato 0:92d12d355ba9 105
dkato 0:92d12d355ba9 106 if (!_esp->config_soft_ap(_own_ssid, _own_pass, _own_ch, (uint8_t)_own_sec)) {
dkato 0:92d12d355ba9 107 return NSAPI_ERROR_DEVICE_ERROR;
dkato 0:92d12d355ba9 108 }
dkato 0:92d12d355ba9 109
dkato 0:92d12d355ba9 110 _connection_status = NSAPI_STATUS_GLOBAL_UP;
dkato 0:92d12d355ba9 111 if (_connection_status_cb) {
dkato 0:92d12d355ba9 112 _connection_status_cb(NSAPI_EVENT_CONNECTION_STATUS_CHANGE, _connection_status);
dkato 0:92d12d355ba9 113 }
dkato 0:92d12d355ba9 114
dkato 0:92d12d355ba9 115 return NSAPI_ERROR_OK;
dkato 0:92d12d355ba9 116 }
dkato 0:92d12d355ba9 117
dkato 0:92d12d355ba9 118 int ESP32InterfaceAP::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
dkato 0:92d12d355ba9 119 {
dkato 0:92d12d355ba9 120 switch (security) {
dkato 0:92d12d355ba9 121 case NSAPI_SECURITY_NONE:
dkato 0:92d12d355ba9 122 case NSAPI_SECURITY_WPA:
dkato 0:92d12d355ba9 123 case NSAPI_SECURITY_WPA2:
dkato 0:92d12d355ba9 124 case NSAPI_SECURITY_WPA_WPA2:
dkato 0:92d12d355ba9 125 _own_sec = security;
dkato 0:92d12d355ba9 126 break;
dkato 0:92d12d355ba9 127 case NSAPI_SECURITY_UNKNOWN:
dkato 0:92d12d355ba9 128 case NSAPI_SECURITY_WEP:
dkato 0:92d12d355ba9 129 default:
dkato 0:92d12d355ba9 130 return NSAPI_ERROR_UNSUPPORTED;
dkato 0:92d12d355ba9 131 }
dkato 0:92d12d355ba9 132
dkato 0:92d12d355ba9 133 memset(_own_ssid, 0, sizeof(_own_ssid));
dkato 0:92d12d355ba9 134 strncpy(_own_ssid, ssid, sizeof(_own_ssid));
dkato 0:92d12d355ba9 135
dkato 0:92d12d355ba9 136 memset(_own_pass, 0, sizeof(_own_pass));
dkato 0:92d12d355ba9 137 strncpy(_own_pass, pass, sizeof(_own_pass));
dkato 0:92d12d355ba9 138
dkato 0:92d12d355ba9 139 return 0;
dkato 0:92d12d355ba9 140 }
dkato 0:92d12d355ba9 141
dkato 0:92d12d355ba9 142 int ESP32InterfaceAP::set_channel(uint8_t channel)
dkato 0:92d12d355ba9 143 {
dkato 0:92d12d355ba9 144 if (channel != 0) {
dkato 0:92d12d355ba9 145 _own_ch = channel;
dkato 0:92d12d355ba9 146 }
dkato 0:92d12d355ba9 147
dkato 0:92d12d355ba9 148 return 0;
dkato 0:92d12d355ba9 149 }
dkato 0:92d12d355ba9 150
dkato 0:92d12d355ba9 151 int ESP32InterfaceAP::disconnect()
dkato 0:92d12d355ba9 152 {
dkato 0:92d12d355ba9 153 if (!_esp->set_mode(ESP32::WIFIMODE_STATION)) {
dkato 0:92d12d355ba9 154 return NSAPI_ERROR_DEVICE_ERROR;
dkato 0:92d12d355ba9 155 }
dkato 0:92d12d355ba9 156
dkato 0:92d12d355ba9 157 _connection_status = NSAPI_STATUS_DISCONNECTED;
dkato 0:92d12d355ba9 158 if (_connection_status_cb) {
dkato 0:92d12d355ba9 159 _connection_status_cb(NSAPI_EVENT_CONNECTION_STATUS_CHANGE, _connection_status);
dkato 0:92d12d355ba9 160 }
dkato 0:92d12d355ba9 161
dkato 0:92d12d355ba9 162 return NSAPI_ERROR_OK;
dkato 0:92d12d355ba9 163 }
dkato 0:92d12d355ba9 164
dkato 0:92d12d355ba9 165 const char *ESP32InterfaceAP::get_ip_address()
dkato 0:92d12d355ba9 166 {
dkato 0:92d12d355ba9 167 return _esp->getIPAddress_ap();
dkato 0:92d12d355ba9 168 }
dkato 0:92d12d355ba9 169
dkato 0:92d12d355ba9 170 const char *ESP32InterfaceAP::get_mac_address()
dkato 0:92d12d355ba9 171 {
dkato 0:92d12d355ba9 172 return _esp->getMACAddress_ap();
dkato 0:92d12d355ba9 173 }
dkato 0:92d12d355ba9 174
dkato 0:92d12d355ba9 175 const char *ESP32InterfaceAP::get_gateway()
dkato 0:92d12d355ba9 176 {
dkato 0:92d12d355ba9 177 return _esp->getGateway_ap();
dkato 0:92d12d355ba9 178 }
dkato 0:92d12d355ba9 179
dkato 0:92d12d355ba9 180 const char *ESP32InterfaceAP::get_netmask()
dkato 0:92d12d355ba9 181 {
dkato 0:92d12d355ba9 182 return _esp->getNetmask_ap();
dkato 0:92d12d355ba9 183 }
dkato 0:92d12d355ba9 184
dkato 0:92d12d355ba9 185 int8_t ESP32InterfaceAP::get_rssi()
dkato 0:92d12d355ba9 186 {
dkato 0:92d12d355ba9 187 return 0;
dkato 0:92d12d355ba9 188 }
dkato 0:92d12d355ba9 189
dkato 0:92d12d355ba9 190 int ESP32InterfaceAP::scan(WiFiAccessPoint *res, unsigned count)
dkato 0:92d12d355ba9 191 {
dkato 0:92d12d355ba9 192 return _esp->scan(res, count);
dkato 0:92d12d355ba9 193 }
dkato 0:92d12d355ba9 194
dkato 0:92d12d355ba9 195 void ESP32InterfaceAP::attach(mbed::Callback<void(nsapi_event_t, intptr_t)> status_cb)
dkato 0:92d12d355ba9 196 {
dkato 0:92d12d355ba9 197 _connection_status_cb = status_cb;
dkato 0:92d12d355ba9 198 }
dkato 0:92d12d355ba9 199
dkato 0:92d12d355ba9 200 nsapi_connection_status_t ESP32InterfaceAP::get_connection_status() const
dkato 0:92d12d355ba9 201 {
dkato 0:92d12d355ba9 202 return _connection_status;
dkato 0:92d12d355ba9 203 }
dkato 0:92d12d355ba9 204