Code Sample for ERS4 GEII UNICE ERS4

Dependencies:   C12832 EthernetInterface LM75B MMA7660 MQTT mbed-rtos mbed

Fork of DU4SmartCities by Philippe Bazot

Revision:
16:2420bfbf5f1c
Parent:
15:09458079f4bb
Child:
17:74801ec6a672
--- a/main.cpp	Mon Jul 27 09:03:30 2015 +0000
+++ b/main.cpp	Mon Aug 03 12:41:51 2015 +0000
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2014 IBM Corp.
+ * 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
@@ -15,6 +15,8 @@
  *    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
@@ -30,7 +32,7 @@
 #include "rtos.h"
 
 // Update this to the next number *before* a commit
-#define __APP_SW_REVISION__ "11"
+#define __APP_SW_REVISION__ "12"
 
 // Configuration values needed to connect to IBM IoT Cloud
 #define ORG "quickstart"             // For a registered connection, replace with your org
@@ -67,6 +69,7 @@
 bool netConnected = false;
 bool netConnecting = false;
 bool ethernetInitialising = true;
+int connack_rc = 0; // MQTT connack return code
 int retryAttempt = 0;
 int menuItem = 0;
 
@@ -125,7 +128,7 @@
 void flashing_yellow(void const *args)
 {
     bool on = false;
-    while (!connected)    // flashing yellow only while connecting 
+    while (!connected && connack_rc != MQTT_NOT_AUTHORIZED && connack_rc != MQTT_BAD_USERNAME_OR_PASSWORD)    // flashing yellow only while connecting 
     {
         on = !on; 
         if (on)
@@ -152,8 +155,6 @@
 }
 
 
-
-
 void printMenu(int menuItem) 
 {
     lcd.cls();
@@ -178,10 +179,29 @@
         case 3:
             lcd.printf("MQTT Status:");
             lcd.locate(0,16);
-            if(mqttConnecting){
+            if (mqttConnecting)
                 lcd.printf("Connecting... %d/5", retryAttempt);
-            } else {
-                lcd.printf(connected ? "Connected" : "Disconnected");
+            else
+            {
+                if (connected)
+                    lcd.printf("Connected");
+                else
+                {
+                    switch (connack_rc)
+                    {
+                        case MQTT_CLIENTID_REJECTED:
+                            lcd.printf("Clientid rejected");
+                            break;
+                        case MQTT_BAD_USERNAME_OR_PASSWORD:
+                            lcd.printf("Invalid username or password");
+                            break;
+                        case MQTT_NOT_AUTHORIZED:
+                            lcd.printf("Not authorized");
+                            break;
+                        default:
+                            lcd.printf("Disconnected");
+                    }
+                }
             }
             break;
         case 4:
@@ -192,11 +212,10 @@
         case 5:
             lcd.printf("Socket State:");
             lcd.locate(0,16);
-            if(netConnecting){
+            if (netConnecting)
                 lcd.printf("Connecting... %d/5", retryAttempt);
-            } else {
+            else
                 lcd.printf(netConnected ? "Connected" : "Disconnected");
-            }
             break;
         case 6:
             lcd.printf("IP Address:");
@@ -206,17 +225,17 @@
         case 7:
             lcd.printf("Gateway:");
             lcd.locate(0,16);
-            lcd.printf("%s",gateway_addr);
+            lcd.printf("%s", gateway_addr);
             break;
         case 8:
             lcd.printf("App version:");
             lcd.locate(0,16);
-            lcd.printf("%s",__APP_SW_REVISION__);
+            lcd.printf("%s", __APP_SW_REVISION__);
             break;
         case 9:
             lcd.printf("Current Timeout:");
             lcd.locate(0,16);
-            lcd.printf("%d ms",connectTimeout);
+            lcd.printf("%d ms", connectTimeout);
             break;
     }
 }
@@ -250,15 +269,13 @@
 void menu_loop(void const *args)
 {
     int count = 0;
-    while(true){
+    while(true)
+    {
         setMenu();
-        if(++count % 10 == 0)
-        {
+        if (++count % 10 == 0)
             printMenu(menuItem);
-        }
         Thread::wait(100);
     }
-    
 }
 
 
@@ -289,7 +306,7 @@
     char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
     sprintf(clientId, "d:%s:%s:%s", org, type, id);
     
-    /* Network debug statements */
+    // Network debug statements 
     LOG("=====================================\n");
     LOG("Connecting Ethernet.\n");
     LOG("IP ADDRESS: %s\n", eth.getIPAddress());
@@ -302,13 +319,13 @@
     
     netConnecting = true;
     int rc = ipstack->connect(hostname, IBM_IOT_PORT, connectTimeout);
-    if (rc != 0){
+    if (rc != 0)
+    {
         WARN("IP Stack returned: %d\n", rc);    
         return rc;
     }
     netConnected = true;
     netConnecting = false;
-    
 
     // MQTT Connect
     mqttConnecting = true;
@@ -329,8 +346,11 @@
         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;
 }
@@ -345,17 +365,20 @@
 
 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()) {
+    while (!linkStatus()) 
+    {
         wait(1.0f);
         WARN("Ethernet link not present. Check cable connection\n");
     }
         
-    while (connect(client, ipstack) != 0) 
+    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);
@@ -393,7 +416,6 @@
 }
 
 
-
 char* getMac(EthernetInterface& eth, char* buf, int buflen)    // Obtain MAC address
 {   
     strncpy(buf, eth.getMACAddress(), buflen);
@@ -405,7 +427,6 @@
 }
 
 
-
 void messageArrived(MQTT::MessageData& md)
 {
     MQTT::Message &message = md.message;
@@ -456,14 +477,20 @@
     MQTTEthernet ipstack;
     ethernetInitialising = false;
     MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
-    LOG("Ethernet Initialised.\n");
-    
+    LOG("Ethernet Initialised.\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)    
     {
-        getMac(ipstack.getEth(), id, sizeof(id));
+        red();
+        while (true)
+            wait(1.0); // Permanent failures - don't retry
     }
-    attemptConnect(&client, &ipstack);
+    
     if (!quickstartMode) 
     {
         int rc = 0;