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 18:00:02 2017 -0600
Revision:
30:0784010d6975
Parent:
29:590a7561318b
Child:
32:0a09505a656d
Removed unused functionality from ESP8266.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 29:590a7561318b 1 /*******************************************************************************
IanBenzMaxim 29:590a7561318b 2 * Copyright (C) 2016 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 29:590a7561318b 3 *
IanBenzMaxim 29:590a7561318b 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 29:590a7561318b 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 29:590a7561318b 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 29:590a7561318b 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 29:590a7561318b 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 29:590a7561318b 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 29:590a7561318b 10 *
IanBenzMaxim 29:590a7561318b 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 29:590a7561318b 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 29:590a7561318b 13 *
IanBenzMaxim 29:590a7561318b 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 29:590a7561318b 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 29:590a7561318b 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 29:590a7561318b 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 29:590a7561318b 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 29:590a7561318b 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 29:590a7561318b 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 29:590a7561318b 21 *
IanBenzMaxim 29:590a7561318b 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 29:590a7561318b 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 29:590a7561318b 24 * Products, Inc. Branding Policy.
IanBenzMaxim 29:590a7561318b 25 *
IanBenzMaxim 29:590a7561318b 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 29:590a7561318b 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 29:590a7561318b 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 29:590a7561318b 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 29:590a7561318b 30 * ownership rights.
IanBenzMaxim 29:590a7561318b 31 *******************************************************************************
IanBenzMaxim 29:590a7561318b 32 */
IanBenzMaxim 29:590a7561318b 33
IanBenzMaxim 29:590a7561318b 34 #include <cstdlib>
IanBenzMaxim 29:590a7561318b 35 #include "ESP8266.hpp"
IanBenzMaxim 29:590a7561318b 36 #include "Timer.h"
IanBenzMaxim 29:590a7561318b 37 #include "wait_api.h"
IanBenzMaxim 29:590a7561318b 38
IanBenzMaxim 29:590a7561318b 39 static inline void disableRecvData()
IanBenzMaxim 29:590a7561318b 40 {
IanBenzMaxim 29:590a7561318b 41 __disable_irq();
IanBenzMaxim 29:590a7561318b 42 }
IanBenzMaxim 29:590a7561318b 43
IanBenzMaxim 29:590a7561318b 44 static inline void enableRecvData()
IanBenzMaxim 29:590a7561318b 45 {
IanBenzMaxim 29:590a7561318b 46 __enable_irq();
IanBenzMaxim 29:590a7561318b 47 }
IanBenzMaxim 29:590a7561318b 48
IanBenzMaxim 29:590a7561318b 49 ESP8266::ESP8266(const PinName tx, const PinName rx, const PinName rst, const PinName CH_PD, const int baud, mbed::Serial * debugMsgIntf)
IanBenzMaxim 29:590a7561318b 50 : AT_intf(tx, rx), resetPin(rst), powerDownPin(CH_PD), debugMsg(debugMsgIntf), parseRecvReset(false)
IanBenzMaxim 29:590a7561318b 51 {
IanBenzMaxim 29:590a7561318b 52 AT_intf.baud(baud);
IanBenzMaxim 29:590a7561318b 53 AT_intf.attach(this, &ESP8266::recv_AT_data_cb);
IanBenzMaxim 29:590a7561318b 54
IanBenzMaxim 29:590a7561318b 55 // Ensure that device is not held in reset
IanBenzMaxim 29:590a7561318b 56 if (resetPin.is_connected())
IanBenzMaxim 29:590a7561318b 57 resetPin = 1;
IanBenzMaxim 29:590a7561318b 58 // Power down device at startup due to high current demand
IanBenzMaxim 29:590a7561318b 59 setPowered(false);
IanBenzMaxim 29:590a7561318b 60 }
IanBenzMaxim 29:590a7561318b 61
IanBenzMaxim 29:590a7561318b 62 void ESP8266::reset()
IanBenzMaxim 29:590a7561318b 63 {
IanBenzMaxim 29:590a7561318b 64 if (resetPin.is_connected())
IanBenzMaxim 29:590a7561318b 65 {
IanBenzMaxim 29:590a7561318b 66 resetPin = 0;
IanBenzMaxim 29:590a7561318b 67 wait_ms(100);
IanBenzMaxim 29:590a7561318b 68 resetPin = 1;
IanBenzMaxim 29:590a7561318b 69 wait_ms(1000);
IanBenzMaxim 29:590a7561318b 70 }
IanBenzMaxim 29:590a7561318b 71 }
IanBenzMaxim 29:590a7561318b 72
IanBenzMaxim 29:590a7561318b 73 bool ESP8266::powered() const
IanBenzMaxim 29:590a7561318b 74 {
IanBenzMaxim 29:590a7561318b 75 bool isPowered;
IanBenzMaxim 29:590a7561318b 76 if (powerDownPin.is_connected())
IanBenzMaxim 29:590a7561318b 77 {
IanBenzMaxim 29:590a7561318b 78 isPowered = powerDownPin.read();
IanBenzMaxim 29:590a7561318b 79 }
IanBenzMaxim 29:590a7561318b 80 else
IanBenzMaxim 29:590a7561318b 81 {
IanBenzMaxim 29:590a7561318b 82 isPowered = false;
IanBenzMaxim 29:590a7561318b 83 }
IanBenzMaxim 29:590a7561318b 84 return isPowered;
IanBenzMaxim 29:590a7561318b 85 }
IanBenzMaxim 29:590a7561318b 86
IanBenzMaxim 29:590a7561318b 87 void ESP8266::setPowered(bool powered)
IanBenzMaxim 29:590a7561318b 88 {
IanBenzMaxim 29:590a7561318b 89 if (powerDownPin.is_connected())
IanBenzMaxim 29:590a7561318b 90 powerDownPin = powered;
IanBenzMaxim 29:590a7561318b 91 }
IanBenzMaxim 29:590a7561318b 92
IanBenzMaxim 29:590a7561318b 93 ESP8266::CmdResult ESP8266::performSelfTest()
IanBenzMaxim 29:590a7561318b 94 {
IanBenzMaxim 29:590a7561318b 95 return sendCommand(CmdBuilder(""));
IanBenzMaxim 29:590a7561318b 96 }
IanBenzMaxim 29:590a7561318b 97
IanBenzMaxim 29:590a7561318b 98 ESP8266::CmdResult ESP8266::setCurrentWifiMode(const ESP8266::WifiMode mode)
IanBenzMaxim 29:590a7561318b 99 {
IanBenzMaxim 29:590a7561318b 100 CmdBuilder builder("CWMODE_CUR");
IanBenzMaxim 29:590a7561318b 101 builder.addRawArgument(mode);
IanBenzMaxim 29:590a7561318b 102 return sendCommand(builder);
IanBenzMaxim 29:590a7561318b 103 }
IanBenzMaxim 29:590a7561318b 104
IanBenzMaxim 29:590a7561318b 105 ESP8266::CmdResult ESP8266::joinCurrentAccessPoint(const std::string & ssid, const std::string & pwd, const std::string & bssid)
IanBenzMaxim 29:590a7561318b 106 {
IanBenzMaxim 29:590a7561318b 107 CmdBuilder builder("CWJAP_CUR");
IanBenzMaxim 29:590a7561318b 108 builder.addStringArgument(ssid);
IanBenzMaxim 29:590a7561318b 109 builder.addStringArgument(pwd);
IanBenzMaxim 29:590a7561318b 110 if (bssid != "")
IanBenzMaxim 29:590a7561318b 111 builder.addStringArgument(bssid);
IanBenzMaxim 29:590a7561318b 112 return sendCommand(builder);
IanBenzMaxim 29:590a7561318b 113 }
IanBenzMaxim 29:590a7561318b 114
IanBenzMaxim 29:590a7561318b 115 ESP8266::CmdResult ESP8266::quitAccessPoint()
IanBenzMaxim 29:590a7561318b 116 {
IanBenzMaxim 29:590a7561318b 117 return sendCommand(CmdBuilder("CWQAP"));
IanBenzMaxim 29:590a7561318b 118 }
IanBenzMaxim 29:590a7561318b 119
IanBenzMaxim 29:590a7561318b 120 ESP8266::CmdResult ESP8266::setMaxRFTXPower(const float power_dBm)
IanBenzMaxim 29:590a7561318b 121 {
IanBenzMaxim 29:590a7561318b 122 int power_arg = (int)(power_dBm * 4);
IanBenzMaxim 29:590a7561318b 123 if (power_arg > 82)
IanBenzMaxim 29:590a7561318b 124 power_arg = 82;
IanBenzMaxim 29:590a7561318b 125 else if (power_arg < 0)
IanBenzMaxim 29:590a7561318b 126 power_arg = 0;
IanBenzMaxim 29:590a7561318b 127
IanBenzMaxim 29:590a7561318b 128 CmdBuilder builder("RFPOWER");
IanBenzMaxim 29:590a7561318b 129 builder.addRawArgument(power_arg);
IanBenzMaxim 29:590a7561318b 130 return sendCommand(builder);
IanBenzMaxim 29:590a7561318b 131 }
IanBenzMaxim 29:590a7561318b 132
IanBenzMaxim 29:590a7561318b 133 ESP8266::CmdResult ESP8266::ping(const std::string & IP)
IanBenzMaxim 29:590a7561318b 134 {
IanBenzMaxim 29:590a7561318b 135 CmdBuilder builder("PING");
IanBenzMaxim 29:590a7561318b 136 builder.addStringArgument(IP);
IanBenzMaxim 29:590a7561318b 137 return sendCommand(builder);
IanBenzMaxim 29:590a7561318b 138 }
IanBenzMaxim 29:590a7561318b 139
IanBenzMaxim 29:590a7561318b 140 ESP8266::CmdResult ESP8266::openConnection(const ESP8266::ConnType type, const std::string & remoteIP, const unsigned int remotePort)
IanBenzMaxim 29:590a7561318b 141 {
IanBenzMaxim 29:590a7561318b 142 CmdBuilder builder("CIPSTART");
IanBenzMaxim 29:590a7561318b 143 builder.addStringArgument((type == TCP) ? "TCP" : "UDP");
IanBenzMaxim 29:590a7561318b 144 builder.addStringArgument(remoteIP);
IanBenzMaxim 29:590a7561318b 145 builder.addRawArgument(remotePort);
IanBenzMaxim 29:590a7561318b 146 return sendCommand(builder);
IanBenzMaxim 29:590a7561318b 147 }
IanBenzMaxim 29:590a7561318b 148
IanBenzMaxim 29:590a7561318b 149 ESP8266::CmdResult ESP8266::closeConnection()
IanBenzMaxim 29:590a7561318b 150 {
IanBenzMaxim 29:590a7561318b 151 return sendCommand(CmdBuilder("CIPCLOSE"));
IanBenzMaxim 29:590a7561318b 152 }
IanBenzMaxim 29:590a7561318b 153
IanBenzMaxim 29:590a7561318b 154 ESP8266::CmdResult ESP8266::sendData(const std::string & data)
IanBenzMaxim 29:590a7561318b 155 {
IanBenzMaxim 29:590a7561318b 156 CmdBuilder builder("CIPSEND");
IanBenzMaxim 29:590a7561318b 157 builder.addRawArgument(data.length());
IanBenzMaxim 29:590a7561318b 158 ESP8266::CmdResult result = sendCommand(builder);
IanBenzMaxim 29:590a7561318b 159 if (result == ESP8266::AT_OK)
IanBenzMaxim 29:590a7561318b 160 result = send_AT_data(data, false);
IanBenzMaxim 29:590a7561318b 161 return result;
IanBenzMaxim 29:590a7561318b 162 }
IanBenzMaxim 29:590a7561318b 163
IanBenzMaxim 29:590a7561318b 164 ESP8266::CmdResult ESP8266::sendCommand(const CmdBuilder & cmd)
IanBenzMaxim 29:590a7561318b 165 {
IanBenzMaxim 29:590a7561318b 166 return send_AT_data(cmd.str(), true);
IanBenzMaxim 29:590a7561318b 167 }
IanBenzMaxim 29:590a7561318b 168
IanBenzMaxim 29:590a7561318b 169 bool ESP8266::recvIpDataReadable()
IanBenzMaxim 29:590a7561318b 170 {
IanBenzMaxim 29:590a7561318b 171 bool result;
IanBenzMaxim 29:590a7561318b 172
IanBenzMaxim 29:590a7561318b 173 disableRecvData(); // Lock queue access
IanBenzMaxim 29:590a7561318b 174
IanBenzMaxim 29:590a7561318b 175 result = !recvIpDataBuffer.empty();
IanBenzMaxim 29:590a7561318b 176
IanBenzMaxim 29:590a7561318b 177 enableRecvData(); // Unlock queue access
IanBenzMaxim 29:590a7561318b 178
IanBenzMaxim 29:590a7561318b 179 return result;
IanBenzMaxim 29:590a7561318b 180 }
IanBenzMaxim 29:590a7561318b 181
IanBenzMaxim 29:590a7561318b 182 char ESP8266::getcRecvIpData()
IanBenzMaxim 29:590a7561318b 183 {
IanBenzMaxim 29:590a7561318b 184 char received;
IanBenzMaxim 29:590a7561318b 185
IanBenzMaxim 29:590a7561318b 186 disableRecvData(); // Lock queue access
IanBenzMaxim 29:590a7561318b 187
IanBenzMaxim 29:590a7561318b 188 // Pop next char or set to NTC if not data in buffer
IanBenzMaxim 29:590a7561318b 189 if (!recvIpDataBuffer.pop(received))
IanBenzMaxim 29:590a7561318b 190 received = '\0';
IanBenzMaxim 29:590a7561318b 191
IanBenzMaxim 29:590a7561318b 192 enableRecvData(); // Unlock queue access
IanBenzMaxim 29:590a7561318b 193
IanBenzMaxim 29:590a7561318b 194 return received;
IanBenzMaxim 29:590a7561318b 195 }
IanBenzMaxim 29:590a7561318b 196
IanBenzMaxim 29:590a7561318b 197 void ESP8266::clearRecvData()
IanBenzMaxim 29:590a7561318b 198 {
IanBenzMaxim 29:590a7561318b 199 disableRecvData(); // Lock queue access
IanBenzMaxim 29:590a7561318b 200
IanBenzMaxim 29:590a7561318b 201 recvIpDataBuffer.reset();
IanBenzMaxim 29:590a7561318b 202 parseRecvReset = true;
IanBenzMaxim 29:590a7561318b 203
IanBenzMaxim 29:590a7561318b 204 enableRecvData(); // Unlock queue access
IanBenzMaxim 29:590a7561318b 205 }
IanBenzMaxim 29:590a7561318b 206
IanBenzMaxim 29:590a7561318b 207 ESP8266::CmdResult ESP8266::send_AT_data(const std::string & cmdString, const bool expectEcho)
IanBenzMaxim 29:590a7561318b 208 {
IanBenzMaxim 29:590a7561318b 209 const int timeout_ms = 10000;
IanBenzMaxim 29:590a7561318b 210
IanBenzMaxim 29:590a7561318b 211 mbed::Timer timer;
IanBenzMaxim 29:590a7561318b 212 ESP8266::CmdResult result = ESP8266::HardwareError;
IanBenzMaxim 29:590a7561318b 213 std::string response;
IanBenzMaxim 29:590a7561318b 214
IanBenzMaxim 29:590a7561318b 215 disableRecvData(); // Lock for manual data handling in this procedure
IanBenzMaxim 29:590a7561318b 216
IanBenzMaxim 29:590a7561318b 217 // Flush receive buffer
IanBenzMaxim 29:590a7561318b 218 while (AT_intf.readable())
IanBenzMaxim 29:590a7561318b 219 AT_intf.getc();
IanBenzMaxim 29:590a7561318b 220
IanBenzMaxim 29:590a7561318b 221 // Begin counting for timeout
IanBenzMaxim 29:590a7561318b 222 timer.start();
IanBenzMaxim 29:590a7561318b 223
IanBenzMaxim 29:590a7561318b 224 for (size_t i = 0; i < cmdString.length(); i++)
IanBenzMaxim 29:590a7561318b 225 {
IanBenzMaxim 29:590a7561318b 226 // Write next character
IanBenzMaxim 29:590a7561318b 227 while (!AT_intf.writeable())
IanBenzMaxim 29:590a7561318b 228 {
IanBenzMaxim 29:590a7561318b 229 if (timer.read_ms() > timeout_ms)
IanBenzMaxim 29:590a7561318b 230 {
IanBenzMaxim 29:590a7561318b 231 result = TimeoutError;
IanBenzMaxim 29:590a7561318b 232 goto exit;
IanBenzMaxim 29:590a7561318b 233 }
IanBenzMaxim 29:590a7561318b 234 }
IanBenzMaxim 29:590a7561318b 235 AT_intf.putc(cmdString[i]);
IanBenzMaxim 29:590a7561318b 236 // Wait for echo
IanBenzMaxim 29:590a7561318b 237 if (expectEcho && (cmdString[i] != '\r') && (cmdString[i] != '\n'))
IanBenzMaxim 29:590a7561318b 238 {
IanBenzMaxim 29:590a7561318b 239 while (!AT_intf.readable())
IanBenzMaxim 29:590a7561318b 240 {
IanBenzMaxim 29:590a7561318b 241 if (timer.read_ms() > timeout_ms)
IanBenzMaxim 29:590a7561318b 242 {
IanBenzMaxim 29:590a7561318b 243 result = TimeoutError;
IanBenzMaxim 29:590a7561318b 244 goto exit;
IanBenzMaxim 29:590a7561318b 245 }
IanBenzMaxim 29:590a7561318b 246 }
IanBenzMaxim 29:590a7561318b 247 // Compare to written character
IanBenzMaxim 29:590a7561318b 248 if (AT_intf.getc() != cmdString[i])
IanBenzMaxim 29:590a7561318b 249 {
IanBenzMaxim 29:590a7561318b 250 // Handle error
IanBenzMaxim 29:590a7561318b 251 result = ESP8266::HardwareError;
IanBenzMaxim 29:590a7561318b 252 goto exit;
IanBenzMaxim 29:590a7561318b 253 }
IanBenzMaxim 29:590a7561318b 254 }
IanBenzMaxim 29:590a7561318b 255 }
IanBenzMaxim 29:590a7561318b 256
IanBenzMaxim 29:590a7561318b 257 while (result == ESP8266::HardwareError)
IanBenzMaxim 29:590a7561318b 258 {
IanBenzMaxim 29:590a7561318b 259 // Wait to receive something
IanBenzMaxim 29:590a7561318b 260 response.clear();
IanBenzMaxim 29:590a7561318b 261 while (!read_line(response)) ;
IanBenzMaxim 29:590a7561318b 262
IanBenzMaxim 29:590a7561318b 263 // Check if valid response
IanBenzMaxim 29:590a7561318b 264 if (response == "OK")
IanBenzMaxim 29:590a7561318b 265 result = ESP8266::AT_OK;
IanBenzMaxim 29:590a7561318b 266 else if (response == "FAIL")
IanBenzMaxim 29:590a7561318b 267 result = ESP8266::AT_FAIL;
IanBenzMaxim 29:590a7561318b 268 else if (response == "ERROR")
IanBenzMaxim 29:590a7561318b 269 result = ESP8266::AT_ERROR;
IanBenzMaxim 29:590a7561318b 270 else if (response == "SEND OK") // Used by AT+CIPSEND
IanBenzMaxim 29:590a7561318b 271 result = ESP8266::AT_OK;
IanBenzMaxim 29:590a7561318b 272 else if (response == "ALREADY CONNECT") // Used by AT+CIPSTART
IanBenzMaxim 29:590a7561318b 273 result = ESP8266::AT_OK;
IanBenzMaxim 29:590a7561318b 274
IanBenzMaxim 29:590a7561318b 275 if (timer.read_ms() > timeout_ms)
IanBenzMaxim 29:590a7561318b 276 {
IanBenzMaxim 29:590a7561318b 277 result = TimeoutError;
IanBenzMaxim 29:590a7561318b 278 break;
IanBenzMaxim 29:590a7561318b 279 }
IanBenzMaxim 29:590a7561318b 280 }
IanBenzMaxim 29:590a7561318b 281
IanBenzMaxim 29:590a7561318b 282 exit:
IanBenzMaxim 29:590a7561318b 283 enableRecvData(); // Enable interrupt processing
IanBenzMaxim 29:590a7561318b 284 return result;
IanBenzMaxim 29:590a7561318b 285 }
IanBenzMaxim 29:590a7561318b 286
IanBenzMaxim 29:590a7561318b 287 bool ESP8266::read_line(std::string & line)
IanBenzMaxim 29:590a7561318b 288 {
IanBenzMaxim 29:590a7561318b 289 char received;
IanBenzMaxim 29:590a7561318b 290
IanBenzMaxim 29:590a7561318b 291 while (AT_intf.readable())
IanBenzMaxim 29:590a7561318b 292 {
IanBenzMaxim 29:590a7561318b 293 received = AT_intf.getc();
IanBenzMaxim 29:590a7561318b 294 if (received == '\n')
IanBenzMaxim 29:590a7561318b 295 {
IanBenzMaxim 29:590a7561318b 296 return true;
IanBenzMaxim 29:590a7561318b 297 }
IanBenzMaxim 29:590a7561318b 298 else if (received != '\r')
IanBenzMaxim 29:590a7561318b 299 {
IanBenzMaxim 29:590a7561318b 300 line.push_back(received);
IanBenzMaxim 29:590a7561318b 301 }
IanBenzMaxim 29:590a7561318b 302 }
IanBenzMaxim 29:590a7561318b 303 return false;
IanBenzMaxim 29:590a7561318b 304 }
IanBenzMaxim 29:590a7561318b 305
IanBenzMaxim 29:590a7561318b 306 void ESP8266::recv_AT_data_cb()
IanBenzMaxim 29:590a7561318b 307 {
IanBenzMaxim 29:590a7561318b 308 while (AT_intf.readable())
IanBenzMaxim 29:590a7561318b 309 {
IanBenzMaxim 29:590a7561318b 310 char received = AT_intf.getc();
IanBenzMaxim 29:590a7561318b 311 parseRecvIpData(received);
IanBenzMaxim 29:590a7561318b 312 parseRecvConnClosedMsg(received);
IanBenzMaxim 29:590a7561318b 313 parseRecvReset = false;
IanBenzMaxim 29:590a7561318b 314 }
IanBenzMaxim 29:590a7561318b 315 }
IanBenzMaxim 29:590a7561318b 316
IanBenzMaxim 29:590a7561318b 317 void ESP8266::parseRecvIpData(const char received)
IanBenzMaxim 29:590a7561318b 318 {
IanBenzMaxim 29:590a7561318b 319 enum DataRecvState
IanBenzMaxim 29:590a7561318b 320 {
IanBenzMaxim 29:590a7561318b 321 Header,
IanBenzMaxim 29:590a7561318b 322 Length,
IanBenzMaxim 29:590a7561318b 323 Data,
IanBenzMaxim 29:590a7561318b 324 Reset
IanBenzMaxim 29:590a7561318b 325 };
IanBenzMaxim 29:590a7561318b 326
IanBenzMaxim 29:590a7561318b 327 static const char findChars[] = "+IPD,";
IanBenzMaxim 29:590a7561318b 328 static const size_t maxSizeDigits = 4;
IanBenzMaxim 29:590a7561318b 329
IanBenzMaxim 29:590a7561318b 330 static size_t dataFinishedSize = 0;
IanBenzMaxim 29:590a7561318b 331 static size_t index = 0;
IanBenzMaxim 29:590a7561318b 332 static char sizeDigits[] = { '\0', '\0', '\0', '\0', '\0' };
IanBenzMaxim 29:590a7561318b 333 static DataRecvState state = Header;
IanBenzMaxim 29:590a7561318b 334
IanBenzMaxim 29:590a7561318b 335 if (parseRecvReset)
IanBenzMaxim 29:590a7561318b 336 state = Reset;
IanBenzMaxim 29:590a7561318b 337
IanBenzMaxim 29:590a7561318b 338 switch (state)
IanBenzMaxim 29:590a7561318b 339 {
IanBenzMaxim 29:590a7561318b 340 case Reset:
IanBenzMaxim 29:590a7561318b 341 default:
IanBenzMaxim 29:590a7561318b 342 index = 0;
IanBenzMaxim 29:590a7561318b 343 dataFinishedSize = 0;
IanBenzMaxim 29:590a7561318b 344 state = Header;
IanBenzMaxim 29:590a7561318b 345 // Continue processing switch
IanBenzMaxim 29:590a7561318b 346
IanBenzMaxim 29:590a7561318b 347 case Header:
IanBenzMaxim 29:590a7561318b 348 if (received == findChars[index])
IanBenzMaxim 29:590a7561318b 349 {
IanBenzMaxim 29:590a7561318b 350 if (findChars[++index] == '\0')
IanBenzMaxim 29:590a7561318b 351 {
IanBenzMaxim 29:590a7561318b 352 index = 0;
IanBenzMaxim 29:590a7561318b 353 state = Length;
IanBenzMaxim 29:590a7561318b 354 }
IanBenzMaxim 29:590a7561318b 355 }
IanBenzMaxim 29:590a7561318b 356 else
IanBenzMaxim 29:590a7561318b 357 {
IanBenzMaxim 29:590a7561318b 358 state = Reset;
IanBenzMaxim 29:590a7561318b 359 }
IanBenzMaxim 29:590a7561318b 360 break;
IanBenzMaxim 29:590a7561318b 361
IanBenzMaxim 29:590a7561318b 362 case Length:
IanBenzMaxim 29:590a7561318b 363 if ((received <= '9') && (received >= '0'))
IanBenzMaxim 29:590a7561318b 364 {
IanBenzMaxim 29:590a7561318b 365 if (index < maxSizeDigits)
IanBenzMaxim 29:590a7561318b 366 {
IanBenzMaxim 29:590a7561318b 367 sizeDigits[index++] = received;
IanBenzMaxim 29:590a7561318b 368 }
IanBenzMaxim 29:590a7561318b 369 else
IanBenzMaxim 29:590a7561318b 370 {
IanBenzMaxim 29:590a7561318b 371 state = Reset;
IanBenzMaxim 29:590a7561318b 372 }
IanBenzMaxim 29:590a7561318b 373 }
IanBenzMaxim 29:590a7561318b 374 else if (received == ':')
IanBenzMaxim 29:590a7561318b 375 {
IanBenzMaxim 29:590a7561318b 376 dataFinishedSize = std::atoi(sizeDigits);
IanBenzMaxim 29:590a7561318b 377 if (dataFinishedSize == 0)
IanBenzMaxim 29:590a7561318b 378 {
IanBenzMaxim 29:590a7561318b 379 state = Reset;
IanBenzMaxim 29:590a7561318b 380 }
IanBenzMaxim 29:590a7561318b 381 else
IanBenzMaxim 29:590a7561318b 382 {
IanBenzMaxim 29:590a7561318b 383 index = 0;
IanBenzMaxim 29:590a7561318b 384 state = Data;
IanBenzMaxim 29:590a7561318b 385 }
IanBenzMaxim 29:590a7561318b 386 }
IanBenzMaxim 29:590a7561318b 387 else
IanBenzMaxim 29:590a7561318b 388 {
IanBenzMaxim 29:590a7561318b 389 state = Reset;
IanBenzMaxim 29:590a7561318b 390 }
IanBenzMaxim 29:590a7561318b 391 break;
IanBenzMaxim 29:590a7561318b 392
IanBenzMaxim 29:590a7561318b 393 case Data:
IanBenzMaxim 29:590a7561318b 394 if (index < dataFinishedSize)
IanBenzMaxim 29:590a7561318b 395 {
IanBenzMaxim 29:590a7561318b 396 recvIpDataBuffer.push(received);
IanBenzMaxim 29:590a7561318b 397 index++;
IanBenzMaxim 29:590a7561318b 398 }
IanBenzMaxim 29:590a7561318b 399 else
IanBenzMaxim 29:590a7561318b 400 {
IanBenzMaxim 29:590a7561318b 401 state = Reset;
IanBenzMaxim 29:590a7561318b 402 }
IanBenzMaxim 29:590a7561318b 403 break;
IanBenzMaxim 29:590a7561318b 404 };
IanBenzMaxim 29:590a7561318b 405 }
IanBenzMaxim 29:590a7561318b 406
IanBenzMaxim 29:590a7561318b 407 void ESP8266::parseRecvConnClosedMsg(const char received)
IanBenzMaxim 29:590a7561318b 408 {
IanBenzMaxim 29:590a7561318b 409 static const char findChars[] = "CLOSED";
IanBenzMaxim 29:590a7561318b 410
IanBenzMaxim 29:590a7561318b 411 static int index = 0;
IanBenzMaxim 29:590a7561318b 412
IanBenzMaxim 29:590a7561318b 413 bool shouldReset = parseRecvReset;
IanBenzMaxim 29:590a7561318b 414
IanBenzMaxim 29:590a7561318b 415 if (received == findChars[index])
IanBenzMaxim 29:590a7561318b 416 {
IanBenzMaxim 29:590a7561318b 417 if (findChars[++index] == '\0')
IanBenzMaxim 29:590a7561318b 418 {
IanBenzMaxim 29:590a7561318b 419 printDbgMsg(findChars);
IanBenzMaxim 29:590a7561318b 420 shouldReset = true;
IanBenzMaxim 29:590a7561318b 421 }
IanBenzMaxim 29:590a7561318b 422 }
IanBenzMaxim 29:590a7561318b 423 else
IanBenzMaxim 29:590a7561318b 424 {
IanBenzMaxim 29:590a7561318b 425 shouldReset = true;
IanBenzMaxim 29:590a7561318b 426 }
IanBenzMaxim 29:590a7561318b 427
IanBenzMaxim 29:590a7561318b 428 if (shouldReset)
IanBenzMaxim 29:590a7561318b 429 {
IanBenzMaxim 29:590a7561318b 430 index = 0;
IanBenzMaxim 29:590a7561318b 431 }
IanBenzMaxim 29:590a7561318b 432 }
IanBenzMaxim 29:590a7561318b 433
IanBenzMaxim 29:590a7561318b 434 void ESP8266::printDbgMsg(const char * message)
IanBenzMaxim 29:590a7561318b 435 {
IanBenzMaxim 29:590a7561318b 436 if (debugMsg != NULL)
IanBenzMaxim 29:590a7561318b 437 debugMsg->printf("%s", message);
IanBenzMaxim 29:590a7561318b 438 }
IanBenzMaxim 29:590a7561318b 439
IanBenzMaxim 29:590a7561318b 440 ESP8266::CmdBuilder::CmdBuilder(const std::string & cmd)
IanBenzMaxim 29:590a7561318b 441 {
IanBenzMaxim 29:590a7561318b 442 clear(cmd);
IanBenzMaxim 29:590a7561318b 443 }
IanBenzMaxim 29:590a7561318b 444
IanBenzMaxim 29:590a7561318b 445 void ESP8266::CmdBuilder::clear(const std::string & cmd)
IanBenzMaxim 29:590a7561318b 446 {
IanBenzMaxim 29:590a7561318b 447 numArgs = 0;
IanBenzMaxim 29:590a7561318b 448 cmdStream.str("");
IanBenzMaxim 29:590a7561318b 449
IanBenzMaxim 29:590a7561318b 450 cmdStream << "AT";
IanBenzMaxim 29:590a7561318b 451 if (cmd != "")
IanBenzMaxim 29:590a7561318b 452 cmdStream << "+" << cmd;
IanBenzMaxim 29:590a7561318b 453 }
IanBenzMaxim 29:590a7561318b 454
IanBenzMaxim 29:590a7561318b 455 void ESP8266::CmdBuilder::addStringArgument(const std::string & arg)
IanBenzMaxim 29:590a7561318b 456 {
IanBenzMaxim 29:590a7561318b 457 std::ostringstream argStream;
IanBenzMaxim 29:590a7561318b 458 argStream << "\"" << arg << "\"";
IanBenzMaxim 29:590a7561318b 459 addRawArgument<std::string>(argStream.str());
IanBenzMaxim 29:590a7561318b 460 }
IanBenzMaxim 29:590a7561318b 461
IanBenzMaxim 29:590a7561318b 462 std::string ESP8266::CmdBuilder::str() const
IanBenzMaxim 29:590a7561318b 463 {
IanBenzMaxim 29:590a7561318b 464 std::string cmdString = cmdStream.str();
IanBenzMaxim 29:590a7561318b 465 cmdString.append("\r\n");
IanBenzMaxim 29:590a7561318b 466 return cmdString;
IanBenzMaxim 29:590a7561318b 467 }