Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: TYBLE16_simple_data_logger TYBLE16_MP3_Air
components/wifi/esp8266-driver/ESP8266/ESP8266.h@0:5b88d5760320, 2019-12-17 (annotated)
- Committer:
- kenjiArai
- Date:
- Tue Dec 17 23:23:45 2019 +0000
- Revision:
- 0:5b88d5760320
- Child:
- 1:9db0e321a9f4
mbed-os5 only for TYBLE16
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| kenjiArai | 0:5b88d5760320 | 1 | /* ESP8266Interface Example |
| kenjiArai | 0:5b88d5760320 | 2 | * Copyright (c) 2015 ARM Limited |
| kenjiArai | 0:5b88d5760320 | 3 | * |
| kenjiArai | 0:5b88d5760320 | 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| kenjiArai | 0:5b88d5760320 | 5 | * you may not use this file except in compliance with the License. |
| kenjiArai | 0:5b88d5760320 | 6 | * You may obtain a copy of the License at |
| kenjiArai | 0:5b88d5760320 | 7 | * |
| kenjiArai | 0:5b88d5760320 | 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| kenjiArai | 0:5b88d5760320 | 9 | * |
| kenjiArai | 0:5b88d5760320 | 10 | * Unless required by applicable law or agreed to in writing, software |
| kenjiArai | 0:5b88d5760320 | 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| kenjiArai | 0:5b88d5760320 | 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| kenjiArai | 0:5b88d5760320 | 13 | * See the License for the specific language governing permissions and |
| kenjiArai | 0:5b88d5760320 | 14 | * limitations under the License. |
| kenjiArai | 0:5b88d5760320 | 15 | */ |
| kenjiArai | 0:5b88d5760320 | 16 | |
| kenjiArai | 0:5b88d5760320 | 17 | #ifndef ESP8266_H |
| kenjiArai | 0:5b88d5760320 | 18 | #define ESP8266_H |
| kenjiArai | 0:5b88d5760320 | 19 | |
| kenjiArai | 0:5b88d5760320 | 20 | #if DEVICE_SERIAL && DEVICE_INTERRUPTIN && defined(MBED_CONF_EVENTS_PRESENT) && defined(MBED_CONF_NSAPI_PRESENT) && defined(MBED_CONF_RTOS_PRESENT) |
| kenjiArai | 0:5b88d5760320 | 21 | #include <stdint.h> |
| kenjiArai | 0:5b88d5760320 | 22 | |
| kenjiArai | 0:5b88d5760320 | 23 | #include "drivers/UARTSerial.h" |
| kenjiArai | 0:5b88d5760320 | 24 | #include "features/netsocket/nsapi_types.h" |
| kenjiArai | 0:5b88d5760320 | 25 | #include "features/netsocket/WiFiAccessPoint.h" |
| kenjiArai | 0:5b88d5760320 | 26 | #include "PinNames.h" |
| kenjiArai | 0:5b88d5760320 | 27 | #include "platform/ATCmdParser.h" |
| kenjiArai | 0:5b88d5760320 | 28 | #include "platform/Callback.h" |
| kenjiArai | 0:5b88d5760320 | 29 | #include "platform/mbed_error.h" |
| kenjiArai | 0:5b88d5760320 | 30 | #include "rtos/ConditionVariable.h" |
| kenjiArai | 0:5b88d5760320 | 31 | #include "rtos/Mutex.h" |
| kenjiArai | 0:5b88d5760320 | 32 | |
| kenjiArai | 0:5b88d5760320 | 33 | // Various timeouts for different ESP8266 operations |
| kenjiArai | 0:5b88d5760320 | 34 | #ifndef ESP8266_CONNECT_TIMEOUT |
| kenjiArai | 0:5b88d5760320 | 35 | #define ESP8266_CONNECT_TIMEOUT 15000 |
| kenjiArai | 0:5b88d5760320 | 36 | #endif |
| kenjiArai | 0:5b88d5760320 | 37 | #ifndef ESP8266_SEND_TIMEOUT |
| kenjiArai | 0:5b88d5760320 | 38 | #define ESP8266_SEND_TIMEOUT 2000 |
| kenjiArai | 0:5b88d5760320 | 39 | #endif |
| kenjiArai | 0:5b88d5760320 | 40 | #ifndef ESP8266_RECV_TIMEOUT |
| kenjiArai | 0:5b88d5760320 | 41 | #define ESP8266_RECV_TIMEOUT 2000 |
| kenjiArai | 0:5b88d5760320 | 42 | #endif |
| kenjiArai | 0:5b88d5760320 | 43 | #ifndef ESP8266_MISC_TIMEOUT |
| kenjiArai | 0:5b88d5760320 | 44 | #define ESP8266_MISC_TIMEOUT 2000 |
| kenjiArai | 0:5b88d5760320 | 45 | #endif |
| kenjiArai | 0:5b88d5760320 | 46 | |
| kenjiArai | 0:5b88d5760320 | 47 | #define ESP8266_SCAN_TIME_MIN 0 // [ms] |
| kenjiArai | 0:5b88d5760320 | 48 | #define ESP8266_SCAN_TIME_MAX 1500 // [ms] |
| kenjiArai | 0:5b88d5760320 | 49 | #define ESP8266_SCAN_TIME_MIN_DEFAULT 120 // [ms] |
| kenjiArai | 0:5b88d5760320 | 50 | #define ESP8266_SCAN_TIME_MAX_DEFAULT 360 // [ms] |
| kenjiArai | 0:5b88d5760320 | 51 | |
| kenjiArai | 0:5b88d5760320 | 52 | // Firmware version |
| kenjiArai | 0:5b88d5760320 | 53 | #define ESP8266_SDK_VERSION 2000000 |
| kenjiArai | 0:5b88d5760320 | 54 | #define ESP8266_SDK_VERSION_MAJOR ESP8266_SDK_VERSION/1000000 |
| kenjiArai | 0:5b88d5760320 | 55 | |
| kenjiArai | 0:5b88d5760320 | 56 | #define ESP8266_AT_VERSION 1000000 |
| kenjiArai | 0:5b88d5760320 | 57 | #define ESP8266_AT_VERSION_MAJOR ESP8266_AT_VERSION/1000000 |
| kenjiArai | 0:5b88d5760320 | 58 | #define ESP8266_AT_VERSION_TCP_PASSIVE_MODE 1070000 |
| kenjiArai | 0:5b88d5760320 | 59 | #define ESP8266_AT_VERSION_WIFI_SCAN_CHANGE 1060000 |
| kenjiArai | 0:5b88d5760320 | 60 | |
| kenjiArai | 0:5b88d5760320 | 61 | #define FW_AT_LEAST_VERSION(MAJOR,MINOR,PATCH,NUSED/*Not used*/,REF) \ |
| kenjiArai | 0:5b88d5760320 | 62 | (((MAJOR)*1000000+(MINOR)*10000+(PATCH)*100) >= REF ? true : false) |
| kenjiArai | 0:5b88d5760320 | 63 | |
| kenjiArai | 0:5b88d5760320 | 64 | /** ESP8266Interface class. |
| kenjiArai | 0:5b88d5760320 | 65 | This is an interface to a ESP8266 radio. |
| kenjiArai | 0:5b88d5760320 | 66 | */ |
| kenjiArai | 0:5b88d5760320 | 67 | class ESP8266 { |
| kenjiArai | 0:5b88d5760320 | 68 | public: |
| kenjiArai | 0:5b88d5760320 | 69 | ESP8266(PinName tx, PinName rx, bool debug = false, PinName rts = NC, PinName cts = NC); |
| kenjiArai | 0:5b88d5760320 | 70 | |
| kenjiArai | 0:5b88d5760320 | 71 | /** |
| kenjiArai | 0:5b88d5760320 | 72 | * ESP8266 firmware SDK version |
| kenjiArai | 0:5b88d5760320 | 73 | * |
| kenjiArai | 0:5b88d5760320 | 74 | * @param major Major version number |
| kenjiArai | 0:5b88d5760320 | 75 | * @param minor Minor version number |
| kenjiArai | 0:5b88d5760320 | 76 | * @param patch Patch version number |
| kenjiArai | 0:5b88d5760320 | 77 | */ |
| kenjiArai | 0:5b88d5760320 | 78 | struct fw_sdk_version { |
| kenjiArai | 0:5b88d5760320 | 79 | int major; |
| kenjiArai | 0:5b88d5760320 | 80 | int minor; |
| kenjiArai | 0:5b88d5760320 | 81 | int patch; |
| kenjiArai | 0:5b88d5760320 | 82 | fw_sdk_version(int major, int minor, int patch) : major(major), minor(minor), patch(patch) {} |
| kenjiArai | 0:5b88d5760320 | 83 | }; |
| kenjiArai | 0:5b88d5760320 | 84 | |
| kenjiArai | 0:5b88d5760320 | 85 | /** |
| kenjiArai | 0:5b88d5760320 | 86 | * ESP8266 firmware AT version |
| kenjiArai | 0:5b88d5760320 | 87 | * |
| kenjiArai | 0:5b88d5760320 | 88 | * @param major Major version number |
| kenjiArai | 0:5b88d5760320 | 89 | * @param minor Minor version number |
| kenjiArai | 0:5b88d5760320 | 90 | * @param patch Patch version number |
| kenjiArai | 0:5b88d5760320 | 91 | */ |
| kenjiArai | 0:5b88d5760320 | 92 | struct fw_at_version { |
| kenjiArai | 0:5b88d5760320 | 93 | int major; |
| kenjiArai | 0:5b88d5760320 | 94 | int minor; |
| kenjiArai | 0:5b88d5760320 | 95 | int patch; |
| kenjiArai | 0:5b88d5760320 | 96 | fw_at_version(int major, int minor, int patch) : major(major), minor(minor), patch(patch) {} |
| kenjiArai | 0:5b88d5760320 | 97 | }; |
| kenjiArai | 0:5b88d5760320 | 98 | |
| kenjiArai | 0:5b88d5760320 | 99 | /** |
| kenjiArai | 0:5b88d5760320 | 100 | * Check AT command interface of ESP8266 |
| kenjiArai | 0:5b88d5760320 | 101 | * |
| kenjiArai | 0:5b88d5760320 | 102 | * @return true if ready to respond on AT commands |
| kenjiArai | 0:5b88d5760320 | 103 | */ |
| kenjiArai | 0:5b88d5760320 | 104 | bool at_available(void); |
| kenjiArai | 0:5b88d5760320 | 105 | |
| kenjiArai | 0:5b88d5760320 | 106 | /** |
| kenjiArai | 0:5b88d5760320 | 107 | * Disable echo - required for OOB processing to work |
| kenjiArai | 0:5b88d5760320 | 108 | * |
| kenjiArai | 0:5b88d5760320 | 109 | * @return true if echo was successfully disabled |
| kenjiArai | 0:5b88d5760320 | 110 | */ |
| kenjiArai | 0:5b88d5760320 | 111 | bool echo_off(void); |
| kenjiArai | 0:5b88d5760320 | 112 | |
| kenjiArai | 0:5b88d5760320 | 113 | /** |
| kenjiArai | 0:5b88d5760320 | 114 | * Check sdk version from which firmware is created |
| kenjiArai | 0:5b88d5760320 | 115 | * |
| kenjiArai | 0:5b88d5760320 | 116 | * @return fw_sdk_version which tells major, minor and patch version |
| kenjiArai | 0:5b88d5760320 | 117 | */ |
| kenjiArai | 0:5b88d5760320 | 118 | struct fw_sdk_version sdk_version(void); |
| kenjiArai | 0:5b88d5760320 | 119 | |
| kenjiArai | 0:5b88d5760320 | 120 | /** |
| kenjiArai | 0:5b88d5760320 | 121 | * Check AT instruction set version from which firmware is created |
| kenjiArai | 0:5b88d5760320 | 122 | * |
| kenjiArai | 0:5b88d5760320 | 123 | * @return fw_at_version which tells major, minor and patch version |
| kenjiArai | 0:5b88d5760320 | 124 | */ |
| kenjiArai | 0:5b88d5760320 | 125 | struct fw_at_version at_version(void); |
| kenjiArai | 0:5b88d5760320 | 126 | |
| kenjiArai | 0:5b88d5760320 | 127 | /** |
| kenjiArai | 0:5b88d5760320 | 128 | * Startup the ESP8266 |
| kenjiArai | 0:5b88d5760320 | 129 | * |
| kenjiArai | 0:5b88d5760320 | 130 | * @param mode mode of WIFI 1-client, 2-host, 3-both |
| kenjiArai | 0:5b88d5760320 | 131 | * @return true only if ESP8266 was setup correctly |
| kenjiArai | 0:5b88d5760320 | 132 | */ |
| kenjiArai | 0:5b88d5760320 | 133 | bool startup(int mode); |
| kenjiArai | 0:5b88d5760320 | 134 | |
| kenjiArai | 0:5b88d5760320 | 135 | /** |
| kenjiArai | 0:5b88d5760320 | 136 | * Reset ESP8266 |
| kenjiArai | 0:5b88d5760320 | 137 | * |
| kenjiArai | 0:5b88d5760320 | 138 | * @return true only if ESP8266 resets successfully |
| kenjiArai | 0:5b88d5760320 | 139 | */ |
| kenjiArai | 0:5b88d5760320 | 140 | bool reset(void); |
| kenjiArai | 0:5b88d5760320 | 141 | |
| kenjiArai | 0:5b88d5760320 | 142 | /** |
| kenjiArai | 0:5b88d5760320 | 143 | * Enable/Disable DHCP |
| kenjiArai | 0:5b88d5760320 | 144 | * |
| kenjiArai | 0:5b88d5760320 | 145 | * @param enabled DHCP enabled when true |
| kenjiArai | 0:5b88d5760320 | 146 | * @param mode mode of DHCP 0-softAP, 1-station, 2-both |
| kenjiArai | 0:5b88d5760320 | 147 | * @return true only if ESP8266 enables/disables DHCP successfully |
| kenjiArai | 0:5b88d5760320 | 148 | */ |
| kenjiArai | 0:5b88d5760320 | 149 | bool dhcp(bool enabled, int mode); |
| kenjiArai | 0:5b88d5760320 | 150 | |
| kenjiArai | 0:5b88d5760320 | 151 | /** |
| kenjiArai | 0:5b88d5760320 | 152 | * Connect ESP8266 to AP |
| kenjiArai | 0:5b88d5760320 | 153 | * |
| kenjiArai | 0:5b88d5760320 | 154 | * @param ap the name of the AP |
| kenjiArai | 0:5b88d5760320 | 155 | * @param passPhrase the password of AP |
| kenjiArai | 0:5b88d5760320 | 156 | * @return NSAPI_ERROR_OK in success, negative error code in failure |
| kenjiArai | 0:5b88d5760320 | 157 | */ |
| kenjiArai | 0:5b88d5760320 | 158 | nsapi_error_t connect(const char *ap, const char *passPhrase); |
| kenjiArai | 0:5b88d5760320 | 159 | |
| kenjiArai | 0:5b88d5760320 | 160 | /** |
| kenjiArai | 0:5b88d5760320 | 161 | * Disconnect ESP8266 from AP |
| kenjiArai | 0:5b88d5760320 | 162 | * |
| kenjiArai | 0:5b88d5760320 | 163 | * @return true only if ESP8266 is disconnected successfully |
| kenjiArai | 0:5b88d5760320 | 164 | */ |
| kenjiArai | 0:5b88d5760320 | 165 | bool disconnect(void); |
| kenjiArai | 0:5b88d5760320 | 166 | |
| kenjiArai | 0:5b88d5760320 | 167 | /** |
| kenjiArai | 0:5b88d5760320 | 168 | * Get the IP address of ESP8266 |
| kenjiArai | 0:5b88d5760320 | 169 | * |
| kenjiArai | 0:5b88d5760320 | 170 | * @return null-teriminated IP address or null if no IP address is assigned |
| kenjiArai | 0:5b88d5760320 | 171 | */ |
| kenjiArai | 0:5b88d5760320 | 172 | const char *ip_addr(void); |
| kenjiArai | 0:5b88d5760320 | 173 | |
| kenjiArai | 0:5b88d5760320 | 174 | /** |
| kenjiArai | 0:5b88d5760320 | 175 | * Get the MAC address of ESP8266 |
| kenjiArai | 0:5b88d5760320 | 176 | * |
| kenjiArai | 0:5b88d5760320 | 177 | * @return null-terminated MAC address or null if no MAC address is assigned |
| kenjiArai | 0:5b88d5760320 | 178 | */ |
| kenjiArai | 0:5b88d5760320 | 179 | const char *mac_addr(void); |
| kenjiArai | 0:5b88d5760320 | 180 | |
| kenjiArai | 0:5b88d5760320 | 181 | /** Get the local gateway |
| kenjiArai | 0:5b88d5760320 | 182 | * |
| kenjiArai | 0:5b88d5760320 | 183 | * @return Null-terminated representation of the local gateway |
| kenjiArai | 0:5b88d5760320 | 184 | * or null if no network mask has been recieved |
| kenjiArai | 0:5b88d5760320 | 185 | */ |
| kenjiArai | 0:5b88d5760320 | 186 | const char *gateway(); |
| kenjiArai | 0:5b88d5760320 | 187 | |
| kenjiArai | 0:5b88d5760320 | 188 | /** Get the local network mask |
| kenjiArai | 0:5b88d5760320 | 189 | * |
| kenjiArai | 0:5b88d5760320 | 190 | * @return Null-terminated representation of the local network mask |
| kenjiArai | 0:5b88d5760320 | 191 | * or null if no network mask has been recieved |
| kenjiArai | 0:5b88d5760320 | 192 | */ |
| kenjiArai | 0:5b88d5760320 | 193 | const char *netmask(); |
| kenjiArai | 0:5b88d5760320 | 194 | |
| kenjiArai | 0:5b88d5760320 | 195 | /* Return RSSI for active connection |
| kenjiArai | 0:5b88d5760320 | 196 | * |
| kenjiArai | 0:5b88d5760320 | 197 | * @return Measured RSSI |
| kenjiArai | 0:5b88d5760320 | 198 | */ |
| kenjiArai | 0:5b88d5760320 | 199 | int8_t rssi(); |
| kenjiArai | 0:5b88d5760320 | 200 | |
| kenjiArai | 0:5b88d5760320 | 201 | /** Scan mode |
| kenjiArai | 0:5b88d5760320 | 202 | */ |
| kenjiArai | 0:5b88d5760320 | 203 | enum scan_mode { |
| kenjiArai | 0:5b88d5760320 | 204 | SCANMODE_ACTIVE = 0, /*!< active mode */ |
| kenjiArai | 0:5b88d5760320 | 205 | SCANMODE_PASSIVE = 1 /*!< passive mode */ |
| kenjiArai | 0:5b88d5760320 | 206 | }; |
| kenjiArai | 0:5b88d5760320 | 207 | |
| kenjiArai | 0:5b88d5760320 | 208 | /** Scan for available networks |
| kenjiArai | 0:5b88d5760320 | 209 | * |
| kenjiArai | 0:5b88d5760320 | 210 | * @param ap Pointer to allocated array to store discovered AP |
| kenjiArai | 0:5b88d5760320 | 211 | * @param limit Size of allocated @a res array, or 0 to only count available AP |
| kenjiArai | 0:5b88d5760320 | 212 | * @param t_max Maximum scan time per channel |
| kenjiArai | 0:5b88d5760320 | 213 | * @param t_min Minimum scan time per channel in active mode, can be omitted in passive mode |
| kenjiArai | 0:5b88d5760320 | 214 | * @return Number of entries in @a res, or if @a count was 0 number of available networks, negative on error |
| kenjiArai | 0:5b88d5760320 | 215 | * see @a nsapi_error |
| kenjiArai | 0:5b88d5760320 | 216 | */ |
| kenjiArai | 0:5b88d5760320 | 217 | int scan(WiFiAccessPoint *res, unsigned limit, scan_mode mode, unsigned t_max, unsigned t_min); |
| kenjiArai | 0:5b88d5760320 | 218 | |
| kenjiArai | 0:5b88d5760320 | 219 | /**Perform a dns query |
| kenjiArai | 0:5b88d5760320 | 220 | * |
| kenjiArai | 0:5b88d5760320 | 221 | * @param name Hostname to resolve |
| kenjiArai | 0:5b88d5760320 | 222 | * @param ip Buffer to store IP address |
| kenjiArai | 0:5b88d5760320 | 223 | * @return 0 true on success, false on failure |
| kenjiArai | 0:5b88d5760320 | 224 | */ |
| kenjiArai | 0:5b88d5760320 | 225 | bool dns_lookup(const char *name, char *ip); |
| kenjiArai | 0:5b88d5760320 | 226 | |
| kenjiArai | 0:5b88d5760320 | 227 | /** |
| kenjiArai | 0:5b88d5760320 | 228 | * Open a socketed connection |
| kenjiArai | 0:5b88d5760320 | 229 | * |
| kenjiArai | 0:5b88d5760320 | 230 | * @param type the type of socket to open "UDP" or "TCP" |
| kenjiArai | 0:5b88d5760320 | 231 | * @param id id to give the new socket, valid 0-4 |
| kenjiArai | 0:5b88d5760320 | 232 | * @param port port to open connection with |
| kenjiArai | 0:5b88d5760320 | 233 | * @param addr the IP address of the destination |
| kenjiArai | 0:5b88d5760320 | 234 | * @param port the port on the destination |
| kenjiArai | 0:5b88d5760320 | 235 | * @param local_port UDP socket's local port, zero means any |
| kenjiArai | 0:5b88d5760320 | 236 | * @return NSAPI_ERROR_OK in success, negative error code in failure |
| kenjiArai | 0:5b88d5760320 | 237 | */ |
| kenjiArai | 0:5b88d5760320 | 238 | nsapi_error_t open_udp(int id, const char *addr, int port, int local_port = 0); |
| kenjiArai | 0:5b88d5760320 | 239 | |
| kenjiArai | 0:5b88d5760320 | 240 | /** |
| kenjiArai | 0:5b88d5760320 | 241 | * Open a socketed connection |
| kenjiArai | 0:5b88d5760320 | 242 | * |
| kenjiArai | 0:5b88d5760320 | 243 | * @param type the type of socket to open "UDP" or "TCP" |
| kenjiArai | 0:5b88d5760320 | 244 | * @param id id to give the new socket, valid 0-4 |
| kenjiArai | 0:5b88d5760320 | 245 | * @param port port to open connection with |
| kenjiArai | 0:5b88d5760320 | 246 | * @param addr the IP address of the destination |
| kenjiArai | 0:5b88d5760320 | 247 | * @param port the port on the destination |
| kenjiArai | 0:5b88d5760320 | 248 | * @param tcp_keepalive TCP connection's keep alive time, zero means disabled |
| kenjiArai | 0:5b88d5760320 | 249 | * @return NSAPI_ERROR_OK in success, negative error code in failure |
| kenjiArai | 0:5b88d5760320 | 250 | */ |
| kenjiArai | 0:5b88d5760320 | 251 | nsapi_error_t open_tcp(int id, const char *addr, int port, int keepalive = 0); |
| kenjiArai | 0:5b88d5760320 | 252 | |
| kenjiArai | 0:5b88d5760320 | 253 | /** |
| kenjiArai | 0:5b88d5760320 | 254 | * Sends data to an open socket |
| kenjiArai | 0:5b88d5760320 | 255 | * |
| kenjiArai | 0:5b88d5760320 | 256 | * @param id id of socket to send to |
| kenjiArai | 0:5b88d5760320 | 257 | * @param data data to be sent |
| kenjiArai | 0:5b88d5760320 | 258 | * @param amount amount of data to be sent - max 1024 |
| kenjiArai | 0:5b88d5760320 | 259 | * @return NSAPI_ERROR_OK in success, negative error code in failure |
| kenjiArai | 0:5b88d5760320 | 260 | */ |
| kenjiArai | 0:5b88d5760320 | 261 | nsapi_error_t send(int id, const void *data, uint32_t amount); |
| kenjiArai | 0:5b88d5760320 | 262 | |
| kenjiArai | 0:5b88d5760320 | 263 | /** |
| kenjiArai | 0:5b88d5760320 | 264 | * Receives datagram from an open UDP socket |
| kenjiArai | 0:5b88d5760320 | 265 | * |
| kenjiArai | 0:5b88d5760320 | 266 | * @param id id to receive from |
| kenjiArai | 0:5b88d5760320 | 267 | * @param data placeholder for returned information |
| kenjiArai | 0:5b88d5760320 | 268 | * @param amount number of bytes to be received |
| kenjiArai | 0:5b88d5760320 | 269 | * @return the number of bytes received |
| kenjiArai | 0:5b88d5760320 | 270 | */ |
| kenjiArai | 0:5b88d5760320 | 271 | int32_t recv_udp(int id, void *data, uint32_t amount, uint32_t timeout = ESP8266_RECV_TIMEOUT); |
| kenjiArai | 0:5b88d5760320 | 272 | |
| kenjiArai | 0:5b88d5760320 | 273 | /** |
| kenjiArai | 0:5b88d5760320 | 274 | * Receives stream data from an open TCP socket |
| kenjiArai | 0:5b88d5760320 | 275 | * |
| kenjiArai | 0:5b88d5760320 | 276 | * @param id id to receive from |
| kenjiArai | 0:5b88d5760320 | 277 | * @param data placeholder for returned information |
| kenjiArai | 0:5b88d5760320 | 278 | * @param amount number of bytes to be received |
| kenjiArai | 0:5b88d5760320 | 279 | * @return the number of bytes received |
| kenjiArai | 0:5b88d5760320 | 280 | */ |
| kenjiArai | 0:5b88d5760320 | 281 | int32_t recv_tcp(int id, void *data, uint32_t amount, uint32_t timeout = ESP8266_RECV_TIMEOUT); |
| kenjiArai | 0:5b88d5760320 | 282 | |
| kenjiArai | 0:5b88d5760320 | 283 | /** |
| kenjiArai | 0:5b88d5760320 | 284 | * Closes a socket |
| kenjiArai | 0:5b88d5760320 | 285 | * |
| kenjiArai | 0:5b88d5760320 | 286 | * @param id id of socket to close, valid only 0-4 |
| kenjiArai | 0:5b88d5760320 | 287 | * @return true only if socket is closed successfully |
| kenjiArai | 0:5b88d5760320 | 288 | */ |
| kenjiArai | 0:5b88d5760320 | 289 | bool close(int id); |
| kenjiArai | 0:5b88d5760320 | 290 | |
| kenjiArai | 0:5b88d5760320 | 291 | /** |
| kenjiArai | 0:5b88d5760320 | 292 | * Allows timeout to be changed between commands |
| kenjiArai | 0:5b88d5760320 | 293 | * |
| kenjiArai | 0:5b88d5760320 | 294 | * @param timeout_ms timeout of the connection |
| kenjiArai | 0:5b88d5760320 | 295 | */ |
| kenjiArai | 0:5b88d5760320 | 296 | void set_timeout(uint32_t timeout_ms = ESP8266_MISC_TIMEOUT); |
| kenjiArai | 0:5b88d5760320 | 297 | |
| kenjiArai | 0:5b88d5760320 | 298 | /** |
| kenjiArai | 0:5b88d5760320 | 299 | * Checks if data is available |
| kenjiArai | 0:5b88d5760320 | 300 | */ |
| kenjiArai | 0:5b88d5760320 | 301 | bool readable(); |
| kenjiArai | 0:5b88d5760320 | 302 | |
| kenjiArai | 0:5b88d5760320 | 303 | /** |
| kenjiArai | 0:5b88d5760320 | 304 | * Checks if data can be written |
| kenjiArai | 0:5b88d5760320 | 305 | */ |
| kenjiArai | 0:5b88d5760320 | 306 | bool writeable(); |
| kenjiArai | 0:5b88d5760320 | 307 | |
| kenjiArai | 0:5b88d5760320 | 308 | /** |
| kenjiArai | 0:5b88d5760320 | 309 | * Attach a function to call whenever sigio happens in the serial |
| kenjiArai | 0:5b88d5760320 | 310 | * |
| kenjiArai | 0:5b88d5760320 | 311 | * @param func A pointer to a void function, or 0 to set as none |
| kenjiArai | 0:5b88d5760320 | 312 | */ |
| kenjiArai | 0:5b88d5760320 | 313 | void sigio(mbed::Callback<void()> func); |
| kenjiArai | 0:5b88d5760320 | 314 | |
| kenjiArai | 0:5b88d5760320 | 315 | /** |
| kenjiArai | 0:5b88d5760320 | 316 | * Attach a function to call whenever sigio happens in the serial |
| kenjiArai | 0:5b88d5760320 | 317 | * |
| kenjiArai | 0:5b88d5760320 | 318 | * @param obj pointer to the object to call the member function on |
| kenjiArai | 0:5b88d5760320 | 319 | * @param method pointer to the member function to call |
| kenjiArai | 0:5b88d5760320 | 320 | */ |
| kenjiArai | 0:5b88d5760320 | 321 | template <typename T, typename M> |
| kenjiArai | 0:5b88d5760320 | 322 | void sigio(T *obj, M method) |
| kenjiArai | 0:5b88d5760320 | 323 | { |
| kenjiArai | 0:5b88d5760320 | 324 | sigio(mbed::Callback<void()>(obj, method)); |
| kenjiArai | 0:5b88d5760320 | 325 | } |
| kenjiArai | 0:5b88d5760320 | 326 | |
| kenjiArai | 0:5b88d5760320 | 327 | /** |
| kenjiArai | 0:5b88d5760320 | 328 | * Attach a function to call whenever network state has changed. |
| kenjiArai | 0:5b88d5760320 | 329 | * |
| kenjiArai | 0:5b88d5760320 | 330 | * @param func A pointer to a void function, or 0 to set as none |
| kenjiArai | 0:5b88d5760320 | 331 | */ |
| kenjiArai | 0:5b88d5760320 | 332 | void attach(mbed::Callback<void()> status_cb); |
| kenjiArai | 0:5b88d5760320 | 333 | |
| kenjiArai | 0:5b88d5760320 | 334 | template <typename T, typename M> |
| kenjiArai | 0:5b88d5760320 | 335 | void attach(T *obj, M method) |
| kenjiArai | 0:5b88d5760320 | 336 | { |
| kenjiArai | 0:5b88d5760320 | 337 | attach(mbed::Callback<void()>(obj, method)); |
| kenjiArai | 0:5b88d5760320 | 338 | } |
| kenjiArai | 0:5b88d5760320 | 339 | |
| kenjiArai | 0:5b88d5760320 | 340 | /** |
| kenjiArai | 0:5b88d5760320 | 341 | * Read default Wifi mode from flash |
| kenjiArai | 0:5b88d5760320 | 342 | * |
| kenjiArai | 0:5b88d5760320 | 343 | * return Station, SoftAP or SoftAP+Station - 0 on failure |
| kenjiArai | 0:5b88d5760320 | 344 | */ |
| kenjiArai | 0:5b88d5760320 | 345 | int8_t default_wifi_mode(); |
| kenjiArai | 0:5b88d5760320 | 346 | |
| kenjiArai | 0:5b88d5760320 | 347 | /** |
| kenjiArai | 0:5b88d5760320 | 348 | * Default Wifi mode written to flash only if changes |
| kenjiArai | 0:5b88d5760320 | 349 | */ |
| kenjiArai | 0:5b88d5760320 | 350 | bool set_default_wifi_mode(const int8_t mode); |
| kenjiArai | 0:5b88d5760320 | 351 | |
| kenjiArai | 0:5b88d5760320 | 352 | /** |
| kenjiArai | 0:5b88d5760320 | 353 | * @param track_ap if TRUE, sets the county code to be the same as the AP's that ESP is connected to, |
| kenjiArai | 0:5b88d5760320 | 354 | * if FALSE the code will not change |
| kenjiArai | 0:5b88d5760320 | 355 | * @param country_code ISO 3166-1 Alpha-2 coded country code |
| kenjiArai | 0:5b88d5760320 | 356 | * @param channel_start the channel number to start at |
| kenjiArai | 0:5b88d5760320 | 357 | * @param channels number of channels |
| kenjiArai | 0:5b88d5760320 | 358 | */ |
| kenjiArai | 0:5b88d5760320 | 359 | bool set_country_code_policy(bool track_ap, const char *country_code, int channel_start, int channels); |
| kenjiArai | 0:5b88d5760320 | 360 | |
| kenjiArai | 0:5b88d5760320 | 361 | /** Get the connection status |
| kenjiArai | 0:5b88d5760320 | 362 | * |
| kenjiArai | 0:5b88d5760320 | 363 | * @return The connection status according to ConnectionStatusType |
| kenjiArai | 0:5b88d5760320 | 364 | */ |
| kenjiArai | 0:5b88d5760320 | 365 | nsapi_connection_status_t connection_status() const; |
| kenjiArai | 0:5b88d5760320 | 366 | |
| kenjiArai | 0:5b88d5760320 | 367 | /** |
| kenjiArai | 0:5b88d5760320 | 368 | * Start board's and ESP8266's UART flow control |
| kenjiArai | 0:5b88d5760320 | 369 | * |
| kenjiArai | 0:5b88d5760320 | 370 | * @return true if started |
| kenjiArai | 0:5b88d5760320 | 371 | */ |
| kenjiArai | 0:5b88d5760320 | 372 | bool start_uart_hw_flow_ctrl(); |
| kenjiArai | 0:5b88d5760320 | 373 | |
| kenjiArai | 0:5b88d5760320 | 374 | /** |
| kenjiArai | 0:5b88d5760320 | 375 | * Stop board's and ESP8266's UART flow control |
| kenjiArai | 0:5b88d5760320 | 376 | * |
| kenjiArai | 0:5b88d5760320 | 377 | * @return true if started |
| kenjiArai | 0:5b88d5760320 | 378 | */ |
| kenjiArai | 0:5b88d5760320 | 379 | bool stop_uart_hw_flow_ctrl(); |
| kenjiArai | 0:5b88d5760320 | 380 | |
| kenjiArai | 0:5b88d5760320 | 381 | /* |
| kenjiArai | 0:5b88d5760320 | 382 | * From AT firmware v1.7.0.0 onwards enables TCP passive mode |
| kenjiArai | 0:5b88d5760320 | 383 | */ |
| kenjiArai | 0:5b88d5760320 | 384 | bool cond_enable_tcp_passive_mode(); |
| kenjiArai | 0:5b88d5760320 | 385 | |
| kenjiArai | 0:5b88d5760320 | 386 | /** |
| kenjiArai | 0:5b88d5760320 | 387 | * For executing OOB processing on background |
| kenjiArai | 0:5b88d5760320 | 388 | * |
| kenjiArai | 0:5b88d5760320 | 389 | * @param timeout AT parser receive timeout |
| kenjiArai | 0:5b88d5760320 | 390 | * @param if TRUE, process all OOBs instead of only one |
| kenjiArai | 0:5b88d5760320 | 391 | */ |
| kenjiArai | 0:5b88d5760320 | 392 | void bg_process_oob(uint32_t timeout, bool all); |
| kenjiArai | 0:5b88d5760320 | 393 | |
| kenjiArai | 0:5b88d5760320 | 394 | /** |
| kenjiArai | 0:5b88d5760320 | 395 | * Flush the serial port input buffers. |
| kenjiArai | 0:5b88d5760320 | 396 | * |
| kenjiArai | 0:5b88d5760320 | 397 | * If you do HW reset for ESP module, you should |
| kenjiArai | 0:5b88d5760320 | 398 | * flush the input buffers from existing responses |
| kenjiArai | 0:5b88d5760320 | 399 | * from the device. |
| kenjiArai | 0:5b88d5760320 | 400 | */ |
| kenjiArai | 0:5b88d5760320 | 401 | void flush(); |
| kenjiArai | 0:5b88d5760320 | 402 | |
| kenjiArai | 0:5b88d5760320 | 403 | static const int8_t WIFIMODE_STATION = 1; |
| kenjiArai | 0:5b88d5760320 | 404 | static const int8_t WIFIMODE_SOFTAP = 2; |
| kenjiArai | 0:5b88d5760320 | 405 | static const int8_t WIFIMODE_STATION_SOFTAP = 3; |
| kenjiArai | 0:5b88d5760320 | 406 | static const int8_t SOCKET_COUNT = 5; |
| kenjiArai | 0:5b88d5760320 | 407 | |
| kenjiArai | 0:5b88d5760320 | 408 | private: |
| kenjiArai | 0:5b88d5760320 | 409 | // FW version |
| kenjiArai | 0:5b88d5760320 | 410 | struct fw_sdk_version _sdk_v; |
| kenjiArai | 0:5b88d5760320 | 411 | struct fw_at_version _at_v; |
| kenjiArai | 0:5b88d5760320 | 412 | |
| kenjiArai | 0:5b88d5760320 | 413 | // FW version specific settings and functionalities |
| kenjiArai | 0:5b88d5760320 | 414 | bool _tcp_passive; |
| kenjiArai | 0:5b88d5760320 | 415 | int32_t _recv_tcp_passive(int id, void *data, uint32_t amount, uint32_t timeout); |
| kenjiArai | 0:5b88d5760320 | 416 | mbed::Callback<void()> _callback; |
| kenjiArai | 0:5b88d5760320 | 417 | |
| kenjiArai | 0:5b88d5760320 | 418 | // UART settings |
| kenjiArai | 0:5b88d5760320 | 419 | mbed::UARTSerial _serial; |
| kenjiArai | 0:5b88d5760320 | 420 | PinName _serial_rts; |
| kenjiArai | 0:5b88d5760320 | 421 | PinName _serial_cts; |
| kenjiArai | 0:5b88d5760320 | 422 | rtos::Mutex _smutex; // Protect serial port access |
| kenjiArai | 0:5b88d5760320 | 423 | rtos::Mutex _rmutex; // Reset protection |
| kenjiArai | 0:5b88d5760320 | 424 | |
| kenjiArai | 0:5b88d5760320 | 425 | // AT Command Parser |
| kenjiArai | 0:5b88d5760320 | 426 | mbed::ATCmdParser _parser; |
| kenjiArai | 0:5b88d5760320 | 427 | |
| kenjiArai | 0:5b88d5760320 | 428 | // Wifi scan result handling |
| kenjiArai | 0:5b88d5760320 | 429 | bool _recv_ap(nsapi_wifi_ap_t *ap); |
| kenjiArai | 0:5b88d5760320 | 430 | |
| kenjiArai | 0:5b88d5760320 | 431 | // Socket data buffer |
| kenjiArai | 0:5b88d5760320 | 432 | struct packet { |
| kenjiArai | 0:5b88d5760320 | 433 | struct packet *next; |
| kenjiArai | 0:5b88d5760320 | 434 | int id; |
| kenjiArai | 0:5b88d5760320 | 435 | uint32_t len; // Remaining length |
| kenjiArai | 0:5b88d5760320 | 436 | uint32_t alloc_len; // Original length |
| kenjiArai | 0:5b88d5760320 | 437 | // data follows |
| kenjiArai | 0:5b88d5760320 | 438 | } *_packets, * *_packets_end; |
| kenjiArai | 0:5b88d5760320 | 439 | void _clear_socket_packets(int id); |
| kenjiArai | 0:5b88d5760320 | 440 | int _sock_active_id; |
| kenjiArai | 0:5b88d5760320 | 441 | |
| kenjiArai | 0:5b88d5760320 | 442 | // Memory statistics |
| kenjiArai | 0:5b88d5760320 | 443 | size_t _heap_usage; // (Socket data buffer usage) |
| kenjiArai | 0:5b88d5760320 | 444 | |
| kenjiArai | 0:5b88d5760320 | 445 | // OOB processing |
| kenjiArai | 0:5b88d5760320 | 446 | void _process_oob(uint32_t timeout, bool all); |
| kenjiArai | 0:5b88d5760320 | 447 | |
| kenjiArai | 0:5b88d5760320 | 448 | // OOB message handlers |
| kenjiArai | 0:5b88d5760320 | 449 | void _oob_packet_hdlr(); |
| kenjiArai | 0:5b88d5760320 | 450 | void _oob_connect_err(); |
| kenjiArai | 0:5b88d5760320 | 451 | void _oob_conn_already(); |
| kenjiArai | 0:5b88d5760320 | 452 | void _oob_err(); |
| kenjiArai | 0:5b88d5760320 | 453 | void _oob_socket0_closed(); |
| kenjiArai | 0:5b88d5760320 | 454 | void _oob_socket1_closed(); |
| kenjiArai | 0:5b88d5760320 | 455 | void _oob_socket2_closed(); |
| kenjiArai | 0:5b88d5760320 | 456 | void _oob_socket3_closed(); |
| kenjiArai | 0:5b88d5760320 | 457 | void _oob_socket4_closed(); |
| kenjiArai | 0:5b88d5760320 | 458 | void _oob_connection_status(); |
| kenjiArai | 0:5b88d5760320 | 459 | void _oob_socket_close_err(); |
| kenjiArai | 0:5b88d5760320 | 460 | void _oob_watchdog_reset(); |
| kenjiArai | 0:5b88d5760320 | 461 | void _oob_busy(); |
| kenjiArai | 0:5b88d5760320 | 462 | void _oob_tcp_data_hdlr(); |
| kenjiArai | 0:5b88d5760320 | 463 | void _oob_ready(); |
| kenjiArai | 0:5b88d5760320 | 464 | void _oob_scan_results(); |
| kenjiArai | 0:5b88d5760320 | 465 | |
| kenjiArai | 0:5b88d5760320 | 466 | // OOB state variables |
| kenjiArai | 0:5b88d5760320 | 467 | int _connect_error; |
| kenjiArai | 0:5b88d5760320 | 468 | bool _disconnect; |
| kenjiArai | 0:5b88d5760320 | 469 | bool _fail; |
| kenjiArai | 0:5b88d5760320 | 470 | bool _sock_already; |
| kenjiArai | 0:5b88d5760320 | 471 | bool _closed; |
| kenjiArai | 0:5b88d5760320 | 472 | bool _error; |
| kenjiArai | 0:5b88d5760320 | 473 | bool _busy; |
| kenjiArai | 0:5b88d5760320 | 474 | rtos::ConditionVariable _reset_check; |
| kenjiArai | 0:5b88d5760320 | 475 | bool _reset_done; |
| kenjiArai | 0:5b88d5760320 | 476 | |
| kenjiArai | 0:5b88d5760320 | 477 | // Modem's address info |
| kenjiArai | 0:5b88d5760320 | 478 | char _ip_buffer[16]; |
| kenjiArai | 0:5b88d5760320 | 479 | char _gateway_buffer[16]; |
| kenjiArai | 0:5b88d5760320 | 480 | char _netmask_buffer[16]; |
| kenjiArai | 0:5b88d5760320 | 481 | char _mac_buffer[18]; |
| kenjiArai | 0:5b88d5760320 | 482 | |
| kenjiArai | 0:5b88d5760320 | 483 | // Modem's socket info |
| kenjiArai | 0:5b88d5760320 | 484 | struct _sock_info { |
| kenjiArai | 0:5b88d5760320 | 485 | bool open; |
| kenjiArai | 0:5b88d5760320 | 486 | nsapi_protocol_t proto; |
| kenjiArai | 0:5b88d5760320 | 487 | char *tcp_data; |
| kenjiArai | 0:5b88d5760320 | 488 | int32_t tcp_data_avbl; // Data waiting on modem |
| kenjiArai | 0:5b88d5760320 | 489 | int32_t tcp_data_rcvd; |
| kenjiArai | 0:5b88d5760320 | 490 | }; |
| kenjiArai | 0:5b88d5760320 | 491 | struct _sock_info _sock_i[SOCKET_COUNT]; |
| kenjiArai | 0:5b88d5760320 | 492 | |
| kenjiArai | 0:5b88d5760320 | 493 | // Scan results |
| kenjiArai | 0:5b88d5760320 | 494 | struct _scan_results { |
| kenjiArai | 0:5b88d5760320 | 495 | WiFiAccessPoint *res; |
| kenjiArai | 0:5b88d5760320 | 496 | unsigned limit; |
| kenjiArai | 0:5b88d5760320 | 497 | unsigned cnt; |
| kenjiArai | 0:5b88d5760320 | 498 | }; |
| kenjiArai | 0:5b88d5760320 | 499 | struct _scan_results _scan_r; |
| kenjiArai | 0:5b88d5760320 | 500 | |
| kenjiArai | 0:5b88d5760320 | 501 | // Connection state reporting |
| kenjiArai | 0:5b88d5760320 | 502 | nsapi_connection_status_t _conn_status; |
| kenjiArai | 0:5b88d5760320 | 503 | mbed::Callback<void()> _conn_stat_cb; // ESP8266Interface registered |
| kenjiArai | 0:5b88d5760320 | 504 | }; |
| kenjiArai | 0:5b88d5760320 | 505 | #endif |
| kenjiArai | 0:5b88d5760320 | 506 | #endif |