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.

Revision:
29:590a7561318b
Parent:
28:e5cdaf13d299
Child:
30:0784010d6975
--- a/esp8266-driver/ESP8266Interface.cpp	Thu Jan 26 14:18:21 2017 -0600
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,282 +0,0 @@
-/* ESP8266 implementation of NetworkInterfaceAPI
- * Copyright (c) 2015 ARM Limited
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <string.h>
-#include "ESP8266Interface.h"
-
-// Various timeouts for different ESP8266 operations
-#define ESP8266_CONNECT_TIMEOUT 15000
-#define ESP8266_SEND_TIMEOUT    500
-#define ESP8266_RECV_TIMEOUT    0
-#define ESP8266_MISC_TIMEOUT    500
-
-// ESP8266Interface implementation
-ESP8266Interface::ESP8266Interface(PinName tx, PinName rx, bool debug)
-    : _esp(tx, rx, debug)
-{
-    memset(_ids, 0, sizeof(_ids));
-    memset(_cbs, 0, sizeof(_cbs));
-
-    _esp.attach(this, &ESP8266Interface::event);
-}
-
-int ESP8266Interface::connect(const char *ssid, const char *pass, nsapi_security_t security,
-                                        uint8_t channel)
-{
-    if (channel != 0) {
-        return NSAPI_ERROR_UNSUPPORTED;
-    }
-
-    set_credentials(ssid, pass, security);
-    return connect();
-}
-
-int ESP8266Interface::connect()
-{
-    _esp.setTimeout(ESP8266_CONNECT_TIMEOUT);
-
-    if (!_esp.startup(3)) {
-        return NSAPI_ERROR_DEVICE_ERROR;
-    }
-
-    if (!_esp.dhcp(true, 1)) {
-        return NSAPI_ERROR_DHCP_FAILURE;
-    }
-
-    if (!_esp.connect(ap_ssid, ap_pass)) {
-        return NSAPI_ERROR_NO_CONNECTION;
-    }
-
-    if (!_esp.getIPAddress()) {
-        return NSAPI_ERROR_DHCP_FAILURE;
-    }
-
-    return NSAPI_ERROR_OK;
-}
-
-int ESP8266Interface::set_credentials(const char *ssid, const char *pass, nsapi_security_t security)
-{
-    memset(ap_ssid, 0, sizeof(ap_ssid));
-    strncpy(ap_ssid, ssid, sizeof(ap_ssid));
-
-    memset(ap_pass, 0, sizeof(ap_pass));
-    strncpy(ap_pass, pass, sizeof(ap_pass));
-
-    ap_sec = security;
-
-    return 0;
-}
-
-int ESP8266Interface::set_channel(uint8_t channel)
-{
-    return NSAPI_ERROR_UNSUPPORTED;
-}
-
-
-int ESP8266Interface::disconnect()
-{
-    _esp.setTimeout(ESP8266_MISC_TIMEOUT);
-
-    if (!_esp.disconnect()) {
-        return NSAPI_ERROR_DEVICE_ERROR;
-    }
-
-    return NSAPI_ERROR_OK;
-}
-
-const char *ESP8266Interface::get_ip_address()
-{
-    return _esp.getIPAddress();
-}
-
-const char *ESP8266Interface::get_mac_address()
-{
-    return _esp.getMACAddress();
-}
-
-const char *ESP8266Interface::get_gateway()
-{
-    return _esp.getGateway();
-}
-
-const char *ESP8266Interface::get_netmask()
-{
-    return _esp.getNetmask();
-}
-
-int8_t ESP8266Interface::get_rssi()
-{
-    return _esp.getRSSI();
-}
-
-int ESP8266Interface::scan(WiFiAccessPoint *res, unsigned count)
-{
-    return _esp.scan(res, count);
-}
-
-struct esp8266_socket {
-    int id;
-    nsapi_protocol_t proto;
-    bool connected;
-    SocketAddress addr;
-};
-
-int ESP8266Interface::socket_open(void **handle, nsapi_protocol_t proto)
-{
-    // Look for an unused socket
-    int id = -1;
- 
-    for (int i = 0; i < ESP8266_SOCKET_COUNT; i++) {
-        if (!_ids[i]) {
-            id = i;
-            _ids[i] = true;
-            break;
-        }
-    }
- 
-    if (id == -1) {
-        return NSAPI_ERROR_NO_SOCKET;
-    }
-    
-    struct esp8266_socket *socket = new struct esp8266_socket;
-    if (!socket) {
-        return NSAPI_ERROR_NO_SOCKET;
-    }
-    
-    socket->id = id;
-    socket->proto = proto;
-    socket->connected = false;
-    *handle = socket;
-    return 0;
-}
-
-int ESP8266Interface::socket_close(void *handle)
-{
-    struct esp8266_socket *socket = (struct esp8266_socket *)handle;
-    int err = 0;
-    _esp.setTimeout(ESP8266_MISC_TIMEOUT);
- 
-    if (!_esp.close(socket->id)) {
-        err = NSAPI_ERROR_DEVICE_ERROR;
-    }
-
-    _ids[socket->id] = false;
-    delete socket;
-    return err;
-}
-
-int ESP8266Interface::socket_bind(void *handle, const SocketAddress &address)
-{
-    return NSAPI_ERROR_UNSUPPORTED;
-}
-
-int ESP8266Interface::socket_listen(void *handle, int backlog)
-{
-    return NSAPI_ERROR_UNSUPPORTED;
-}
-
-int ESP8266Interface::socket_connect(void *handle, const SocketAddress &addr)
-{
-    struct esp8266_socket *socket = (struct esp8266_socket *)handle;
-    _esp.setTimeout(ESP8266_MISC_TIMEOUT);
-
-    const char *proto = (socket->proto == NSAPI_UDP) ? "UDP" : "TCP";
-    if (!_esp.open(proto, socket->id, addr.get_ip_address(), addr.get_port())) {
-        return NSAPI_ERROR_DEVICE_ERROR;
-    }
-    
-    socket->connected = true;
-    return 0;
-}
-    
-int ESP8266Interface::socket_accept(void *server, void **socket, SocketAddress *addr)
-{
-    return NSAPI_ERROR_UNSUPPORTED;
-}
-
-int ESP8266Interface::socket_send(void *handle, const void *data, unsigned size)
-{
-    struct esp8266_socket *socket = (struct esp8266_socket *)handle;
-    _esp.setTimeout(ESP8266_SEND_TIMEOUT);
- 
-    if (!_esp.send(socket->id, data, size)) {
-        return NSAPI_ERROR_DEVICE_ERROR;
-    }
- 
-    return size;
-}
-
-int ESP8266Interface::socket_recv(void *handle, void *data, unsigned size)
-{
-    struct esp8266_socket *socket = (struct esp8266_socket *)handle;
-    _esp.setTimeout(ESP8266_RECV_TIMEOUT);
- 
-    int32_t recv = _esp.recv(socket->id, data, size);
-    if (recv < 0) {
-        return NSAPI_ERROR_WOULD_BLOCK;
-    }
- 
-    return recv;
-}
-
-int ESP8266Interface::socket_sendto(void *handle, const SocketAddress &addr, const void *data, unsigned size)
-{
-    struct esp8266_socket *socket = (struct esp8266_socket *)handle;
-
-    if (socket->connected && socket->addr != addr) {
-        _esp.setTimeout(ESP8266_MISC_TIMEOUT);
-        if (!_esp.close(socket->id)) {
-            return NSAPI_ERROR_DEVICE_ERROR;
-        }
-        socket->connected = false;
-    }
-
-    if (!socket->connected) {
-        int err = socket_connect(socket, addr);
-        if (err < 0) {
-            return err;
-        }
-        socket->addr = addr;
-    }
-    
-    return socket_send(socket, data, size);
-}
-
-int ESP8266Interface::socket_recvfrom(void *handle, SocketAddress *addr, void *data, unsigned size)
-{
-    struct esp8266_socket *socket = (struct esp8266_socket *)handle;
-    int ret = socket_recv(socket, data, size);
-    if (ret >= 0 && addr) {
-        *addr = socket->addr;
-    }
-
-    return ret;
-}
-
-void ESP8266Interface::socket_attach(void *handle, void (*callback)(void *), void *data)
-{
-    struct esp8266_socket *socket = (struct esp8266_socket *)handle;    
-    _cbs[socket->id].callback = callback;
-    _cbs[socket->id].data = data;
-}
-
-void ESP8266Interface::event() {
-    for (int i = 0; i < ESP8266_SOCKET_COUNT; i++) {
-        if (_cbs[i].callback) {
-            _cbs[i].callback(_cbs[i].data);
-        }
-    }
-}