MAXREFDES143#: DeepCover Embedded Security in IoT Authenticated Sensing & Notification

Dependencies:   MaximInterface mbed

The MAXREFDES143# is an Internet of Things (IoT) embedded security reference design, built to protect an industrial sensing node by means of authentication and notification to a web server. The hardware includes a peripheral module representing a protected sensor node monitoring operating temperature and remaining life of a filter (simulated through ambient light sensing) and an mbed shield representing a controller node responsible for monitoring one or more sensor nodes. The design is hierarchical with each controller node communicating data from connected sensor nodes to a web server that maintains a centralized log and dispatches notifications as necessary. The mbed shield contains a Wi-Fi module, a DS2465 coprocessor with 1-Wire® master function, an LCD, LEDs, and pushbuttons. The protected sensor node contains a DS28E15 authenticator, a DS7505 temperature sensor, and a MAX44009 light sensor. The mbed shield communicates to a web server by the onboard Wi-Fi module and to the protected sensor node with I2C and 1-Wire. The MAXREFDES143# is equipped with a standard shield connector for immediate testing using an mbed board such as the MAX32600MBED#. The simplicity of this design enables rapid integration into any star-topology IoT network requiring the heightened security with low overhead provided by the SHA-256 symmetric-key algorithm.

More information about the MAXREFDES143# is available on the Maxim Integrated website.

Committer:
IanBenzMaxim
Date:
Thu Jan 26 14:18:21 2017 -0600
Revision:
28:e5cdaf13d299
Migrated the web interface to the mbed 5 networking stack to improve system compatibility.

Who changed what in which revision?

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