ESP8266 driver from ARM

Dependents:   8-0_OneNet_IoT_demo STM32F103C8T6_OneNet_IoT

Committer:
TaylorGy
Date:
Wed Mar 29 03:09:15 2017 +0000
Revision:
0:dfb22bd0e039
ESP8266 driver from ARM

Who changed what in which revision?

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