Example of AWS IoT connection and Web Dashboard thru STM32 Nucleo evaluation board and mbed OS.

Dependencies:   X_NUCLEO_IKS01A1 mbed FP MQTTPacket DnsQuery ATParser

Introduction

The demo is aimed to STM32 Nucleo board with WiFi and sensors expansions. The board is a "thing" for the AWS IoT service. It updates IoT service shadow with sensors data every second and checks subscription messages.

Hardware Configuration

https://github.com/Klika-Tech/nucleo-aws-iot-demo/raw/master/doc/assets/device.jpg

Software Configuration

  • Import this Project to mbed online compiler
  • Find the next part of code in main.cpp file ...

WiFi network credential

#include "mbed.h"
// WiFi network credential
#define SSID   ""  // Network must be visible otherwise it can't connect
#define PASSW  ""
#error "Wifi SSID & password empty"
  • ... And set it to your Network Name and Password. Do not forget to remove "#error" pragma line.

Information

Nucleo WiFi module is not the same as your smartphone or laptope - it is based on demo board. To avoid connection problems:

  1. Place Nucleo as close to WiFi hot spot as possible. Or...
  2. Turn on mobile hot spot in your laptop as close to the device as possible.
  3. Make sure that hot spot permits 2.4 GHz band communications
  • Setup BackEnd and store certificates using this backend setup instruction
  • Find AWS_IOT_MQTT_HOST define and change it to HTTPS point mentioned in your AWS IoT thing properties named "interact"

#define AWS_IOT_MQTT_HOST              "xxxxxxxxxx.iot.us-east-1.amazonaws.com" //Use your own host.
  • Find the certificate defines clientCRT and clientKey in main.cpp file and change it to ones provided by Amazon.

/**********************************************************************************************
***********************************************************************************************
				Device Identity Certificates: Modify for your AWS IoT Thing
***********************************************************************************************
***********************************************************************************************/

/****************************************
(somecode)-certificate.pem.crt - Amazon signed PEM sertificate.
*****************************************/

//This Client cert is example. Use own instead.
const uint8_t clientCRT[] = "\
-----BEGIN CERTIFICATE-----\n\
MIIDBjCCAe6gAwIBAgIUVph856omeIxW3UPioq+UrX1DbwowDQYJKoZIhvcNAQEL\
BQAwTTFLMEkGA1UECwxCQW1hem9uIFdlYiBTZXJ2aWNlcyBPPUFtYXpvbi5jb20g\
SW5jLiBMPVNlYXR0bGUgU1Q9V2FzaGluZ3RvbiBDPVVTMB4XDTE3MDUyNTExNTEy\
OVoXDTQ5MTIzMTIzNTk1OVowgZUxCzAJBgNVBAYTAkJZMQ4wDAYDVQQIDAVNaW5z\
azEOMAwGA1UEBwwFTWluc2sxFzAVBgNVBAoMDktsaWthLVRlY2ggTExDMRcwFQYD\
VQQLDA5LbGlrYS1UZWNoIExMQzEMMAoGA1UEAwwDUm5EMSYwJAYJKoZIhvcNAQkB\
FhdtdmF0YWxldUBrbGlrYS10ZWNoLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEH\
A0IABCJgOQJmoTBJVPfli9Hm/JVixaxkY5rtlgrYO3hSl633A2hg0P/ue0wXDbF3\
aQ0X57IRFE4k4FEbr3UXjT/IczKjYDBeMB8GA1UdIwQYMBaAFK3YzTUPlYB2Li75\
i/z8rEogr1d6MB0GA1UdDgQWBBT18HXBaXFJuAR/0SwegnxJ+pyJ6TAMBgNVHRMB\
Af8EAjAAMA4GA1UdDwEB/wQEAwIHgDANBgkqhkiG9w0BAQsFAAOCAQEAb0Ux1aH5\
RLxjrfGqXN6rPVqh8QQRS+AyBfzmaQN8HaPZMkX5WxXLvcn0A3uWlwQxPPkcZ4zf\
51GHtFFQWB4YZ8dx8mUQ0v/j7onHjCJgZ8iDgwOyKMGtnsDZWCakQw+a6cj+NrMZ\
tzhjwCzEEP6ePcbXwErI5OOzLuWns2L/JEr2wWNkokgRuS8ewr/SQ9OLWIWa2rFM\
ahPNTb3y/qBeWdjeJmhI+TOxdqIpsF8roWP25zwo/zkzCHCjXFBrL+0CA4MpxIl9\
x02i7aAhlJ6ys80lDxdeWeeQJXRKkGknP8mcmKn3iEqqJ5s1dQePj2b5d3ldatya\
wsxQBqqZXzIWEw==\
\n\
-----END CERTIFICATE-----\n";



/**********************************************************************************************
***********************************************************************************************
						Private Key: Modify for your AWS IoT Thing
***********************************************************************************************
***********************************************************************************************/

/********************************************************************8****************************************
nucleo.key.pem - client key generated according to readme.
**************************************************************************************************************/

//This Client Key is example. Use own instead.
const uint8_t clientKey[] ="\
-----BEGIN EC PARAMETERS-----\n\
BggqhkjOPQMBBw==\
-----END EC PARAMETERS-----\n\
-----BEGIN EC PRIVATE KEY-----\n\
MHcCAQEEIHPRfWSC8/k/BsqDWKuP15dXsI9fGwpkTIsLZe6mIrAAoAoGCCqGSM49\
AwEHoUQDQgAEImA5AmahMElU9+WL0eb8lWLFrGRjmu2WCtg7eFKXrfcDaGDQ/+57\
TBcNsXdpDRfnshEUTiTgURuvdReNP8hzMg==\
-----END EC PRIVATE KEY-----\n";

Build and Check

  1. Plugin your board to USB of your PC. USB Disk Drive and USB COM Port should appear in your system.
  2. Open any Serial Console, connect it to your USB Serial Port and setup speed equal to 115200.
  3. Compile this Project and save .bin file to USB Disk Drive
  4. After board reset you should see next log in serial console:

X-NUCLEO-IDW01M1 mbed Application

connecting to AP
LOG:   int main() L#361 Connected to WiFI.
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#186 =====================================
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#187 Connecting WiFi.
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#188 Nucleo IP ADDRESS: X.X.X.X
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#189 Nucleo MAC ADDRESS: 00:11:22:33:44:55
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#190 Server Hostname: xxxxxxxx.iot.us-east-1.amazonaws.com port: 8883
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#191 Client ID: Nucleo
LOG:   int connect(MQTT::Client<MQTTWiFi, Countdown, 350, 5> *, MQTTWiFi *) L#194 =====================================
LOG:   int MQTTSocket::getNTPtime(int) L#58 Success receiving time from ntp server. Tick from 1 Jan 1970 is equal to 1505399292.
--->TCP Connected
--->MQTT Connected
--->>>MQTT subscribed to: Nucleo/test
Length - 245, Publishing {"state": {"reported": {"temperature": 23.690001, "humidity": 98.190002, "pressure": 982.869141, "accelerometer": [-0.009000, 0.030000, 0.971000], "gyroscope": [0.420000, -2.660000, 1.750000], "magnetometer": [-3.600000, -7.100000, 53.300000]}}}
Length - 245, Publishing {"state": {"reported": {"temperature": 23.660000, "humidity": 98.010002, "pressure": 982.770264, "accelerometer": [-0.009000, 0.030000, 0.971000], "gyroscope": [0.770000, -2.310000, 1.470000], "magnetometer": [-3.100000, -8.300000, 54.200000]}}}
Length - 245, Publishing {"state": {"reported": {"temperature": 23.670000, "humidity": 98.129997, "pressure": 982.724121, "accelerometer": [-0.008000, 0.029000, 0.971000], "gyroscope": [0.630000, -2.380000, 1.400000], "magnetometer": [-3.100000, -7.900000, 53.400000]}}}
Length - 245, Publishing {"state": {"reported": {"temperature": 23.690001, "humidity": 98.019997, "pressure": 982.840088, "accelerometer": [-0.009000, 0.030000, 0.972000], "gyroscope": [0.700000, -2.450000, 1.540000], "magnetometer": [-3.700000, -7.900000, 53.400000]}}}
Length - 245, Publishing {"state": {"reported": {"temperature": 23.709999, "humidity": 98.040001, "pressure": 982.828613, "accelerometer": [-0.009000, 0.030000, 0.971000], "gyroscope": [0.630000, -2.520000, 1.470000], "magnetometer": [-2.900000, -7.400000, 52.400000]}}}
Length - 245, Publishing {"state": {"reported": {"temperature": 23.719999, "humidity": 97.860001, "pressure": 982.917236, "accelerometer": [-0.026000, 0.103000, 0.891000], "gyroscope": [1.050000, -2.310000, 1.260000], "magnetometer": [-3.300000, -7.100000, 53.500000]}}}

Information

Device connection state might be checked by Green Led on the board. Green light means that device is connected and transferring data to cloud.

  1. Configure and start your dashboard using instruction and corresponding sources from github
  2. Use Blue button to set up markers to charts.
  3. Use AWS IoT console MQTT Client to test device subscription to "Nucleo/test". Just publish any message to this topic and serial port output.
  4. PROFIT!
Committer:
PavelSavyhin
Date:
Wed Sep 27 14:40:52 2017 +0300
Revision:
0:4cdaf9b1e7d0
Child:
1:042ca9148926
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
PavelSavyhin 0:4cdaf9b1e7d0 1 #if !defined(MQTTSOCKET_H)
PavelSavyhin 0:4cdaf9b1e7d0 2 #define MQTTSOCKET_H
PavelSavyhin 0:4cdaf9b1e7d0 3
PavelSavyhin 0:4cdaf9b1e7d0 4 #include "MQTTmbed.h"
PavelSavyhin 0:4cdaf9b1e7d0 5 #include "TCPSocket.h"
PavelSavyhin 0:4cdaf9b1e7d0 6
PavelSavyhin 0:4cdaf9b1e7d0 7 class MQTTSocket
PavelSavyhin 0:4cdaf9b1e7d0 8 {
PavelSavyhin 0:4cdaf9b1e7d0 9 public:
PavelSavyhin 0:4cdaf9b1e7d0 10
PavelSavyhin 0:4cdaf9b1e7d0 11 MQTTSocket(): mysock(true)
PavelSavyhin 0:4cdaf9b1e7d0 12 {
PavelSavyhin 0:4cdaf9b1e7d0 13
PavelSavyhin 0:4cdaf9b1e7d0 14 }
PavelSavyhin 0:4cdaf9b1e7d0 15
PavelSavyhin 0:4cdaf9b1e7d0 16 int open(NetworkStack *ipstack)
PavelSavyhin 0:4cdaf9b1e7d0 17 {
PavelSavyhin 0:4cdaf9b1e7d0 18 _time_last_ticks = 0;
PavelSavyhin 0:4cdaf9b1e7d0 19 timesock.open(ipstack);
PavelSavyhin 0:4cdaf9b1e7d0 20 return mysock.open(ipstack);
PavelSavyhin 0:4cdaf9b1e7d0 21 }
PavelSavyhin 0:4cdaf9b1e7d0 22
PavelSavyhin 0:4cdaf9b1e7d0 23 int getNTPtime(int timeout=1000)
PavelSavyhin 0:4cdaf9b1e7d0 24 {
PavelSavyhin 0:4cdaf9b1e7d0 25 int err;
PavelSavyhin 0:4cdaf9b1e7d0 26
PavelSavyhin 0:4cdaf9b1e7d0 27 uint8_t timedata[4];
PavelSavyhin 0:4cdaf9b1e7d0 28
PavelSavyhin 0:4cdaf9b1e7d0 29 timesock.set_timeout(timeout*3);
PavelSavyhin 0:4cdaf9b1e7d0 30 do
PavelSavyhin 0:4cdaf9b1e7d0 31 {
PavelSavyhin 0:4cdaf9b1e7d0 32 err= timesock.connect("time-d.nist.gov", 37);
PavelSavyhin 0:4cdaf9b1e7d0 33
PavelSavyhin 0:4cdaf9b1e7d0 34 if (err != 0)
PavelSavyhin 0:4cdaf9b1e7d0 35 {
PavelSavyhin 0:4cdaf9b1e7d0 36 LOG("ERROR resolving ntp server IP and connecting to it! \r\n");
PavelSavyhin 0:4cdaf9b1e7d0 37 }
PavelSavyhin 0:4cdaf9b1e7d0 38 } while (err != 0);
PavelSavyhin 0:4cdaf9b1e7d0 39
PavelSavyhin 0:4cdaf9b1e7d0 40 while (err != 4)
PavelSavyhin 0:4cdaf9b1e7d0 41 {
PavelSavyhin 0:4cdaf9b1e7d0 42 err = timesock.recv((char*)timedata, 4);
PavelSavyhin 0:4cdaf9b1e7d0 43
PavelSavyhin 0:4cdaf9b1e7d0 44 if (err != 4)
PavelSavyhin 0:4cdaf9b1e7d0 45 {
PavelSavyhin 0:4cdaf9b1e7d0 46 LOG("ERROR receiving time from ntp server! \r\n");
PavelSavyhin 0:4cdaf9b1e7d0 47 //return -1;
PavelSavyhin 0:4cdaf9b1e7d0 48 }
PavelSavyhin 0:4cdaf9b1e7d0 49 else
PavelSavyhin 0:4cdaf9b1e7d0 50 {
PavelSavyhin 0:4cdaf9b1e7d0 51 ///
PavelSavyhin 0:4cdaf9b1e7d0 52 /// Time Protocol provides the time as a binary number of seconds since 1900,
PavelSavyhin 0:4cdaf9b1e7d0 53 ///
PavelSavyhin 0:4cdaf9b1e7d0 54 /// 2,208,988,800 corresponds to 00:00 1 Jan 1970 GMT from 12:00:01 am on 1 January 1900 GMT
PavelSavyhin 0:4cdaf9b1e7d0 55 ///
PavelSavyhin 0:4cdaf9b1e7d0 56 _time_last_ticks = ((timedata[0]<<24 )|(timedata[1]<<16)|(timedata[2]<<8)| timedata[3]) - 2208988800ul;
PavelSavyhin 0:4cdaf9b1e7d0 57
PavelSavyhin 0:4cdaf9b1e7d0 58 LOG("Success receiving time from ntp server. Tick from 1 Jan 1970 is equal to %d. \r\n", _time_last_ticks);
PavelSavyhin 0:4cdaf9b1e7d0 59
PavelSavyhin 0:4cdaf9b1e7d0 60 }
PavelSavyhin 0:4cdaf9b1e7d0 61 }
PavelSavyhin 0:4cdaf9b1e7d0 62
PavelSavyhin 0:4cdaf9b1e7d0 63 err = timesock.close();
PavelSavyhin 0:4cdaf9b1e7d0 64
PavelSavyhin 0:4cdaf9b1e7d0 65 return err;
PavelSavyhin 0:4cdaf9b1e7d0 66 }
PavelSavyhin 0:4cdaf9b1e7d0 67
PavelSavyhin 0:4cdaf9b1e7d0 68 int connect(char* hostname, int port, int timeout=1000)
PavelSavyhin 0:4cdaf9b1e7d0 69 {
PavelSavyhin 0:4cdaf9b1e7d0 70 int err;
PavelSavyhin 0:4cdaf9b1e7d0 71
PavelSavyhin 0:4cdaf9b1e7d0 72 mysock.set_timeout(timeout);
PavelSavyhin 0:4cdaf9b1e7d0 73 err = mysock.connect(hostname, port);
PavelSavyhin 0:4cdaf9b1e7d0 74 // t.start();
PavelSavyhin 0:4cdaf9b1e7d0 75 return err;
PavelSavyhin 0:4cdaf9b1e7d0 76 }
PavelSavyhin 0:4cdaf9b1e7d0 77
PavelSavyhin 0:4cdaf9b1e7d0 78 int read(unsigned char* buffer, int len, int timeout)
PavelSavyhin 0:4cdaf9b1e7d0 79 {
PavelSavyhin 0:4cdaf9b1e7d0 80 mysock.set_timeout(timeout);
PavelSavyhin 0:4cdaf9b1e7d0 81 //t.reset();
PavelSavyhin 0:4cdaf9b1e7d0 82 // int start = t.read_ms();
PavelSavyhin 0:4cdaf9b1e7d0 83 int rc = mysock.recv((char*)buffer, len);
PavelSavyhin 0:4cdaf9b1e7d0 84 // int stop = t.read_ms();
PavelSavyhin 0:4cdaf9b1e7d0 85 // if (rc>0) printf ("recv File: %s, Line: %d Read nB: %d rc: %d timeout: %d elaps: %d\n\r",__FILE__,__LINE__, len, rc, timeout, stop-start);
PavelSavyhin 0:4cdaf9b1e7d0 86 return rc;
PavelSavyhin 0:4cdaf9b1e7d0 87 }
PavelSavyhin 0:4cdaf9b1e7d0 88
PavelSavyhin 0:4cdaf9b1e7d0 89 int write(unsigned char* buffer, int len, int timeout)
PavelSavyhin 0:4cdaf9b1e7d0 90 {
PavelSavyhin 0:4cdaf9b1e7d0 91 mysock.set_timeout(timeout);
PavelSavyhin 0:4cdaf9b1e7d0 92 // mysock.set_blocking(false, timeout);
PavelSavyhin 0:4cdaf9b1e7d0 93 // mysock.set_blocking(false);
PavelSavyhin 0:4cdaf9b1e7d0 94 int rc = mysock.send((char*)buffer, len);
PavelSavyhin 0:4cdaf9b1e7d0 95 // printf ("send File: %s, Line: %d Write nB: %d rc: %d\n\r",__FILE__,__LINE__, len, rc);
PavelSavyhin 0:4cdaf9b1e7d0 96 return rc;
PavelSavyhin 0:4cdaf9b1e7d0 97 }
PavelSavyhin 0:4cdaf9b1e7d0 98
PavelSavyhin 0:4cdaf9b1e7d0 99 int disconnect()
PavelSavyhin 0:4cdaf9b1e7d0 100 {
PavelSavyhin 0:4cdaf9b1e7d0 101 // t.stop();
PavelSavyhin 0:4cdaf9b1e7d0 102 return mysock.close();
PavelSavyhin 0:4cdaf9b1e7d0 103 }
PavelSavyhin 0:4cdaf9b1e7d0 104
PavelSavyhin 0:4cdaf9b1e7d0 105 inline int getTime()
PavelSavyhin 0:4cdaf9b1e7d0 106 {
PavelSavyhin 0:4cdaf9b1e7d0 107 return _time_last_ticks;
PavelSavyhin 0:4cdaf9b1e7d0 108 }
PavelSavyhin 0:4cdaf9b1e7d0 109
PavelSavyhin 0:4cdaf9b1e7d0 110 private:
PavelSavyhin 0:4cdaf9b1e7d0 111 TCPSocket mysock;
PavelSavyhin 0:4cdaf9b1e7d0 112 TCPSocket timesock;
PavelSavyhin 0:4cdaf9b1e7d0 113
PavelSavyhin 0:4cdaf9b1e7d0 114 uint32_t _time_last_ticks;
PavelSavyhin 0:4cdaf9b1e7d0 115 // Timer t;
PavelSavyhin 0:4cdaf9b1e7d0 116
PavelSavyhin 0:4cdaf9b1e7d0 117 };
PavelSavyhin 0:4cdaf9b1e7d0 118 #endif