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 implementation of NetworkInterfaceAPI
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 <string.h>
IanBenzMaxim 28:e5cdaf13d299 18 #include "ESP8266Interface.h"
IanBenzMaxim 28:e5cdaf13d299 19
IanBenzMaxim 28:e5cdaf13d299 20 // Various timeouts for different ESP8266 operations
IanBenzMaxim 28:e5cdaf13d299 21 #define ESP8266_CONNECT_TIMEOUT 15000
IanBenzMaxim 28:e5cdaf13d299 22 #define ESP8266_SEND_TIMEOUT 500
IanBenzMaxim 28:e5cdaf13d299 23 #define ESP8266_RECV_TIMEOUT 0
IanBenzMaxim 28:e5cdaf13d299 24 #define ESP8266_MISC_TIMEOUT 500
IanBenzMaxim 28:e5cdaf13d299 25
IanBenzMaxim 28:e5cdaf13d299 26 // ESP8266Interface implementation
IanBenzMaxim 28:e5cdaf13d299 27 ESP8266Interface::ESP8266Interface(PinName tx, PinName rx, bool debug)
IanBenzMaxim 28:e5cdaf13d299 28 : _esp(tx, rx, debug)
IanBenzMaxim 28:e5cdaf13d299 29 {
IanBenzMaxim 28:e5cdaf13d299 30 memset(_ids, 0, sizeof(_ids));
IanBenzMaxim 28:e5cdaf13d299 31 memset(_cbs, 0, sizeof(_cbs));
IanBenzMaxim 28:e5cdaf13d299 32
IanBenzMaxim 28:e5cdaf13d299 33 _esp.attach(this, &ESP8266Interface::event);
IanBenzMaxim 28:e5cdaf13d299 34 }
IanBenzMaxim 28:e5cdaf13d299 35
IanBenzMaxim 28:e5cdaf13d299 36 int ESP8266Interface::connect(const char *ssid, const char *pass, nsapi_security_t security,
IanBenzMaxim 28:e5cdaf13d299 37 uint8_t channel)
IanBenzMaxim 28:e5cdaf13d299 38 {
IanBenzMaxim 28:e5cdaf13d299 39 if (channel != 0) {
IanBenzMaxim 28:e5cdaf13d299 40 return NSAPI_ERROR_UNSUPPORTED;
IanBenzMaxim 28:e5cdaf13d299 41 }
IanBenzMaxim 28:e5cdaf13d299 42
IanBenzMaxim 28:e5cdaf13d299 43 set_credentials(ssid, pass, security);
IanBenzMaxim 28:e5cdaf13d299 44 return connect();
IanBenzMaxim 28:e5cdaf13d299 45 }
IanBenzMaxim 28:e5cdaf13d299 46
IanBenzMaxim 28:e5cdaf13d299 47 int ESP8266Interface::connect()
IanBenzMaxim 28:e5cdaf13d299 48 {
IanBenzMaxim 28:e5cdaf13d299 49 _esp.setTimeout(ESP8266_CONNECT_TIMEOUT);
IanBenzMaxim 28:e5cdaf13d299 50
IanBenzMaxim 28:e5cdaf13d299 51 if (!_esp.startup(3)) {
IanBenzMaxim 28:e5cdaf13d299 52 return NSAPI_ERROR_DEVICE_ERROR;
IanBenzMaxim 28:e5cdaf13d299 53 }
IanBenzMaxim 28:e5cdaf13d299 54
IanBenzMaxim 28:e5cdaf13d299 55 if (!_esp.dhcp(true, 1)) {
IanBenzMaxim 28:e5cdaf13d299 56 return NSAPI_ERROR_DHCP_FAILURE;
IanBenzMaxim 28:e5cdaf13d299 57 }
IanBenzMaxim 28:e5cdaf13d299 58
IanBenzMaxim 28:e5cdaf13d299 59 if (!_esp.connect(ap_ssid, ap_pass)) {
IanBenzMaxim 28:e5cdaf13d299 60 return NSAPI_ERROR_NO_CONNECTION;
IanBenzMaxim 28:e5cdaf13d299 61 }
IanBenzMaxim 28:e5cdaf13d299 62
IanBenzMaxim 28:e5cdaf13d299 63 if (!_esp.getIPAddress()) {
IanBenzMaxim 28:e5cdaf13d299 64 return NSAPI_ERROR_DHCP_FAILURE;
IanBenzMaxim 28:e5cdaf13d299 65 }
IanBenzMaxim 28:e5cdaf13d299 66
IanBenzMaxim 28:e5cdaf13d299 67 return NSAPI_ERROR_OK;
IanBenzMaxim 28:e5cdaf13d299 68 }
IanBenzMaxim 28:e5cdaf13d299 69
IanBenzMaxim 28:e5cdaf13d299 70 int ESP8266Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
IanBenzMaxim 28:e5cdaf13d299 71 {
IanBenzMaxim 28:e5cdaf13d299 72 memset(ap_ssid, 0, sizeof(ap_ssid));
IanBenzMaxim 28:e5cdaf13d299 73 strncpy(ap_ssid, ssid, sizeof(ap_ssid));
IanBenzMaxim 28:e5cdaf13d299 74
IanBenzMaxim 28:e5cdaf13d299 75 memset(ap_pass, 0, sizeof(ap_pass));
IanBenzMaxim 28:e5cdaf13d299 76 strncpy(ap_pass, pass, sizeof(ap_pass));
IanBenzMaxim 28:e5cdaf13d299 77
IanBenzMaxim 28:e5cdaf13d299 78 ap_sec = security;
IanBenzMaxim 28:e5cdaf13d299 79
IanBenzMaxim 28:e5cdaf13d299 80 return 0;
IanBenzMaxim 28:e5cdaf13d299 81 }
IanBenzMaxim 28:e5cdaf13d299 82
IanBenzMaxim 28:e5cdaf13d299 83 int ESP8266Interface::set_channel(uint8_t channel)
IanBenzMaxim 28:e5cdaf13d299 84 {
IanBenzMaxim 28:e5cdaf13d299 85 return NSAPI_ERROR_UNSUPPORTED;
IanBenzMaxim 28:e5cdaf13d299 86 }
IanBenzMaxim 28:e5cdaf13d299 87
IanBenzMaxim 28:e5cdaf13d299 88
IanBenzMaxim 28:e5cdaf13d299 89 int ESP8266Interface::disconnect()
IanBenzMaxim 28:e5cdaf13d299 90 {
IanBenzMaxim 28:e5cdaf13d299 91 _esp.setTimeout(ESP8266_MISC_TIMEOUT);
IanBenzMaxim 28:e5cdaf13d299 92
IanBenzMaxim 28:e5cdaf13d299 93 if (!_esp.disconnect()) {
IanBenzMaxim 28:e5cdaf13d299 94 return NSAPI_ERROR_DEVICE_ERROR;
IanBenzMaxim 28:e5cdaf13d299 95 }
IanBenzMaxim 28:e5cdaf13d299 96
IanBenzMaxim 28:e5cdaf13d299 97 return NSAPI_ERROR_OK;
IanBenzMaxim 28:e5cdaf13d299 98 }
IanBenzMaxim 28:e5cdaf13d299 99
IanBenzMaxim 28:e5cdaf13d299 100 const char *ESP8266Interface::get_ip_address()
IanBenzMaxim 28:e5cdaf13d299 101 {
IanBenzMaxim 28:e5cdaf13d299 102 return _esp.getIPAddress();
IanBenzMaxim 28:e5cdaf13d299 103 }
IanBenzMaxim 28:e5cdaf13d299 104
IanBenzMaxim 28:e5cdaf13d299 105 const char *ESP8266Interface::get_mac_address()
IanBenzMaxim 28:e5cdaf13d299 106 {
IanBenzMaxim 28:e5cdaf13d299 107 return _esp.getMACAddress();
IanBenzMaxim 28:e5cdaf13d299 108 }
IanBenzMaxim 28:e5cdaf13d299 109
IanBenzMaxim 28:e5cdaf13d299 110 const char *ESP8266Interface::get_gateway()
IanBenzMaxim 28:e5cdaf13d299 111 {
IanBenzMaxim 28:e5cdaf13d299 112 return _esp.getGateway();
IanBenzMaxim 28:e5cdaf13d299 113 }
IanBenzMaxim 28:e5cdaf13d299 114
IanBenzMaxim 28:e5cdaf13d299 115 const char *ESP8266Interface::get_netmask()
IanBenzMaxim 28:e5cdaf13d299 116 {
IanBenzMaxim 28:e5cdaf13d299 117 return _esp.getNetmask();
IanBenzMaxim 28:e5cdaf13d299 118 }
IanBenzMaxim 28:e5cdaf13d299 119
IanBenzMaxim 28:e5cdaf13d299 120 int8_t ESP8266Interface::get_rssi()
IanBenzMaxim 28:e5cdaf13d299 121 {
IanBenzMaxim 28:e5cdaf13d299 122 return _esp.getRSSI();
IanBenzMaxim 28:e5cdaf13d299 123 }
IanBenzMaxim 28:e5cdaf13d299 124
IanBenzMaxim 28:e5cdaf13d299 125 int ESP8266Interface::scan(WiFiAccessPoint *res, unsigned count)
IanBenzMaxim 28:e5cdaf13d299 126 {
IanBenzMaxim 28:e5cdaf13d299 127 return _esp.scan(res, count);
IanBenzMaxim 28:e5cdaf13d299 128 }
IanBenzMaxim 28:e5cdaf13d299 129
IanBenzMaxim 28:e5cdaf13d299 130 struct esp8266_socket {
IanBenzMaxim 28:e5cdaf13d299 131 int id;
IanBenzMaxim 28:e5cdaf13d299 132 nsapi_protocol_t proto;
IanBenzMaxim 28:e5cdaf13d299 133 bool connected;
IanBenzMaxim 28:e5cdaf13d299 134 SocketAddress addr;
IanBenzMaxim 28:e5cdaf13d299 135 };
IanBenzMaxim 28:e5cdaf13d299 136
IanBenzMaxim 28:e5cdaf13d299 137 int ESP8266Interface::socket_open(void **handle, nsapi_protocol_t proto)
IanBenzMaxim 28:e5cdaf13d299 138 {
IanBenzMaxim 28:e5cdaf13d299 139 // Look for an unused socket
IanBenzMaxim 28:e5cdaf13d299 140 int id = -1;
IanBenzMaxim 28:e5cdaf13d299 141
IanBenzMaxim 28:e5cdaf13d299 142 for (int i = 0; i < ESP8266_SOCKET_COUNT; i++) {
IanBenzMaxim 28:e5cdaf13d299 143 if (!_ids[i]) {
IanBenzMaxim 28:e5cdaf13d299 144 id = i;
IanBenzMaxim 28:e5cdaf13d299 145 _ids[i] = true;
IanBenzMaxim 28:e5cdaf13d299 146 break;
IanBenzMaxim 28:e5cdaf13d299 147 }
IanBenzMaxim 28:e5cdaf13d299 148 }
IanBenzMaxim 28:e5cdaf13d299 149
IanBenzMaxim 28:e5cdaf13d299 150 if (id == -1) {
IanBenzMaxim 28:e5cdaf13d299 151 return NSAPI_ERROR_NO_SOCKET;
IanBenzMaxim 28:e5cdaf13d299 152 }
IanBenzMaxim 28:e5cdaf13d299 153
IanBenzMaxim 28:e5cdaf13d299 154 struct esp8266_socket *socket = new struct esp8266_socket;
IanBenzMaxim 28:e5cdaf13d299 155 if (!socket) {
IanBenzMaxim 28:e5cdaf13d299 156 return NSAPI_ERROR_NO_SOCKET;
IanBenzMaxim 28:e5cdaf13d299 157 }
IanBenzMaxim 28:e5cdaf13d299 158
IanBenzMaxim 28:e5cdaf13d299 159 socket->id = id;
IanBenzMaxim 28:e5cdaf13d299 160 socket->proto = proto;
IanBenzMaxim 28:e5cdaf13d299 161 socket->connected = false;
IanBenzMaxim 28:e5cdaf13d299 162 *handle = socket;
IanBenzMaxim 28:e5cdaf13d299 163 return 0;
IanBenzMaxim 28:e5cdaf13d299 164 }
IanBenzMaxim 28:e5cdaf13d299 165
IanBenzMaxim 28:e5cdaf13d299 166 int ESP8266Interface::socket_close(void *handle)
IanBenzMaxim 28:e5cdaf13d299 167 {
IanBenzMaxim 28:e5cdaf13d299 168 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
IanBenzMaxim 28:e5cdaf13d299 169 int err = 0;
IanBenzMaxim 28:e5cdaf13d299 170 _esp.setTimeout(ESP8266_MISC_TIMEOUT);
IanBenzMaxim 28:e5cdaf13d299 171
IanBenzMaxim 28:e5cdaf13d299 172 if (!_esp.close(socket->id)) {
IanBenzMaxim 28:e5cdaf13d299 173 err = NSAPI_ERROR_DEVICE_ERROR;
IanBenzMaxim 28:e5cdaf13d299 174 }
IanBenzMaxim 28:e5cdaf13d299 175
IanBenzMaxim 28:e5cdaf13d299 176 _ids[socket->id] = false;
IanBenzMaxim 28:e5cdaf13d299 177 delete socket;
IanBenzMaxim 28:e5cdaf13d299 178 return err;
IanBenzMaxim 28:e5cdaf13d299 179 }
IanBenzMaxim 28:e5cdaf13d299 180
IanBenzMaxim 28:e5cdaf13d299 181 int ESP8266Interface::socket_bind(void *handle, const SocketAddress &address)
IanBenzMaxim 28:e5cdaf13d299 182 {
IanBenzMaxim 28:e5cdaf13d299 183 return NSAPI_ERROR_UNSUPPORTED;
IanBenzMaxim 28:e5cdaf13d299 184 }
IanBenzMaxim 28:e5cdaf13d299 185
IanBenzMaxim 28:e5cdaf13d299 186 int ESP8266Interface::socket_listen(void *handle, int backlog)
IanBenzMaxim 28:e5cdaf13d299 187 {
IanBenzMaxim 28:e5cdaf13d299 188 return NSAPI_ERROR_UNSUPPORTED;
IanBenzMaxim 28:e5cdaf13d299 189 }
IanBenzMaxim 28:e5cdaf13d299 190
IanBenzMaxim 28:e5cdaf13d299 191 int ESP8266Interface::socket_connect(void *handle, const SocketAddress &addr)
IanBenzMaxim 28:e5cdaf13d299 192 {
IanBenzMaxim 28:e5cdaf13d299 193 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
IanBenzMaxim 28:e5cdaf13d299 194 _esp.setTimeout(ESP8266_MISC_TIMEOUT);
IanBenzMaxim 28:e5cdaf13d299 195
IanBenzMaxim 28:e5cdaf13d299 196 const char *proto = (socket->proto == NSAPI_UDP) ? "UDP" : "TCP";
IanBenzMaxim 28:e5cdaf13d299 197 if (!_esp.open(proto, socket->id, addr.get_ip_address(), addr.get_port())) {
IanBenzMaxim 28:e5cdaf13d299 198 return NSAPI_ERROR_DEVICE_ERROR;
IanBenzMaxim 28:e5cdaf13d299 199 }
IanBenzMaxim 28:e5cdaf13d299 200
IanBenzMaxim 28:e5cdaf13d299 201 socket->connected = true;
IanBenzMaxim 28:e5cdaf13d299 202 return 0;
IanBenzMaxim 28:e5cdaf13d299 203 }
IanBenzMaxim 28:e5cdaf13d299 204
IanBenzMaxim 28:e5cdaf13d299 205 int ESP8266Interface::socket_accept(void *server, void **socket, SocketAddress *addr)
IanBenzMaxim 28:e5cdaf13d299 206 {
IanBenzMaxim 28:e5cdaf13d299 207 return NSAPI_ERROR_UNSUPPORTED;
IanBenzMaxim 28:e5cdaf13d299 208 }
IanBenzMaxim 28:e5cdaf13d299 209
IanBenzMaxim 28:e5cdaf13d299 210 int ESP8266Interface::socket_send(void *handle, const void *data, unsigned size)
IanBenzMaxim 28:e5cdaf13d299 211 {
IanBenzMaxim 28:e5cdaf13d299 212 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
IanBenzMaxim 28:e5cdaf13d299 213 _esp.setTimeout(ESP8266_SEND_TIMEOUT);
IanBenzMaxim 28:e5cdaf13d299 214
IanBenzMaxim 28:e5cdaf13d299 215 if (!_esp.send(socket->id, data, size)) {
IanBenzMaxim 28:e5cdaf13d299 216 return NSAPI_ERROR_DEVICE_ERROR;
IanBenzMaxim 28:e5cdaf13d299 217 }
IanBenzMaxim 28:e5cdaf13d299 218
IanBenzMaxim 28:e5cdaf13d299 219 return size;
IanBenzMaxim 28:e5cdaf13d299 220 }
IanBenzMaxim 28:e5cdaf13d299 221
IanBenzMaxim 28:e5cdaf13d299 222 int ESP8266Interface::socket_recv(void *handle, void *data, unsigned size)
IanBenzMaxim 28:e5cdaf13d299 223 {
IanBenzMaxim 28:e5cdaf13d299 224 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
IanBenzMaxim 28:e5cdaf13d299 225 _esp.setTimeout(ESP8266_RECV_TIMEOUT);
IanBenzMaxim 28:e5cdaf13d299 226
IanBenzMaxim 28:e5cdaf13d299 227 int32_t recv = _esp.recv(socket->id, data, size);
IanBenzMaxim 28:e5cdaf13d299 228 if (recv < 0) {
IanBenzMaxim 28:e5cdaf13d299 229 return NSAPI_ERROR_WOULD_BLOCK;
IanBenzMaxim 28:e5cdaf13d299 230 }
IanBenzMaxim 28:e5cdaf13d299 231
IanBenzMaxim 28:e5cdaf13d299 232 return recv;
IanBenzMaxim 28:e5cdaf13d299 233 }
IanBenzMaxim 28:e5cdaf13d299 234
IanBenzMaxim 28:e5cdaf13d299 235 int ESP8266Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
IanBenzMaxim 28:e5cdaf13d299 236 {
IanBenzMaxim 28:e5cdaf13d299 237 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
IanBenzMaxim 28:e5cdaf13d299 238
IanBenzMaxim 28:e5cdaf13d299 239 if (socket->connected && socket->addr != addr) {
IanBenzMaxim 28:e5cdaf13d299 240 _esp.setTimeout(ESP8266_MISC_TIMEOUT);
IanBenzMaxim 28:e5cdaf13d299 241 if (!_esp.close(socket->id)) {
IanBenzMaxim 28:e5cdaf13d299 242 return NSAPI_ERROR_DEVICE_ERROR;
IanBenzMaxim 28:e5cdaf13d299 243 }
IanBenzMaxim 28:e5cdaf13d299 244 socket->connected = false;
IanBenzMaxim 28:e5cdaf13d299 245 }
IanBenzMaxim 28:e5cdaf13d299 246
IanBenzMaxim 28:e5cdaf13d299 247 if (!socket->connected) {
IanBenzMaxim 28:e5cdaf13d299 248 int err = socket_connect(socket, addr);
IanBenzMaxim 28:e5cdaf13d299 249 if (err < 0) {
IanBenzMaxim 28:e5cdaf13d299 250 return err;
IanBenzMaxim 28:e5cdaf13d299 251 }
IanBenzMaxim 28:e5cdaf13d299 252 socket->addr = addr;
IanBenzMaxim 28:e5cdaf13d299 253 }
IanBenzMaxim 28:e5cdaf13d299 254
IanBenzMaxim 28:e5cdaf13d299 255 return socket_send(socket, data, size);
IanBenzMaxim 28:e5cdaf13d299 256 }
IanBenzMaxim 28:e5cdaf13d299 257
IanBenzMaxim 28:e5cdaf13d299 258 int ESP8266Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
IanBenzMaxim 28:e5cdaf13d299 259 {
IanBenzMaxim 28:e5cdaf13d299 260 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
IanBenzMaxim 28:e5cdaf13d299 261 int ret = socket_recv(socket, data, size);
IanBenzMaxim 28:e5cdaf13d299 262 if (ret >= 0 && addr) {
IanBenzMaxim 28:e5cdaf13d299 263 *addr = socket->addr;
IanBenzMaxim 28:e5cdaf13d299 264 }
IanBenzMaxim 28:e5cdaf13d299 265
IanBenzMaxim 28:e5cdaf13d299 266 return ret;
IanBenzMaxim 28:e5cdaf13d299 267 }
IanBenzMaxim 28:e5cdaf13d299 268
IanBenzMaxim 28:e5cdaf13d299 269 void ESP8266Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
IanBenzMaxim 28:e5cdaf13d299 270 {
IanBenzMaxim 28:e5cdaf13d299 271 struct esp8266_socket *socket = (struct esp8266_socket *)handle;
IanBenzMaxim 28:e5cdaf13d299 272 _cbs[socket->id].callback = callback;
IanBenzMaxim 28:e5cdaf13d299 273 _cbs[socket->id].data = data;
IanBenzMaxim 28:e5cdaf13d299 274 }
IanBenzMaxim 28:e5cdaf13d299 275
IanBenzMaxim 28:e5cdaf13d299 276 void ESP8266Interface::event() {
IanBenzMaxim 28:e5cdaf13d299 277 for (int i = 0; i < ESP8266_SOCKET_COUNT; i++) {
IanBenzMaxim 28:e5cdaf13d299 278 if (_cbs[i].callback) {
IanBenzMaxim 28:e5cdaf13d299 279 _cbs[i].callback(_cbs[i].data);
IanBenzMaxim 28:e5cdaf13d299 280 }
IanBenzMaxim 28:e5cdaf13d299 281 }
IanBenzMaxim 28:e5cdaf13d299 282 }