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 /* mbed Microcontroller Library
PavelSavyhin 0:4cdaf9b1e7d0 2 * Copyright (c) 20015 ARM Limited
PavelSavyhin 0:4cdaf9b1e7d0 3 *
PavelSavyhin 0:4cdaf9b1e7d0 4 * Licensed under the Apache License, Version 2.0 (the "License");
PavelSavyhin 0:4cdaf9b1e7d0 5 * you may not use this file except in compliance with the License.
PavelSavyhin 0:4cdaf9b1e7d0 6 * You may obtain a copy of the License at
PavelSavyhin 0:4cdaf9b1e7d0 7 *
PavelSavyhin 0:4cdaf9b1e7d0 8 * http://www.apache.org/licenses/LICENSE-2.0
PavelSavyhin 0:4cdaf9b1e7d0 9 *
PavelSavyhin 0:4cdaf9b1e7d0 10 * Unless required by applicable law or agreed to in writing, software
PavelSavyhin 0:4cdaf9b1e7d0 11 * distributed under the License is distributed on an "AS IS" BASIS,
PavelSavyhin 0:4cdaf9b1e7d0 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
PavelSavyhin 0:4cdaf9b1e7d0 13 * See the License for the specific language governing permissions and
PavelSavyhin 0:4cdaf9b1e7d0 14 * limitations under the License.
PavelSavyhin 0:4cdaf9b1e7d0 15 */
PavelSavyhin 0:4cdaf9b1e7d0 16
PavelSavyhin 0:4cdaf9b1e7d0 17 /**
PavelSavyhin 0:4cdaf9b1e7d0 18 ******************************************************************************
PavelSavyhin 0:4cdaf9b1e7d0 19 * @file SpwfInterface.h
PavelSavyhin 0:4cdaf9b1e7d0 20 * @author STMicroelectronics
PavelSavyhin 0:4cdaf9b1e7d0 21 * @brief Header file of the NetworkStack for the SPWF Device
PavelSavyhin 0:4cdaf9b1e7d0 22 ******************************************************************************
PavelSavyhin 0:4cdaf9b1e7d0 23 * @copy
PavelSavyhin 0:4cdaf9b1e7d0 24 *
PavelSavyhin 0:4cdaf9b1e7d0 25 * THE PRESENT FIRMWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
PavelSavyhin 0:4cdaf9b1e7d0 26 * WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE
PavelSavyhin 0:4cdaf9b1e7d0 27 * TIME. AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY
PavelSavyhin 0:4cdaf9b1e7d0 28 * DIRECT, INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING
PavelSavyhin 0:4cdaf9b1e7d0 29 * FROM THE CONTENT OF SUCH FIRMWARE AND/OR THE USE MADE BY CUSTOMERS OF THE
PavelSavyhin 0:4cdaf9b1e7d0 30 * CODING INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
PavelSavyhin 0:4cdaf9b1e7d0 31 *
PavelSavyhin 0:4cdaf9b1e7d0 32 * <h2><center>&copy; COPYRIGHT 2016 STMicroelectronics</center></h2>
PavelSavyhin 0:4cdaf9b1e7d0 33 ******************************************************************************
PavelSavyhin 0:4cdaf9b1e7d0 34 */
PavelSavyhin 0:4cdaf9b1e7d0 35
PavelSavyhin 0:4cdaf9b1e7d0 36 #ifndef SPWFSA_INTERFACE_H
PavelSavyhin 0:4cdaf9b1e7d0 37 #define SPWFSA_INTERFACE_H
PavelSavyhin 0:4cdaf9b1e7d0 38
PavelSavyhin 0:4cdaf9b1e7d0 39 #include "WiFiInterface.h"
PavelSavyhin 0:4cdaf9b1e7d0 40 #include "SPWFSA01.h"
PavelSavyhin 0:4cdaf9b1e7d0 41
PavelSavyhin 0:4cdaf9b1e7d0 42 #define SPWFSA_SOCKET_COUNT 8
PavelSavyhin 0:4cdaf9b1e7d0 43 #define SERVER_SOCKET_NO 9
PavelSavyhin 0:4cdaf9b1e7d0 44
PavelSavyhin 0:4cdaf9b1e7d0 45 /** SpwfSAInterface class
PavelSavyhin 0:4cdaf9b1e7d0 46 * Implementation of the NetworkStack for the SPWF Device
PavelSavyhin 0:4cdaf9b1e7d0 47 */
PavelSavyhin 0:4cdaf9b1e7d0 48 class SpwfSAInterface : public NetworkStack, public WiFiInterface
PavelSavyhin 0:4cdaf9b1e7d0 49 {
PavelSavyhin 0:4cdaf9b1e7d0 50 public:
PavelSavyhin 0:4cdaf9b1e7d0 51 SpwfSAInterface(PinName tx, PinName rx, bool debug);
PavelSavyhin 0:4cdaf9b1e7d0 52 SpwfSAInterface(PinName tx, PinName rx, PinName reset = PC_12, PinName wakeup = PC_8, bool debug = false);
PavelSavyhin 0:4cdaf9b1e7d0 53 virtual ~SpwfSAInterface();
PavelSavyhin 0:4cdaf9b1e7d0 54
PavelSavyhin 0:4cdaf9b1e7d0 55 // Implementation of WiFiInterface
PavelSavyhin 0:4cdaf9b1e7d0 56 virtual int connect(const char *ssid,
PavelSavyhin 0:4cdaf9b1e7d0 57 const char *pass,
PavelSavyhin 0:4cdaf9b1e7d0 58 nsapi_security_t security = NSAPI_SECURITY_NONE);
PavelSavyhin 0:4cdaf9b1e7d0 59
PavelSavyhin 0:4cdaf9b1e7d0 60 inline int setSocketClientSecurity(uint8_t* tls_mode, uint8_t* root_ca_server, uint8_t* client_cert, uint8_t* client_key, uint8_t* client_domain, uint32_t tls_epoch_time)
PavelSavyhin 0:4cdaf9b1e7d0 61 {
PavelSavyhin 0:4cdaf9b1e7d0 62 return _spwf.setSocketClientSecurity(tls_mode, root_ca_server, client_cert, client_key, client_domain, tls_epoch_time);
PavelSavyhin 0:4cdaf9b1e7d0 63 }
PavelSavyhin 0:4cdaf9b1e7d0 64
PavelSavyhin 0:4cdaf9b1e7d0 65 virtual int disconnect();
PavelSavyhin 0:4cdaf9b1e7d0 66 virtual const char *get_mac_address();
PavelSavyhin 0:4cdaf9b1e7d0 67 void debug(const char * string);
PavelSavyhin 0:4cdaf9b1e7d0 68 inline bool reset_chip() {return _spwf.hw_reset();};
PavelSavyhin 0:4cdaf9b1e7d0 69
PavelSavyhin 0:4cdaf9b1e7d0 70 //Implementation of NetworkStack
PavelSavyhin 0:4cdaf9b1e7d0 71 virtual const char *get_ip_address();
PavelSavyhin 0:4cdaf9b1e7d0 72
PavelSavyhin 0:4cdaf9b1e7d0 73 protected:
PavelSavyhin 0:4cdaf9b1e7d0 74 //Implementation of NetworkStack
PavelSavyhin 0:4cdaf9b1e7d0 75 virtual int socket_open(void **handle, nsapi_protocol_t proto);
PavelSavyhin 0:4cdaf9b1e7d0 76 virtual int socket_close(void *handle);
PavelSavyhin 0:4cdaf9b1e7d0 77 virtual int socket_bind(void *handle, const SocketAddress &address); //not supported
PavelSavyhin 0:4cdaf9b1e7d0 78 virtual int socket_listen(void *handle, int backlog);
PavelSavyhin 0:4cdaf9b1e7d0 79 virtual int socket_connect(void *handle, const SocketAddress &address);
PavelSavyhin 0:4cdaf9b1e7d0 80 virtual int socket_accept(void **handle, void *server);
PavelSavyhin 0:4cdaf9b1e7d0 81 virtual int socket_send(void *handle, const void *data, unsigned size);
PavelSavyhin 0:4cdaf9b1e7d0 82 virtual int socket_recv(void *handle, void *data, unsigned size);
PavelSavyhin 0:4cdaf9b1e7d0 83 virtual int socket_sendto(void *handle, const SocketAddress &address, const void *data, unsigned size);
PavelSavyhin 0:4cdaf9b1e7d0 84 virtual int socket_recvfrom(void *handle, SocketAddress *address, void *buffer, unsigned size);
PavelSavyhin 0:4cdaf9b1e7d0 85 virtual void socket_attach(void *handle, void (*callback)(void *), void *data);
PavelSavyhin 0:4cdaf9b1e7d0 86 virtual int setsockopt(void *handle, int level, int optname, const void *optval, unsigned optlen);
PavelSavyhin 0:4cdaf9b1e7d0 87 virtual int getsockopt(void *handle, int level, int optname, void *optval, unsigned *optlen);
PavelSavyhin 0:4cdaf9b1e7d0 88
PavelSavyhin 0:4cdaf9b1e7d0 89 private:
PavelSavyhin 0:4cdaf9b1e7d0 90 int init(void);
PavelSavyhin 0:4cdaf9b1e7d0 91
PavelSavyhin 0:4cdaf9b1e7d0 92 SPWFSA01 _spwf;
PavelSavyhin 0:4cdaf9b1e7d0 93 bool _ids[SPWFSA_SOCKET_COUNT];
PavelSavyhin 0:4cdaf9b1e7d0 94 bool isListening;
PavelSavyhin 0:4cdaf9b1e7d0 95 bool isInitialized;
PavelSavyhin 0:4cdaf9b1e7d0 96 };
PavelSavyhin 0:4cdaf9b1e7d0 97
PavelSavyhin 0:4cdaf9b1e7d0 98
PavelSavyhin 0:4cdaf9b1e7d0 99 #endif