version 1.6

Dependents:   iot_water_monitor_v2

Committer:
DuyLionTran
Date:
Tue Dec 12 15:57:57 2017 +0000
Revision:
0:9fa9929d1a8c
version 1.6

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DuyLionTran 0:9fa9929d1a8c 1 /* ESP8266 Example
DuyLionTran 0:9fa9929d1a8c 2 * Copyright (c) 2015 ARM Limited
DuyLionTran 0:9fa9929d1a8c 3 *
DuyLionTran 0:9fa9929d1a8c 4 * Licensed under the Apache License, Version 2.0 (the "License");
DuyLionTran 0:9fa9929d1a8c 5 * you may not use this file except in compliance with the License.
DuyLionTran 0:9fa9929d1a8c 6 * You may obtain a copy of the License at
DuyLionTran 0:9fa9929d1a8c 7 *
DuyLionTran 0:9fa9929d1a8c 8 * http://www.apache.org/licenses/LICENSE-2.0
DuyLionTran 0:9fa9929d1a8c 9 *
DuyLionTran 0:9fa9929d1a8c 10 * Unless required by applicable law or agreed to in writing, software
DuyLionTran 0:9fa9929d1a8c 11 * distributed under the License is distributed on an "AS IS" BASIS,
DuyLionTran 0:9fa9929d1a8c 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
DuyLionTran 0:9fa9929d1a8c 13 * See the License for the specific language governing permissions and
DuyLionTran 0:9fa9929d1a8c 14 * limitations under the License.
DuyLionTran 0:9fa9929d1a8c 15 */
DuyLionTran 0:9fa9929d1a8c 16
DuyLionTran 0:9fa9929d1a8c 17 #include "ESP8266.h"
DuyLionTran 0:9fa9929d1a8c 18
DuyLionTran 0:9fa9929d1a8c 19 #define ESP8266_DEFAULT_BAUD_RATE 115200
DuyLionTran 0:9fa9929d1a8c 20
DuyLionTran 0:9fa9929d1a8c 21 ESP8266::ESP8266(PinName tx, PinName rx, bool debug)
DuyLionTran 0:9fa9929d1a8c 22 : _serial(tx, rx, ESP8266_DEFAULT_BAUD_RATE),
DuyLionTran 0:9fa9929d1a8c 23 _parser(&_serial),
DuyLionTran 0:9fa9929d1a8c 24 _packets(0),
DuyLionTran 0:9fa9929d1a8c 25 _packets_end(&_packets)
DuyLionTran 0:9fa9929d1a8c 26 {
DuyLionTran 0:9fa9929d1a8c 27 _serial.set_baud( ESP8266_DEFAULT_BAUD_RATE );
DuyLionTran 0:9fa9929d1a8c 28 _parser.debug_on(debug);
DuyLionTran 0:9fa9929d1a8c 29 _parser.set_delimiter("\r\n");
DuyLionTran 0:9fa9929d1a8c 30 }
DuyLionTran 0:9fa9929d1a8c 31
DuyLionTran 0:9fa9929d1a8c 32 int ESP8266::get_firmware_version()
DuyLionTran 0:9fa9929d1a8c 33 {
DuyLionTran 0:9fa9929d1a8c 34 _parser.send("AT+GMR");
DuyLionTran 0:9fa9929d1a8c 35 int version;
DuyLionTran 0:9fa9929d1a8c 36 if(_parser.recv("SDK version:%d", &version) && _parser.recv("OK")) {
DuyLionTran 0:9fa9929d1a8c 37 return version;
DuyLionTran 0:9fa9929d1a8c 38 } else {
DuyLionTran 0:9fa9929d1a8c 39 // Older firmware versions do not prefix the version with "SDK version: "
DuyLionTran 0:9fa9929d1a8c 40 return -1;
DuyLionTran 0:9fa9929d1a8c 41 }
DuyLionTran 0:9fa9929d1a8c 42
DuyLionTran 0:9fa9929d1a8c 43 }
DuyLionTran 0:9fa9929d1a8c 44
DuyLionTran 0:9fa9929d1a8c 45 bool ESP8266::startup(int mode)
DuyLionTran 0:9fa9929d1a8c 46 {
DuyLionTran 0:9fa9929d1a8c 47 //only 3 valid modes
DuyLionTran 0:9fa9929d1a8c 48 if(mode < 1 || mode > 3) {
DuyLionTran 0:9fa9929d1a8c 49 return false;
DuyLionTran 0:9fa9929d1a8c 50 }
DuyLionTran 0:9fa9929d1a8c 51
DuyLionTran 0:9fa9929d1a8c 52 bool success = _parser.send("AT+CWMODE_CUR=%d", mode)
DuyLionTran 0:9fa9929d1a8c 53 && _parser.recv("OK")
DuyLionTran 0:9fa9929d1a8c 54 && _parser.send("AT+CIPMUX=1")
DuyLionTran 0:9fa9929d1a8c 55 && _parser.recv("OK");
DuyLionTran 0:9fa9929d1a8c 56
DuyLionTran 0:9fa9929d1a8c 57 _parser.oob("+IPD", callback(this, &ESP8266::_packet_handler));
DuyLionTran 0:9fa9929d1a8c 58
DuyLionTran 0:9fa9929d1a8c 59 return success;
DuyLionTran 0:9fa9929d1a8c 60 }
DuyLionTran 0:9fa9929d1a8c 61
DuyLionTran 0:9fa9929d1a8c 62 bool ESP8266::reset(void)
DuyLionTran 0:9fa9929d1a8c 63 {
DuyLionTran 0:9fa9929d1a8c 64 for (int i = 0; i < 2; i++) {
DuyLionTran 0:9fa9929d1a8c 65 if (_parser.send("AT+RST")
DuyLionTran 0:9fa9929d1a8c 66 && _parser.recv("OK\r\nready")) {
DuyLionTran 0:9fa9929d1a8c 67 return true;
DuyLionTran 0:9fa9929d1a8c 68 }
DuyLionTran 0:9fa9929d1a8c 69 }
DuyLionTran 0:9fa9929d1a8c 70
DuyLionTran 0:9fa9929d1a8c 71 return false;
DuyLionTran 0:9fa9929d1a8c 72 }
DuyLionTran 0:9fa9929d1a8c 73
DuyLionTran 0:9fa9929d1a8c 74 bool ESP8266::dhcp(bool enabled, int mode)
DuyLionTran 0:9fa9929d1a8c 75 {
DuyLionTran 0:9fa9929d1a8c 76 //only 3 valid modes
DuyLionTran 0:9fa9929d1a8c 77 if(mode < 0 || mode > 2) {
DuyLionTran 0:9fa9929d1a8c 78 return false;
DuyLionTran 0:9fa9929d1a8c 79 }
DuyLionTran 0:9fa9929d1a8c 80
DuyLionTran 0:9fa9929d1a8c 81 return _parser.send("AT+CWDHCP_CUR=%d,%d", enabled?1:0, mode)
DuyLionTran 0:9fa9929d1a8c 82 && _parser.recv("OK");
DuyLionTran 0:9fa9929d1a8c 83 }
DuyLionTran 0:9fa9929d1a8c 84
DuyLionTran 0:9fa9929d1a8c 85 bool ESP8266::connect(const char *ap, const char *passPhrase)
DuyLionTran 0:9fa9929d1a8c 86 {
DuyLionTran 0:9fa9929d1a8c 87 return _parser.send("AT+CWJAP_CUR=\"%s\",\"%s\"", ap, passPhrase)
DuyLionTran 0:9fa9929d1a8c 88 && _parser.recv("OK");
DuyLionTran 0:9fa9929d1a8c 89 }
DuyLionTran 0:9fa9929d1a8c 90
DuyLionTran 0:9fa9929d1a8c 91 bool ESP8266::disconnect(void)
DuyLionTran 0:9fa9929d1a8c 92 {
DuyLionTran 0:9fa9929d1a8c 93 return _parser.send("AT+CWQAP") && _parser.recv("OK");
DuyLionTran 0:9fa9929d1a8c 94 }
DuyLionTran 0:9fa9929d1a8c 95
DuyLionTran 0:9fa9929d1a8c 96 const char *ESP8266::getIPAddress(void)
DuyLionTran 0:9fa9929d1a8c 97 {
DuyLionTran 0:9fa9929d1a8c 98 if (!(_parser.send("AT+CIFSR")
DuyLionTran 0:9fa9929d1a8c 99 && _parser.recv("+CIFSR:STAIP,\"%15[^\"]\"", _ip_buffer)
DuyLionTran 0:9fa9929d1a8c 100 && _parser.recv("OK"))) {
DuyLionTran 0:9fa9929d1a8c 101 return 0;
DuyLionTran 0:9fa9929d1a8c 102 }
DuyLionTran 0:9fa9929d1a8c 103
DuyLionTran 0:9fa9929d1a8c 104 return _ip_buffer;
DuyLionTran 0:9fa9929d1a8c 105 }
DuyLionTran 0:9fa9929d1a8c 106
DuyLionTran 0:9fa9929d1a8c 107 const char *ESP8266::getMACAddress(void)
DuyLionTran 0:9fa9929d1a8c 108 {
DuyLionTran 0:9fa9929d1a8c 109 if (!(_parser.send("AT+CIFSR")
DuyLionTran 0:9fa9929d1a8c 110 && _parser.recv("+CIFSR:STAMAC,\"%17[^\"]\"", _mac_buffer)
DuyLionTran 0:9fa9929d1a8c 111 && _parser.recv("OK"))) {
DuyLionTran 0:9fa9929d1a8c 112 return 0;
DuyLionTran 0:9fa9929d1a8c 113 }
DuyLionTran 0:9fa9929d1a8c 114
DuyLionTran 0:9fa9929d1a8c 115 return _mac_buffer;
DuyLionTran 0:9fa9929d1a8c 116 }
DuyLionTran 0:9fa9929d1a8c 117
DuyLionTran 0:9fa9929d1a8c 118 const char *ESP8266::getGateway()
DuyLionTran 0:9fa9929d1a8c 119 {
DuyLionTran 0:9fa9929d1a8c 120 if (!(_parser.send("AT+CIPSTA_CUR?")
DuyLionTran 0:9fa9929d1a8c 121 && _parser.recv("+CIPSTA_CUR:gateway:\"%15[^\"]\"", _gateway_buffer)
DuyLionTran 0:9fa9929d1a8c 122 && _parser.recv("OK"))) {
DuyLionTran 0:9fa9929d1a8c 123 return 0;
DuyLionTran 0:9fa9929d1a8c 124 }
DuyLionTran 0:9fa9929d1a8c 125
DuyLionTran 0:9fa9929d1a8c 126 return _gateway_buffer;
DuyLionTran 0:9fa9929d1a8c 127 }
DuyLionTran 0:9fa9929d1a8c 128
DuyLionTran 0:9fa9929d1a8c 129 const char *ESP8266::getNetmask()
DuyLionTran 0:9fa9929d1a8c 130 {
DuyLionTran 0:9fa9929d1a8c 131 if (!(_parser.send("AT+CIPSTA_CUR?")
DuyLionTran 0:9fa9929d1a8c 132 && _parser.recv("+CIPSTA_CUR:netmask:\"%15[^\"]\"", _netmask_buffer)
DuyLionTran 0:9fa9929d1a8c 133 && _parser.recv("OK"))) {
DuyLionTran 0:9fa9929d1a8c 134 return 0;
DuyLionTran 0:9fa9929d1a8c 135 }
DuyLionTran 0:9fa9929d1a8c 136
DuyLionTran 0:9fa9929d1a8c 137 return _netmask_buffer;
DuyLionTran 0:9fa9929d1a8c 138 }
DuyLionTran 0:9fa9929d1a8c 139
DuyLionTran 0:9fa9929d1a8c 140 int8_t ESP8266::getRSSI()
DuyLionTran 0:9fa9929d1a8c 141 {
DuyLionTran 0:9fa9929d1a8c 142 int8_t rssi;
DuyLionTran 0:9fa9929d1a8c 143 char bssid[18];
DuyLionTran 0:9fa9929d1a8c 144
DuyLionTran 0:9fa9929d1a8c 145 if (!(_parser.send("AT+CWJAP_CUR?")
DuyLionTran 0:9fa9929d1a8c 146 && _parser.recv("+CWJAP_CUR::\"%*[^\"]\",\"%17[^\"]\"", bssid)
DuyLionTran 0:9fa9929d1a8c 147 && _parser.recv("OK"))) {
DuyLionTran 0:9fa9929d1a8c 148 return 0;
DuyLionTran 0:9fa9929d1a8c 149 }
DuyLionTran 0:9fa9929d1a8c 150
DuyLionTran 0:9fa9929d1a8c 151 if (!(_parser.send("AT+CWLAP=\"\",\"%s\",", bssid)
DuyLionTran 0:9fa9929d1a8c 152 && _parser.recv("+CWLAP:(%*d,\"%*[^\"]\",%hhd,", &rssi)
DuyLionTran 0:9fa9929d1a8c 153 && _parser.recv("OK"))) {
DuyLionTran 0:9fa9929d1a8c 154 return 0;
DuyLionTran 0:9fa9929d1a8c 155 }
DuyLionTran 0:9fa9929d1a8c 156
DuyLionTran 0:9fa9929d1a8c 157 return rssi;
DuyLionTran 0:9fa9929d1a8c 158 }
DuyLionTran 0:9fa9929d1a8c 159
DuyLionTran 0:9fa9929d1a8c 160 bool ESP8266::isConnected(void)
DuyLionTran 0:9fa9929d1a8c 161 {
DuyLionTran 0:9fa9929d1a8c 162 return getIPAddress() != 0;
DuyLionTran 0:9fa9929d1a8c 163 }
DuyLionTran 0:9fa9929d1a8c 164
DuyLionTran 0:9fa9929d1a8c 165 int ESP8266::scan(WiFiAccessPoint *res, unsigned limit)
DuyLionTran 0:9fa9929d1a8c 166 {
DuyLionTran 0:9fa9929d1a8c 167 unsigned cnt = 0;
DuyLionTran 0:9fa9929d1a8c 168 nsapi_wifi_ap_t ap;
DuyLionTran 0:9fa9929d1a8c 169
DuyLionTran 0:9fa9929d1a8c 170 if (!_parser.send("AT+CWLAP")) {
DuyLionTran 0:9fa9929d1a8c 171 return NSAPI_ERROR_DEVICE_ERROR;
DuyLionTran 0:9fa9929d1a8c 172 }
DuyLionTran 0:9fa9929d1a8c 173
DuyLionTran 0:9fa9929d1a8c 174 while (recv_ap(&ap)) {
DuyLionTran 0:9fa9929d1a8c 175 if (cnt < limit) {
DuyLionTran 0:9fa9929d1a8c 176 res[cnt] = WiFiAccessPoint(ap);
DuyLionTran 0:9fa9929d1a8c 177 }
DuyLionTran 0:9fa9929d1a8c 178
DuyLionTran 0:9fa9929d1a8c 179 cnt++;
DuyLionTran 0:9fa9929d1a8c 180 if (limit != 0 && cnt >= limit) {
DuyLionTran 0:9fa9929d1a8c 181 break;
DuyLionTran 0:9fa9929d1a8c 182 }
DuyLionTran 0:9fa9929d1a8c 183 }
DuyLionTran 0:9fa9929d1a8c 184
DuyLionTran 0:9fa9929d1a8c 185 return cnt;
DuyLionTran 0:9fa9929d1a8c 186 }
DuyLionTran 0:9fa9929d1a8c 187
DuyLionTran 0:9fa9929d1a8c 188 bool ESP8266::open(const char *type, int id, const char* addr, int port)
DuyLionTran 0:9fa9929d1a8c 189 {
DuyLionTran 0:9fa9929d1a8c 190 //IDs only 0-4
DuyLionTran 0:9fa9929d1a8c 191 if(id > 4) {
DuyLionTran 0:9fa9929d1a8c 192 return false;
DuyLionTran 0:9fa9929d1a8c 193 }
DuyLionTran 0:9fa9929d1a8c 194 return _parser.send("AT+CIPSTART=%d,\"%s\",\"%s\",%d", id, type, addr, port)
DuyLionTran 0:9fa9929d1a8c 195 && _parser.recv("OK");
DuyLionTran 0:9fa9929d1a8c 196 }
DuyLionTran 0:9fa9929d1a8c 197
DuyLionTran 0:9fa9929d1a8c 198 bool ESP8266::dns_lookup(const char* name, char* ip)
DuyLionTran 0:9fa9929d1a8c 199 {
DuyLionTran 0:9fa9929d1a8c 200 return _parser.send("AT+CIPDOMAIN=\"%s\"", name) && _parser.recv("+CIPDOMAIN:%s%*[\r]%*[\n]", ip);
DuyLionTran 0:9fa9929d1a8c 201 }
DuyLionTran 0:9fa9929d1a8c 202
DuyLionTran 0:9fa9929d1a8c 203 bool ESP8266::send(int id, const void *data, uint32_t amount)
DuyLionTran 0:9fa9929d1a8c 204 {
DuyLionTran 0:9fa9929d1a8c 205 //May take a second try if device is busy
DuyLionTran 0:9fa9929d1a8c 206 for (unsigned i = 0; i < 2; i++) {
DuyLionTran 0:9fa9929d1a8c 207 if (_parser.send("AT+CIPSEND=%d,%d", id, amount)
DuyLionTran 0:9fa9929d1a8c 208 && _parser.recv(">")
DuyLionTran 0:9fa9929d1a8c 209 && _parser.write((char*)data, (int)amount) >= 0) {
DuyLionTran 0:9fa9929d1a8c 210 return true;
DuyLionTran 0:9fa9929d1a8c 211 }
DuyLionTran 0:9fa9929d1a8c 212 }
DuyLionTran 0:9fa9929d1a8c 213
DuyLionTran 0:9fa9929d1a8c 214 return false;
DuyLionTran 0:9fa9929d1a8c 215 }
DuyLionTran 0:9fa9929d1a8c 216
DuyLionTran 0:9fa9929d1a8c 217 void ESP8266::_packet_handler()
DuyLionTran 0:9fa9929d1a8c 218 {
DuyLionTran 0:9fa9929d1a8c 219 int id;
DuyLionTran 0:9fa9929d1a8c 220 uint32_t amount;
DuyLionTran 0:9fa9929d1a8c 221
DuyLionTran 0:9fa9929d1a8c 222 // parse out the packet
DuyLionTran 0:9fa9929d1a8c 223 if (!_parser.recv(",%d,%d:", &id, &amount)) {
DuyLionTran 0:9fa9929d1a8c 224 return;
DuyLionTran 0:9fa9929d1a8c 225 }
DuyLionTran 0:9fa9929d1a8c 226
DuyLionTran 0:9fa9929d1a8c 227 struct packet *packet = (struct packet*)malloc(
DuyLionTran 0:9fa9929d1a8c 228 sizeof(struct packet) + amount);
DuyLionTran 0:9fa9929d1a8c 229 if (!packet) {
DuyLionTran 0:9fa9929d1a8c 230 return;
DuyLionTran 0:9fa9929d1a8c 231 }
DuyLionTran 0:9fa9929d1a8c 232
DuyLionTran 0:9fa9929d1a8c 233 packet->id = id;
DuyLionTran 0:9fa9929d1a8c 234 packet->len = amount;
DuyLionTran 0:9fa9929d1a8c 235 packet->next = 0;
DuyLionTran 0:9fa9929d1a8c 236
DuyLionTran 0:9fa9929d1a8c 237 if (!(_parser.read((char*)(packet + 1), amount))) {
DuyLionTran 0:9fa9929d1a8c 238 free(packet);
DuyLionTran 0:9fa9929d1a8c 239 return;
DuyLionTran 0:9fa9929d1a8c 240 }
DuyLionTran 0:9fa9929d1a8c 241
DuyLionTran 0:9fa9929d1a8c 242 // append to packet list
DuyLionTran 0:9fa9929d1a8c 243 *_packets_end = packet;
DuyLionTran 0:9fa9929d1a8c 244 _packets_end = &packet->next;
DuyLionTran 0:9fa9929d1a8c 245 }
DuyLionTran 0:9fa9929d1a8c 246
DuyLionTran 0:9fa9929d1a8c 247 int32_t ESP8266::recv(int id, void *data, uint32_t amount)
DuyLionTran 0:9fa9929d1a8c 248 {
DuyLionTran 0:9fa9929d1a8c 249 while (true) {
DuyLionTran 0:9fa9929d1a8c 250 // check if any packets are ready for us
DuyLionTran 0:9fa9929d1a8c 251 for (struct packet **p = &_packets; *p; p = &(*p)->next) {
DuyLionTran 0:9fa9929d1a8c 252 if ((*p)->id == id) {
DuyLionTran 0:9fa9929d1a8c 253 struct packet *q = *p;
DuyLionTran 0:9fa9929d1a8c 254
DuyLionTran 0:9fa9929d1a8c 255 if (q->len <= amount) { // Return and remove full packet
DuyLionTran 0:9fa9929d1a8c 256 memcpy(data, q+1, q->len);
DuyLionTran 0:9fa9929d1a8c 257
DuyLionTran 0:9fa9929d1a8c 258 if (_packets_end == &(*p)->next) {
DuyLionTran 0:9fa9929d1a8c 259 _packets_end = p;
DuyLionTran 0:9fa9929d1a8c 260 }
DuyLionTran 0:9fa9929d1a8c 261 *p = (*p)->next;
DuyLionTran 0:9fa9929d1a8c 262
DuyLionTran 0:9fa9929d1a8c 263 uint32_t len = q->len;
DuyLionTran 0:9fa9929d1a8c 264 free(q);
DuyLionTran 0:9fa9929d1a8c 265 return len;
DuyLionTran 0:9fa9929d1a8c 266 } else { // return only partial packet
DuyLionTran 0:9fa9929d1a8c 267 memcpy(data, q+1, amount);
DuyLionTran 0:9fa9929d1a8c 268
DuyLionTran 0:9fa9929d1a8c 269 q->len -= amount;
DuyLionTran 0:9fa9929d1a8c 270 memmove(q+1, (uint8_t*)(q+1) + amount, q->len);
DuyLionTran 0:9fa9929d1a8c 271
DuyLionTran 0:9fa9929d1a8c 272 return amount;
DuyLionTran 0:9fa9929d1a8c 273 }
DuyLionTran 0:9fa9929d1a8c 274 }
DuyLionTran 0:9fa9929d1a8c 275 }
DuyLionTran 0:9fa9929d1a8c 276
DuyLionTran 0:9fa9929d1a8c 277 // Check for inbound packets
DuyLionTran 0:9fa9929d1a8c 278 if (!_parser.process_oob()) {
DuyLionTran 0:9fa9929d1a8c 279 return -1;
DuyLionTran 0:9fa9929d1a8c 280 }
DuyLionTran 0:9fa9929d1a8c 281 }
DuyLionTran 0:9fa9929d1a8c 282 }
DuyLionTran 0:9fa9929d1a8c 283
DuyLionTran 0:9fa9929d1a8c 284 bool ESP8266::close(int id)
DuyLionTran 0:9fa9929d1a8c 285 {
DuyLionTran 0:9fa9929d1a8c 286 //May take a second try if device is busy
DuyLionTran 0:9fa9929d1a8c 287 for (unsigned i = 0; i < 2; i++) {
DuyLionTran 0:9fa9929d1a8c 288 if (_parser.send("AT+CIPCLOSE=%d", id)
DuyLionTran 0:9fa9929d1a8c 289 && _parser.recv("OK")) {
DuyLionTran 0:9fa9929d1a8c 290 return true;
DuyLionTran 0:9fa9929d1a8c 291 }
DuyLionTran 0:9fa9929d1a8c 292 }
DuyLionTran 0:9fa9929d1a8c 293
DuyLionTran 0:9fa9929d1a8c 294 return false;
DuyLionTran 0:9fa9929d1a8c 295 }
DuyLionTran 0:9fa9929d1a8c 296
DuyLionTran 0:9fa9929d1a8c 297 void ESP8266::setTimeout(uint32_t timeout_ms)
DuyLionTran 0:9fa9929d1a8c 298 {
DuyLionTran 0:9fa9929d1a8c 299 _parser.set_timeout(timeout_ms);
DuyLionTran 0:9fa9929d1a8c 300 }
DuyLionTran 0:9fa9929d1a8c 301
DuyLionTran 0:9fa9929d1a8c 302 bool ESP8266::readable()
DuyLionTran 0:9fa9929d1a8c 303 {
DuyLionTran 0:9fa9929d1a8c 304 return _serial.FileHandle::readable();
DuyLionTran 0:9fa9929d1a8c 305 }
DuyLionTran 0:9fa9929d1a8c 306
DuyLionTran 0:9fa9929d1a8c 307 bool ESP8266::writeable()
DuyLionTran 0:9fa9929d1a8c 308 {
DuyLionTran 0:9fa9929d1a8c 309 return _serial.FileHandle::writable();
DuyLionTran 0:9fa9929d1a8c 310 }
DuyLionTran 0:9fa9929d1a8c 311
DuyLionTran 0:9fa9929d1a8c 312 void ESP8266::attach(Callback<void()> func)
DuyLionTran 0:9fa9929d1a8c 313 {
DuyLionTran 0:9fa9929d1a8c 314 _serial.sigio(func);
DuyLionTran 0:9fa9929d1a8c 315 }
DuyLionTran 0:9fa9929d1a8c 316
DuyLionTran 0:9fa9929d1a8c 317 bool ESP8266::recv_ap(nsapi_wifi_ap_t *ap)
DuyLionTran 0:9fa9929d1a8c 318 {
DuyLionTran 0:9fa9929d1a8c 319 int sec;
DuyLionTran 0:9fa9929d1a8c 320 bool ret = _parser.recv("+CWLAP:(%d,\"%32[^\"]\",%hhd,\"%hhx:%hhx:%hhx:%hhx:%hhx:%hhx\",%d", &sec, ap->ssid,
DuyLionTran 0:9fa9929d1a8c 321 &ap->rssi, &ap->bssid[0], &ap->bssid[1], &ap->bssid[2], &ap->bssid[3], &ap->bssid[4],
DuyLionTran 0:9fa9929d1a8c 322 &ap->bssid[5], &ap->channel);
DuyLionTran 0:9fa9929d1a8c 323
DuyLionTran 0:9fa9929d1a8c 324 ap->security = sec < 5 ? (nsapi_security_t)sec : NSAPI_SECURITY_UNKNOWN;
DuyLionTran 0:9fa9929d1a8c 325
DuyLionTran 0:9fa9929d1a8c 326 return ret;
DuyLionTran 0:9fa9929d1a8c 327 }