Demo application for using the AT&T IoT Starter Kit Powered by AWS.

Dependencies:   SDFileSystem

Fork of ATT_AWS_IoT_demo by Anthony Phillips

IoT Starter Kit Powered by AWS Demo

This program demonstrates the AT&T IoT Starter Kit sending data directly into AWS IoT. It's explained and used in the Getting Started with the IoT Starter Kit Powered by AWS on starterkit.att.com.

What's required

  • AT&T IoT LTE Add-on (also known as the Cellular Shield)
  • NXP K64F - for programming
  • microSD card - used to store your AWS security credentials
  • AWS account
  • Python, locally installed

If you don't already have an IoT Starter Kit, you can purchase a kit here. The IoT Starter Kit Powered by AWS includes the LTE cellular shield, K64F, and a microSD card.

Committer:
rfinn
Date:
Tue Feb 07 16:18:57 2017 +0000
Revision:
27:2f486c766854
Parent:
23:b9ff83dc965f
changed SDFileSystem library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ampembeng 15:6f2798e45099 1 /**
ampembeng 15:6f2798e45099 2 * @file timer.c
ampembeng 15:6f2798e45099 3 * @brief mbed-os implementation of the network interface needed for AWS.
ampembeng 15:6f2798e45099 4 */
ampembeng 18:6370da1de572 5 #include <stdlib.h> /* atoi */
ampembeng 15:6f2798e45099 6 #include "network_interface.h"
ampembeng 15:6f2798e45099 7 #include "EthernetInterface.h"
ampembeng 15:6f2798e45099 8
ampembeng 15:6f2798e45099 9 #include "aws_iot_config.h"
ampembeng 15:6f2798e45099 10 #include "aws_iot_log.h"
ampembeng 15:6f2798e45099 11
ampembeng 15:6f2798e45099 12 #include "mbedtls/net_sockets.h"
ampembeng 15:6f2798e45099 13
ampembeng 15:6f2798e45099 14 //=====================================================================================================================
ampembeng 15:6f2798e45099 15 //
ampembeng 15:6f2798e45099 16 // Uses Avnet Sheild (AT&T wireless LTE)
ampembeng 15:6f2798e45099 17 //
ampembeng 15:6f2798e45099 18 //=====================================================================================================================
ampembeng 15:6f2798e45099 19 #ifdef USING_AVNET_SHIELD
ampembeng 15:6f2798e45099 20 #include "WNCInterface.h"
ampembeng 15:6f2798e45099 21 #include "WNCTCPSocketConnection.h"
ampembeng 15:6f2798e45099 22
ampembeng 15:6f2798e45099 23 // Expose serial for WNC boot
ampembeng 15:6f2798e45099 24 extern MODSERIAL pc;
ampembeng 23:b9ff83dc965f 25 extern char iccidName[21];
ampembeng 15:6f2798e45099 26
ampembeng 15:6f2798e45099 27 // Network socket
ampembeng 15:6f2798e45099 28 WNCTCPSocketConnection* _tcpsocket;
ampembeng 15:6f2798e45099 29
ampembeng 15:6f2798e45099 30 int net_modem_boot()
ampembeng 15:6f2798e45099 31 {
ampembeng 15:6f2798e45099 32 INFO("Booting WNC modem...");
ampembeng 15:6f2798e45099 33 int rc = -1;
ampembeng 23:b9ff83dc965f 34 string str;
ampembeng 15:6f2798e45099 35 WNCInterface eth_iface;
ampembeng 15:6f2798e45099 36
ampembeng 16:02008a2a2569 37 INFO("...Using Avnet Shield and AT&T wireless LTE");
ampembeng 15:6f2798e45099 38 rc = eth_iface.init(NULL, &pc);
ampembeng 15:6f2798e45099 39 INFO("WNC Module %s initialized (%02X).", rc?"IS":"IS NOT", rc);
ampembeng 15:6f2798e45099 40 if( !rc ) {
ampembeng 15:6f2798e45099 41 ERROR("DHCP failed.");
ampembeng 15:6f2798e45099 42 return rc;
ampembeng 15:6f2798e45099 43 }
ampembeng 15:6f2798e45099 44
ampembeng 15:6f2798e45099 45 eth_iface.connect();
ampembeng 15:6f2798e45099 46 INFO("...IP Address: %s ", eth_iface.getIPAddress());
ampembeng 23:b9ff83dc965f 47
ampembeng 23:b9ff83dc965f 48 // Get SIM card number (ICCID)
ampembeng 23:b9ff83dc965f 49 eth_iface.getICCID(&str);
ampembeng 23:b9ff83dc965f 50 strcpy(iccidName, str.c_str());
ampembeng 23:b9ff83dc965f 51 INFO("...ICCID: %s", iccidName);
ampembeng 15:6f2798e45099 52 return rc;
ampembeng 15:6f2798e45099 53 }
ampembeng 15:6f2798e45099 54
ampembeng 15:6f2798e45099 55 void mbedtls_net_init( mbedtls_net_context *ctx )
ampembeng 15:6f2798e45099 56 {
ampembeng 15:6f2798e45099 57 DEBUG("...mbedtls_net_init()");
ampembeng 15:6f2798e45099 58
ampembeng 15:6f2798e45099 59 _tcpsocket = new WNCTCPSocketConnection;
ampembeng 15:6f2798e45099 60
ampembeng 15:6f2798e45099 61 return;
ampembeng 15:6f2798e45099 62 }
ampembeng 15:6f2798e45099 63
ampembeng 15:6f2798e45099 64 int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto )
ampembeng 15:6f2798e45099 65 {
ampembeng 15:6f2798e45099 66 DEBUG("...mbedtls_net_connect");
ampembeng 15:6f2798e45099 67 int ret = -1;
ampembeng 15:6f2798e45099 68
ampembeng 15:6f2798e45099 69 /* Connect to the server */
ampembeng 15:6f2798e45099 70 INFO("Connecting with %s\r\n", host);
ampembeng 18:6370da1de572 71 ret = _tcpsocket->connect(host, atoi(port));
ampembeng 15:6f2798e45099 72
ampembeng 15:6f2798e45099 73 return ret;
ampembeng 15:6f2798e45099 74 }
ampembeng 15:6f2798e45099 75
ampembeng 15:6f2798e45099 76 int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len, uint32_t timeout )
ampembeng 15:6f2798e45099 77 {
ampembeng 15:6f2798e45099 78 DEBUG("...mbedtls_net_recv_timeout len: %d, timeout: %d", len, timeout);
ampembeng 15:6f2798e45099 79 return (int)_tcpsocket->receive((char*)buf, len);
ampembeng 15:6f2798e45099 80 }
ampembeng 15:6f2798e45099 81
ampembeng 15:6f2798e45099 82 int mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len )
ampembeng 15:6f2798e45099 83 {
ampembeng 15:6f2798e45099 84 DEBUG("...mbedtls_net_send");
ampembeng 15:6f2798e45099 85 return _tcpsocket->send((char*)buf, len);
ampembeng 15:6f2798e45099 86 }
ampembeng 15:6f2798e45099 87
ampembeng 15:6f2798e45099 88 int mbedtls_net_set_block( mbedtls_net_context *ctx )
ampembeng 15:6f2798e45099 89 {
ampembeng 16:02008a2a2569 90 DEBUG("...mbedtls_net_set_block");
ampembeng 15:6f2798e45099 91 _tcpsocket->set_blocking (false,1500);
ampembeng 15:6f2798e45099 92 return 0;
ampembeng 15:6f2798e45099 93 }
ampembeng 15:6f2798e45099 94
ampembeng 15:6f2798e45099 95 void mbedtls_net_free( mbedtls_net_context *ctx )
ampembeng 15:6f2798e45099 96 {
ampembeng 16:02008a2a2569 97 DEBUG("...mbedtls_net_free");
ampembeng 15:6f2798e45099 98 return;
ampembeng 15:6f2798e45099 99 }
ampembeng 16:02008a2a2569 100 #endif
ampembeng 15:6f2798e45099 101
ampembeng 15:6f2798e45099 102 //=====================================================================================================================
ampembeng 15:6f2798e45099 103 //
ampembeng 15:6f2798e45099 104 // Uses FRDM-K64F wired ethernet
ampembeng 15:6f2798e45099 105 //
ampembeng 15:6f2798e45099 106 //=====================================================================================================================
ampembeng 16:02008a2a2569 107 #ifdef USING_FRDM_K64F_LWIP
ampembeng 15:6f2798e45099 108 // Network Socket
ampembeng 15:6f2798e45099 109 TCPSocket* _tcpsocket;
ampembeng 15:6f2798e45099 110
ampembeng 15:6f2798e45099 111 int net_modem_boot()
ampembeng 15:6f2798e45099 112 {
ampembeng 23:b9ff83dc965f 113 // Do nothing
ampembeng 23:b9ff83dc965f 114 return 0;
ampembeng 15:6f2798e45099 115 }
ampembeng 15:6f2798e45099 116
ampembeng 15:6f2798e45099 117 void mbedtls_net_init( mbedtls_net_context *ctx )
ampembeng 15:6f2798e45099 118 {
ampembeng 15:6f2798e45099 119 DEBUG("...mbedtls_net_init()");
ampembeng 15:6f2798e45099 120 EthernetInterface eth_iface;
ampembeng 15:6f2798e45099 121
ampembeng 15:6f2798e45099 122 eth_iface.connect();
ampembeng 15:6f2798e45099 123 INFO("...Using FRDM-K64F Ethernet LWIP");
ampembeng 15:6f2798e45099 124 const char *ip_addr = eth_iface.get_ip_address();
ampembeng 15:6f2798e45099 125 if (ip_addr) {
ampembeng 15:6f2798e45099 126 INFO("...Client IP Address is %s", ip_addr);
ampembeng 15:6f2798e45099 127 } else {
ampembeng 15:6f2798e45099 128 INFO("...No Client IP Address");
ampembeng 15:6f2798e45099 129 }
ampembeng 15:6f2798e45099 130 _tcpsocket = new TCPSocket(&eth_iface);
ampembeng 15:6f2798e45099 131
ampembeng 15:6f2798e45099 132 return;
ampembeng 15:6f2798e45099 133 }
ampembeng 15:6f2798e45099 134
ampembeng 15:6f2798e45099 135 int mbedtls_net_connect( mbedtls_net_context *ctx, const char *host, const char *port, int proto )
ampembeng 15:6f2798e45099 136 {
ampembeng 15:6f2798e45099 137 DEBUG("...mbedtls_net_connect");
ampembeng 15:6f2798e45099 138 int ret;
ampembeng 15:6f2798e45099 139
ampembeng 15:6f2798e45099 140 INFO("...Connecting with %s", host);
ampembeng 18:6370da1de572 141 ret = _tcpsocket->connect(host, atoi(port));
ampembeng 15:6f2798e45099 142 if (ret != NSAPI_ERROR_OK) {
ampembeng 15:6f2798e45099 143 ERROR("Failed to connect");
ampembeng 15:6f2798e45099 144 return ret;
ampembeng 15:6f2798e45099 145 }
ampembeng 15:6f2798e45099 146
ampembeng 15:6f2798e45099 147 INFO("...Connected to Amazon!");
ampembeng 15:6f2798e45099 148 return ret;
ampembeng 15:6f2798e45099 149 }
ampembeng 15:6f2798e45099 150
ampembeng 15:6f2798e45099 151 int mbedtls_net_recv_timeout( void *ctx, unsigned char *buf, size_t len, uint32_t timeout )
ampembeng 15:6f2798e45099 152 {
ampembeng 15:6f2798e45099 153 DEBUG("...mbedtls_net_recv_timeout len: %d, timeout: %d", len, timeout);
ampembeng 16:02008a2a2569 154 int recv = -1;
ampembeng 15:6f2798e45099 155
ampembeng 15:6f2798e45099 156 _tcpsocket->set_timeout(timeout);
ampembeng 15:6f2798e45099 157 recv = _tcpsocket->recv(buf, len);
ampembeng 15:6f2798e45099 158
ampembeng 15:6f2798e45099 159 if(NSAPI_ERROR_WOULD_BLOCK == recv ||
ampembeng 15:6f2798e45099 160 recv == 0){
ampembeng 15:6f2798e45099 161 DEBUG("...NSAPI_ERROR_WOULD_BLOCK");
ampembeng 15:6f2798e45099 162 return 0;
ampembeng 15:6f2798e45099 163 }else if(recv < 0){
ampembeng 15:6f2798e45099 164 ERROR("...RECV FAIL");
ampembeng 15:6f2798e45099 165 return -1;
ampembeng 15:6f2798e45099 166 }else{
ampembeng 15:6f2798e45099 167 DEBUG("...RECV OK: %d, %d", len, recv);
ampembeng 15:6f2798e45099 168 return recv;
ampembeng 15:6f2798e45099 169 }
ampembeng 15:6f2798e45099 170 }
ampembeng 15:6f2798e45099 171
ampembeng 15:6f2798e45099 172 int mbedtls_net_send( void *ctx, const unsigned char *buf, size_t len )
ampembeng 15:6f2798e45099 173 {
ampembeng 16:02008a2a2569 174 DEBUG("...mbedtls_net_send");
ampembeng 15:6f2798e45099 175 int size = -1;
ampembeng 16:02008a2a2569 176
ampembeng 15:6f2798e45099 177 size = _tcpsocket->send(buf, len);
ampembeng 15:6f2798e45099 178
ampembeng 15:6f2798e45099 179 if(NSAPI_ERROR_WOULD_BLOCK == size){
ampembeng 15:6f2798e45099 180 DEBUG("...SEND OK, len = %d", len);
ampembeng 15:6f2798e45099 181 return len;
ampembeng 15:6f2798e45099 182 }else if(size < 0){
ampembeng 15:6f2798e45099 183 ERROR("...SEND FAIL");
ampembeng 15:6f2798e45099 184 return -1;
ampembeng 15:6f2798e45099 185 }else{
ampembeng 15:6f2798e45099 186 DEBUG("...SEND OK, size = %d", size);
ampembeng 15:6f2798e45099 187 return size;
ampembeng 15:6f2798e45099 188 }
ampembeng 15:6f2798e45099 189 }
ampembeng 15:6f2798e45099 190
ampembeng 15:6f2798e45099 191 int mbedtls_net_set_block( mbedtls_net_context *ctx )
ampembeng 15:6f2798e45099 192 {
ampembeng 16:02008a2a2569 193 DEBUG("...mbedtls_net_set_block");
ampembeng 15:6f2798e45099 194 _tcpsocket->set_blocking(false);
ampembeng 15:6f2798e45099 195 return 0;
ampembeng 15:6f2798e45099 196 }
ampembeng 15:6f2798e45099 197
ampembeng 15:6f2798e45099 198 void mbedtls_net_free( mbedtls_net_context *ctx )
ampembeng 15:6f2798e45099 199 {
ampembeng 16:02008a2a2569 200 DEBUG("...mbedtls_net_free");
ampembeng 15:6f2798e45099 201 return;
ampembeng 15:6f2798e45099 202 }
ampembeng 15:6f2798e45099 203 #endif