Connect through Wifi to IBM MQTT cloud https://quickstart.internetofthings.ibmcloud.com

Dependencies:   MQTT NetworkSocketAPI X_NUCLEO_IDW01M1v2 X_NUCLEO_IKS01A1 mbed NDefLib X_NUCLEO_NFC01A1

Fork of IDW01M1_Cloud_IBM by ST Expansion SW Team

To start the demo the following expansion boards are required

X_NUCLEO_IDW01M1v2, X_NUCLEO_IKS01A1, X_NUCLEO_NFC01A1

After having mounted the board stack on the Nucleo board the below steps should be followed:

  • Program in the application source code you local WiFi SSID and password and flash the binary. Make sure the Wifi network has visible SSID.
  • Reset the Nucleo board and after few seconds the Nucleo green led will be on (it means the Nucleo is connected to the local Wifi and to the IBM cloud server)
  • Read the NFC tag with an Android device and the browser will be automatically opened and directed to the specific brocker IBM demo page where the environmental values are displayed in form of a x-y graph. The values are updated every few seconds. On the Hyperterminal is possible to see the values sent to the IBM cloud server and the board mac address to be entered on the IBM quickstart web page if a manual connection is needed (eg. to connect from a PC browser).

Files at this revision

API Documentation at this revision

Comitter:
mapellil
Date:
Wed Sep 28 13:28:44 2016 +0000
Parent:
13:0b31131bf711
Child:
15:a34b67eb32f9
Commit message:
Added Wifi support and read environmental sensors from IKS

Changed in this revision

IBM_IoT.h Show diff for this revision Revisions of this file
MQTT.lib Show annotated file Show diff for this revision Revisions of this file
X_NUCLEO_IDW01M1.lib Show diff for this revision Revisions of this file
X_NUCLEO_IDW01M1v2.lib Show annotated file Show diff for this revision Revisions of this file
X_NUCLEO_IKS01A1.lib Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
mbed.bld Show annotated file Show diff for this revision Revisions of this file
--- a/IBM_IoT.h	Wed Sep 07 14:14:27 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,521 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2014, 2015 IBM Corp.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * and Eclipse Distribution License v1.0 which accompany this distribution.
- *
- * The Eclipse Public License is available at
- *    http://www.eclipse.org/legal/epl-v10.html
- * and the Eclipse Distribution License is available at
- *   http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * Contributors:
- *    Sam Danbury - initial implementation
- *    Ian Craggs - refactoring to remove STL and other changes
- *    Sam Grove  - added check for Ethernet cable.
- *    Chris Styles - Added additional menu screen for software revision
- *    James Sutton - Mac fix and extra debug
- *    Ian Craggs - add not authorized messages
- *
- * To do :
- *    Add magnetometer sensor output to IoT data stream
- *
- *******************************************************************************/
-
-#include "LM75B.h"
-#include "MMA7660.h"
-#include "MQTTClient.h"
-#include "MQTTEthernet.h"
-#include "C12832.h"
-#include "Arial12x12.h"
-#include "rtos.h"
-
-// Update this to the next number *before* a commit
-#define __APP_SW_REVISION__ "18"
-
-// Configuration values needed to connect to IBM IoT Cloud
-#define ORG "quickstart"             // For a registered connection, replace with your org
-#define ID ""                        // For a registered connection, replace with your id
-#define AUTH_TOKEN ""                // For a registered connection, replace with your auth-token
-#define TYPE DEFAULT_TYPE_NAME       // For a registered connection, replace with your type
-
-#define MQTT_PORT 1883
-#define MQTT_TLS_PORT 8883
-#define IBM_IOT_PORT MQTT_PORT
-
-#define MQTT_MAX_PACKET_SIZE 250
-
-#if defined(TARGET_UBLOX_C027)
-#warning "Compiling for mbed C027"
-#include "C027.h"
-#elif defined(TARGET_LPC1768)
-#warning "Compiling for mbed LPC1768"
-#include "LPC1768.h"
-#elif defined(TARGET_K64F)
-#warning "Compiling for mbed K64F"
-#include "K64F.h"
-#endif
-
-
-bool quickstartMode = true;
-char org[11] = ORG;  
-char type[30] = TYPE;
-char id[30] = ID;                 // mac without colons
-char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode
-
-bool connected = false;
-bool mqttConnecting = false;
-bool netConnected = false;
-bool netConnecting = false;
-bool ethernetInitialising = true;
-int connack_rc = 0; // MQTT connack return code
-int retryAttempt = 0;
-int menuItem = 0;
-
-char* joystickPos = "CENTRE";
-int blink_interval = 0;
-
-char* ip_addr = "";
-char* gateway_addr = "";
-char* host_addr = "";
-int connectTimeout = 1000;
-
-// If we wanted to manually set the MAC address,
-// this is how to do it. In this example, we take
-// the original Mbed Set MAC address and combine it
-// with a prefix of our choosing.
- /*
-extern "C" void $Super$$mbed_mac_address(char *s);
-extern "C" void $Sub$$mbed_mac_address(char *s) 
-{
-    char originalMAC[6] = "";
-    $Super$$mbed_mac_address(originalMAC);
-    
-    char mac[6];
-    mac[0] = 0x00;
-    mac[1] = 0x08;
-    mac[2] = 0xdc;
-    mac[3] = originalMAC[3];
-    mac[4] = originalMAC[4];
-    mac[5] = originalMAC[5];
-    memcpy(s, mac, 6);
-}
-*/
-
-
-void off()
-{
-    r = g = b = 1.0;    // 1 is off, 0 is full brightness
-}
-
-void red()
-{
-    r = 0.7; g = 1.0; b = 1.0;    // 1 is off, 0 is full brightness
-}
-
-void yellow()
-{
-    r = 0.7; g = 0.7; b = 1.0;    // 1 is off, 0 is full brightness
-}
-
-void green()
-{
-    r = 1.0; g = 0.7; b = 1.0;    // 1 is off, 0 is full brightness
-}
-
-
-void flashing_yellow(void const *args)
-{
-    bool on = false;
-    while (!connected && connack_rc != MQTT_NOT_AUTHORIZED && connack_rc != MQTT_BAD_USERNAME_OR_PASSWORD)    // flashing yellow only while connecting 
-    {
-        on = !on; 
-        if (on)
-            yellow();
-        else
-            off();   
-        wait(0.5);
-    }
-}
-
-
-void flashing_red(void const *args)  // to be used when the connection is lost
-{
-    bool on = false;
-    while (!connected)
-    {
-        on = !on;
-        if (on)
-            red();
-        else
-            off();
-        wait(2.0);
-    }
-}
-
-
-void printMenu(int menuItem) 
-{
-    static char last_line1[30] = "", last_line2[30] = "";
-    char line1[30] = "", line2[30] = "";
-        
-    switch (menuItem)
-    {
-        case 0:
-            sprintf(line1, "IBM IoT Cloud");
-            sprintf(line2, "Scroll with joystick");
-            break;
-        case 1:
-            sprintf(line1, "Go to:");
-            sprintf(line2, "http://ibm.biz/iotqstart");
-            break;
-        case 2:
-            sprintf(line1, "Device Identity:");
-            sprintf(line2, "%s", id);
-            break;
-        case 3:
-            sprintf(line1, "MQTT Status:");
-            if (mqttConnecting)
-                sprintf(line2, "Connecting... %d/5", retryAttempt);
-            else
-            {
-                if (connected)
-                    sprintf(line2, "Connected");
-                else
-                {
-                    switch (connack_rc)
-                    {
-                        case MQTT_CLIENTID_REJECTED:
-                            sprintf(line2, "Clientid rejected");
-                            break;
-                        case MQTT_BAD_USERNAME_OR_PASSWORD:
-                            sprintf(line2, "Invalid username or password");
-                            break;
-                        case MQTT_NOT_AUTHORIZED:
-                            sprintf(line2, "Not authorized");
-                            break;
-                        default:
-                            sprintf(line2, "Disconnected");
-                    }
-                }
-            }
-            break;
-        case 4:
-            sprintf(line1, "Ethernet State:");
-            sprintf(line2, ethernetInitialising ? "Initializing..." : "Initialized");
-            break;
-        case 5:
-            sprintf(line1, "Socket State:");
-            if (netConnecting)
-                sprintf(line2, "Connecting... %d/5", retryAttempt);
-            else
-                sprintf(line2, netConnected ? "Connected" : "Disconnected");
-            break;
-        case 6:
-            sprintf(line1, "IP Address:");
-            sprintf(line2, "%s", ip_addr);
-            break;
-        case 7:
-            sprintf(line1, "Gateway:");
-            sprintf(line2, "%s", gateway_addr);
-            break;
-        case 8:
-            sprintf(line1, "App version:");
-            sprintf(line2, "%s", __APP_SW_REVISION__);
-            break;
-        case 9:
-            sprintf(line1, "Current Timeout:");
-            sprintf(line2, "%d ms", connectTimeout);
-            break;
-    }
-    
-    if (strcmp(line1, last_line1) != 0 || strcmp(line2, last_line2) != 0)
-    {
-        lcd.cls(); 
-        lcd.locate(0, 0);
-        lcd.printf(line1);
-        strncpy(last_line1, line1, sizeof(last_line1));
-
-        lcd.locate(0,16);
-        lcd.printf(line2);
-        strncpy(last_line2, line2, sizeof(last_line2));
-    }
-}
-
-
-void setMenu()
-{
-    
-    if (Down)
-    {
-        joystickPos = "DOWN";
-        if (menuItem >= 0 && menuItem < 9)
-            printMenu(++menuItem);
-    } 
-    else if (Left)
-        joystickPos = "LEFT";
-    else if (Click)
-        joystickPos = "CLICK";
-    else if (Up)
-    {
-        joystickPos = "UP";
-        if (menuItem <= 9 && menuItem > 0)
-            printMenu(--menuItem);
-    }
-    else if (Right)
-        joystickPos = "RIGHT";
-    else
-        joystickPos = "CENTRE";
-}
-
-void menu_loop(void const *args)
-{
-    int count = 0;
-    while(true)
-    {
-        setMenu();
-        if (++count % 10 == 0)
-            printMenu(menuItem);
-        Thread::wait(100);
-    }
-}
-
-
-/**
- * Display a message on the LCD screen prefixed with IBM IoT Cloud
- */
-void displayMessage(char* message)
-{
-    lcd.cls();
-    lcd.locate(0,0);        
-    lcd.printf("IBM IoT Cloud");
-    lcd.locate(0,16);
-    lcd.printf(message);
-}
-
-
-int connect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack)
-{   
-    const char* iot_ibm = ".messaging.internetofthings.ibmcloud.com";
-    
-    char hostname[strlen(org) + strlen(iot_ibm) + 1];
-    sprintf(hostname, "%s%s", org, iot_ibm);
-    EthernetInterface& eth = ipstack->getEth();
-    ip_addr = eth.getIPAddress();
-    gateway_addr = eth.getGateway();
-    
-    // Construct clientId - d:org:type:id
-    char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
-    sprintf(clientId, "d:%s:%s:%s", org, type, id);
-    
-    // Network debug statements 
-    LOG("=====================================\n");
-    LOG("Connecting Ethernet.\n");
-    LOG("IP ADDRESS: %s\n", eth.getIPAddress());
-    LOG("MAC ADDRESS: %s\n", eth.getMACAddress());
-    LOG("Gateway: %s\n", eth.getGateway());
-    LOG("Network Mask: %s\n", eth.getNetworkMask());
-    LOG("Server Hostname: %s\n", hostname);
-    LOG("Client ID: %s\n", clientId);
-    LOG("=====================================\n");
-    
-    netConnecting = true;
-    int rc = ipstack->connect(hostname, IBM_IOT_PORT, connectTimeout);
-    if (rc != 0)
-    {
-        WARN("IP Stack connect returned: %d\n", rc);    
-        return rc;
-    }
-    netConnected = true;
-    netConnecting = false;
-
-    // MQTT Connect
-    mqttConnecting = true;
-    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
-    data.MQTTVersion = 3;
-    data.clientID.cstring = clientId;
-    
-    if (!quickstartMode) 
-    {        
-        data.username.cstring = "use-token-auth";
-        data.password.cstring = auth_token;
-    }
-    
-    if ((rc = client->connect(data)) == 0) 
-    {       
-        connected = true;
-        green();    
-        displayMessage("Connected");
-        wait(1);
-        displayMessage("Scroll with joystick");
-    }
-    else
-        WARN("MQTT connect returned %d\n", rc);
-    if (rc >= 0)
-        connack_rc = rc;
-    mqttConnecting = false;
-    return rc;
-}
-
-
-int getConnTimeout(int attemptNumber)
-{  // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
-   // after 20 attempts, retry every 10 minutes
-    return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
-}
-
-
-void attemptConnect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack)
-{
-    connected = false;
-   
-    // make sure a cable is connected before starting to connect
-    while (!linkStatus()) 
-    {
-        wait(1.0f);
-        WARN("Ethernet link not present. Check cable connection\n");
-    }
-        
-    while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED) 
-    {    
-        if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD)
-            return; // don't reattempt to connect if credentials are wrong
-            
-        Thread red_thread(flashing_red);
-
-        int timeout = getConnTimeout(++retryAttempt);
-        WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
-        
-        // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
-        //  or maybe just add the proper members to do this disconnect and call attemptConnect(...)
-        
-        // this works - reset the system when the retry count gets to a threshold
-        if (retryAttempt == 5)
-            NVIC_SystemReset();
-        else
-            wait(timeout);
-    }
-}
-
-
-int publish(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack)
-{
-    MQTT::Message message;
-    char* pubTopic = "iot-2/evt/status/fmt/json";
-            
-    char buf[250];
-    sprintf(buf,
-     "{\"d\":{\"myName\":\"IoT mbed\",\"accelX\":%0.4f,\"accelY\":%0.4f,\"accelZ\":%0.4f,\"temp\":%0.4f,\"joystick\":\"%s\",\"potentiometer1\":%0.4f,\"potentiometer2\":%0.4f}}",
-            MMA.x(), MMA.y(), MMA.z(), sensor.temp(), joystickPos, ain1.read(), ain2.read());
-    message.qos = MQTT::QOS0;
-    message.retained = false;
-    message.dup = false;
-    message.payload = (void*)buf;
-    message.payloadlen = strlen(buf);
-    
-    LOG("Publishing %s\n", buf);
-    return client->publish(pubTopic, message);
-}
-
-
-char* getMac(EthernetInterface& eth, char* buf, int buflen)    // Obtain MAC address
-{   
-    strncpy(buf, eth.getMACAddress(), buflen);
-
-    char* pos;                                                 // Remove colons from mac address
-    while ((pos = strchr(buf, ':')) != NULL)
-        memmove(pos, pos + 1, strlen(pos) + 1);
-    return buf;
-}
-
-
-void messageArrived(MQTT::MessageData& md)
-{
-    MQTT::Message &message = md.message;
-    char topic[md.topicName.lenstring.len + 1];
-    
-    sprintf(topic, "%.*s", md.topicName.lenstring.len, md.topicName.lenstring.data);
-    
-    LOG("Message arrived on topic %s: %.*s\n",  topic, message.payloadlen, message.payload);
-          
-    // Command topic: iot-2/cmd/blink/fmt/json - cmd is the string between cmd/ and /fmt/
-    char* start = strstr(topic, "/cmd/") + 5;
-    int len = strstr(topic, "/fmt/") - start;
-    
-    if (memcmp(start, "blink", len) == 0)
-    {
-        char payload[message.payloadlen + 1];
-        sprintf(payload, "%.*s", message.payloadlen, (char*)message.payload);
-    
-        char* pos = strchr(payload, '}');
-        if (pos != NULL)
-        {
-            *pos = '\0';
-            if ((pos = strchr(payload, ':')) != NULL)
-            {
-                int blink_rate = atoi(pos + 1);       
-                blink_interval = (blink_rate <= 0) ? 0 : (blink_rate > 50 ? 1 : 50/blink_rate);
-            }
-        }
-    }
-    else
-        WARN("Unsupported command: %.*s\n", len, start);
-}
-
-
-int main()
-{    
-    quickstartMode = (strcmp(org, "quickstart") == 0);
-
-    lcd.set_font((unsigned char*) Arial12x12);  // Set a nice font for the LCD screen
-    
-    led2 = LED2_OFF; // K64F: turn off the main board LED 
-    
-    displayMessage("Connecting");
-    Thread yellow_thread(flashing_yellow);
-    Thread menu_thread(menu_loop);  
-    
-    LOG("***** IBM IoT Client Ethernet Example *****\n");
-    MQTTEthernet ipstack;
-    ethernetInitialising = false;
-    MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
-    LOG("Ethernet Initialized\n"); 
-    
-    if (quickstartMode)
-        getMac(ipstack.getEth(), id, sizeof(id));
-        
-    attemptConnect(&client, &ipstack);
-    
-    if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD)    
-    {
-        red();
-        while (true)
-            wait(1.0); // Permanent failures - don't retry
-    }
-    
-    if (!quickstartMode) 
-    {
-        int rc = 0;
-        if ((rc = client.subscribe("iot-2/cmd/+/fmt/json", MQTT::QOS1, messageArrived)) != 0)
-            WARN("rc from MQTT subscribe is %d\n", rc); 
-    }
-    
-    blink_interval = 0;
-    int count = 0;
-    while (true)
-    {
-        if (++count == 100)
-        {               // Publish a message every second
-            if (publish(&client, &ipstack) != 0) 
-                attemptConnect(&client, &ipstack);   // if we have lost the connection
-            count = 0;
-        }
-        
-        if (blink_interval == 0)
-            led2 = LED2_OFF;
-        else if (count % blink_interval == 0)
-            led2 = !led2;
-        client.yield(10);  // allow the MQTT client to receive messages
-    }
-}
--- a/MQTT.lib	Wed Sep 07 14:14:27 2016 +0000
+++ b/MQTT.lib	Wed Sep 28 13:28:44 2016 +0000
@@ -1,1 +1,1 @@
-http://developer.mbed.org/teams/mqtt/code/MQTT/#e335fcc1a663
+http://developer.mbed.org/teams/mqtt/code/MQTT/#24f2bf2819a5
--- a/X_NUCLEO_IDW01M1.lib	Wed Sep 07 14:14:27 2016 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-https://developer.mbed.org/teams/ST/code/X_NUCLEO_IDW01M1/#2c47c2aab4a4
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/X_NUCLEO_IDW01M1v2.lib	Wed Sep 28 13:28:44 2016 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/ST/code/X_NUCLEO_IDW01M1v2/#4cd89586b370
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/X_NUCLEO_IKS01A1.lib	Wed Sep 28 13:28:44 2016 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/ST/code/X_NUCLEO_IKS01A1/#f4fa3dad9ec4
--- a/main.cpp	Wed Sep 07 14:14:27 2016 +0000
+++ b/main.cpp	Wed Sep 28 13:28:44 2016 +0000
@@ -15,81 +15,224 @@
  */
 
 #include "mbed.h"
-#include "SPWFInterface.h"
+#include "SpwfInterface.h"
 #include "TCPSocket.h"
-
 #include "MQTTClient.h"
-
+#include "MQTTWiFi.h"
+#include <ctype.h>
+#include "x_nucleo_iks01a1.h"
 
 //------------------------------------
 // Hyperterminal configuration
 // 9600 bauds, 8-bit data, no parity
 //------------------------------------
-
 Serial pc(SERIAL_TX, SERIAL_RX); 
 DigitalOut myled(LED1);
-SpwfSAInterface spwf(PA_9, PA_10, PC_12, PC_8, PA_12, true);
+SpwfSAInterface spwf(D8, D2, false);
+bool quickstartMode = true;    
+    
+#define MQTT_MAX_PACKET_SIZE 250   
+#define MQTT_MAX_PAYLOAD_SIZE 300 
+ // Configuration values needed to connect to IBM IoT Cloud
+#define ORG "quickstart"             // For a registered connection, replace with your org
+#define ID ""                        // For a registered connection, replace with your id
+#define AUTH_TOKEN ""                // For a registered connection, replace with your auth-token
+#define DEFAULT_TYPE_NAME "iotsample-mbed-NucleoF401RE"
+#define TYPE DEFAULT_TYPE_NAME       // For a registered connection, replace with your type
+#define MQTT_PORT 1883
+#define MQTT_TLS_PORT 8883
+#define IBM_IOT_PORT MQTT_PORT
+    
+char id[30] = ID;                 // mac without colons  
+char org[12] = ORG;        
+int connack_rc = 0; // MQTT connack return code
+const char* ip_addr = "";
+char* host_addr = "";
+char type[30] = TYPE;
+char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode
+bool netConnecting = false;
+//int connectTimeout = 1000;
+int connectTimeout = 10;
+bool mqttConnecting = false;
+bool netConnected = false;
+bool connected = false;
+int retryAttempt = 0;
+
+PressureSensor *pressure_sensor;
+HumiditySensor *humidity_sensor;
+TempSensor *temp_sensor1;
+
+
+int connect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{   
+    const char* iot_ibm = ".messaging.internetofthings.ibmcloud.com";
+    
+    char hostname[strlen(org) + strlen(iot_ibm) + 1];
+    sprintf(hostname, "%s%s", org, iot_ibm);
+    SpwfSAInterface& WiFi = ipstack->getWiFi();
+    ip_addr = WiFi.get_ip_address();
+    printf ("ID: %s\n\r",id);
+    // Construct clientId - d:org:type:id
+    char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
+    sprintf(clientId, "d:%s:%s:%s", org, type, id);    
+    // Network debug statements 
+    LOG("=====================================\n\r");
+    LOG("Connecting WiFi.\n\r");
+    LOG("IP ADDRESS: %s\n\r", WiFi.get_ip_address());
+    LOG("MAC ADDRESS: %s\n\r", WiFi.get_mac_address());
+    LOG("Server Hostname: %s\n\r", hostname);
+    for(int i = 0; clientId[i]; i++){
+       clientId[i] = tolower(clientId[i]);
+    }    
+    LOG("Client ID: %s\n\r", clientId);
+    LOG("=====================================\n\r");
+    
+    netConnecting = true;
+    ipstack->open(&ipstack->getWiFi());
+    int rc = ipstack->connect(hostname, IBM_IOT_PORT, connectTimeout);
+    if (rc != 0)
+    {
+        WARN("IP Stack connect returned: %d\n", rc);    
+        return rc;
+    }
+    netConnected = true;
+    netConnecting = false;
+
+    // MQTT Connect
+    mqttConnecting = true;
+    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
+    data.MQTTVersion = 3;
+    data.clientID.cstring = clientId;
+ 
+    if (!quickstartMode) 
+    {        
+        data.username.cstring = "use-token-auth";
+        data.password.cstring = auth_token;
+    }    
+    if ((rc = client->connect(data)) == 0) 
+    {       
+        connected = true;
+        printf ("--->Connected\n\r");
+    }
+    else {
+        WARN("MQTT connect returned %d\n", rc);        
+    }
+    if (rc >= 0)
+        connack_rc = rc;
+    mqttConnecting = false;
+    return rc;
+}
+
+int getConnTimeout(int attemptNumber)
+{  // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
+   // after 20 attempts, retry every 10 minutes
+    return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
+}
+
+void attemptConnect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{
+    connected = false;
+           
+    while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED) 
+    {    
+        if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
+            printf ("File: %s, Line: %d\n\r",__FILE__,__LINE__);        
+            return; // don't reattempt to connect if credentials are wrong
+        }          
+        int timeout = getConnTimeout(++retryAttempt);
+        WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
+        
+        // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
+        //  or maybe just add the proper members to do this disconnect and call attemptConnect(...)
+        
+        // this works - reset the system when the retry count gets to a threshold
+        if (retryAttempt == 5)
+            NVIC_SystemReset();
+        else
+            wait(timeout);
+    }
+}
+
+int publish(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
+{
+    MQTT::Message message;
+    char* pubTopic = "iot-2/evt/status/fmt/json";
+            
+    char buf[MQTT_MAX_PAYLOAD_SIZE];
+    float temp, press, hum;
+    temp_sensor1->GetTemperature(&temp);
+    pressure_sensor->GetPressure(&press);
+    humidity_sensor->GetHumidity(&hum);
+    sprintf(buf,
+     "{\"d\":{\"ST\":\"Nucleo-IoT-mbed\",\"Temp\":%0.4f,\"Pressure\":\"%0.4f,\",\"Humidity\":%0.4f}}",
+              temp, press, hum);
+    message.qos = MQTT::QOS0;
+    message.retained = false;
+    message.dup = false;
+    message.payload = (void*)buf;
+    message.payloadlen = strlen(buf);
+    
+    LOG("Publishing %s\n", buf);
+    return client->publish(pubTopic, message);
+} 
+ 
     
 int main()
 {
     int err;    
-    char * ssid = "crespan"; // Network must be visible otherwise it can't connect
-    char * seckey = "Elfrontal0";
+    const char * ssid = "crespan"; // Network must be visible otherwise it can't connect
+    const char * seckey = "Elfrontal0";
+    
+//    Timer tyeld;
+
+    DevI2C *i2c = new DevI2C(I2C_SDA, I2C_SCL);
+    i2c->frequency(400000);    
+    
+    X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(i2c);
+    
+    pressure_sensor = mems_expansion_board->pt_sensor;
+    temp_sensor1 = mems_expansion_board->ht_sensor;  
+    humidity_sensor = mems_expansion_board->ht_sensor;  
     
     pc.printf("\r\nX-NUCLEO-IDW01M1 mbed Application\r\n");     
-    pc.printf("\r\nconnecting to AP\r\n"); 
+    pc.printf("\r\nconnecting to AP\r\n");            
+//******************************************************************
 
-    err = spwf.connect(ssid, seckey, NSAPI_SECURITY_WPA2); //WPA2
-    
-    if(err!=0)
-    {
-        pc.printf("\r\nerror connecting to AP.\r\n");
-        return -1;
-    }
-    
-    pc.printf("\r\nnow connected\r\n");
-            
-    const char *ip = spwf.get_ip_address();
-    const char *mac = spwf.get_mac_address();
-    
-    pc.printf("\r\nIP Address is: %s\r\n", (ip) ? ip : "No IP");
-    pc.printf("\r\nMAC Address is: %s\r\n", (mac) ? mac : "No MAC");    
-    
-    SocketAddress addr(&spwf, "st.com");
-    printf("\r\nst.com resolved to: %s\r\n", addr.get_ip_address());
-
-    pc.printf("\r\nconnecting to http://time-d.nist.gov\r\n");
-    //pc.printf("\r\nconnecting to https://quickstart.internetofthings.ibmcloud.com\r\n");
-    
-    TCPSocket socket(&spwf);
-    err = socket.connect("time-d.nist.gov", 37);
+// quickstartMode = (strcmp(org, "quickstart") == 0);
+ if (strcmp(org, "quickstart") == 0){quickstartMode = true;}
+ MQTTWiFi ipstack(spwf, ssid, seckey, NSAPI_SECURITY_WPA2);
+ MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
+ if (quickstartMode){
+        char mac[50];
+        char *digit=NULL;        
+        sprintf (mac,"%s",ipstack.getWiFi().get_mac_address()); 
+        strcpy (mac, ipstack.getWiFi().get_mac_address());
+        digit = strtok (mac,":");
+        while (digit != NULL)
+        {
+            strcat (id, digit);
+            digit = strtok (NULL, ":");
+        }        
+ }
+ attemptConnect(&client, &ipstack);
+ if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD)    
+ {
+    while (true)
+    wait(1.0); // Permanent failures - don't retry
+ }
+    int count = 0;    
+//    tyeld.start();
     
-    if(err!=0) 
-    {
-      pc.printf("\r\nCould not connect to Socket, err = %d!!\r\n", err); 
-      return -1;
-    }
-    char buffer[10];
-    int count = 0;
-    pc.printf("\r\nReceiving Data\r\n"); 
-    count = socket.recv(buffer, sizeof buffer);
-    
-    if(count > 0)
+    while (true)
     {
-        pc.printf("\r\nReceived: %ld bytes, 0x%02x 0x%02x 0x%02x 0x%02x\r\n", \
-                            count, buffer[0], buffer[1], buffer[2], buffer[3]);
-    }
-    else pc.printf("\r\nData not received\r\n");
-
-    pc.printf("\r\nClosing Socket\r\n");
-    socket.close();
-        
-    pc.printf("\r\ndisconnecting....\r\n");
-    spwf.disconnect();
-    pc.printf("\r\nTest complete.\r\n");
-                
-    while(1) { 
-      wait(1);
-      myled = !myled;
+        if (++count == /*100*/2)
+        {               // Publish a message every second
+            if (publish(&client, &ipstack) != 0) 
+                attemptConnect(&client, &ipstack);   // if we have lost the connection
+            count = 0;
+        }        
+//        int start = tyeld.read_ms();
+        client.yield(/*10*/1);  // allow the MQTT client to receive messages
+//        printf ("tyeld: %d\n\r",tyeld.read_ms()-start);
     }
 }
--- a/mbed.bld	Wed Sep 07 14:14:27 2016 +0000
+++ b/mbed.bld	Wed Sep 28 13:28:44 2016 +0000
@@ -1,1 +1,1 @@
-http://mbed.org/users/mbed_official/code/mbed/builds/7c328cabac7e
\ No newline at end of file
+http://mbed.org/users/mbed_official/code/mbed/builds/2e9cc70d1897
\ No newline at end of file