Test MQTT Protocol with a Temperature Sensore

Dependencies:   EthernetInterface LM75A MQTT mbed-rtos mbed

Fork of HelloMQTT by MQTT

Notebook info: HERE

Revision:
20:bec5faa6a303
Parent:
19:7f7aba7a4a8b
--- a/main.cpp	Thu Jul 30 13:49:18 2015 +0000
+++ b/main.cpp	Sat Jan 14 14:12:53 2017 +0000
@@ -1,135 +1,167 @@
-/*******************************************************************************
- * 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:
- *    Ian Craggs - initial API and implementation and/or initial documentation
- *    Ian Craggs - make sure QoS2 processing works, and add device headers
- *******************************************************************************/
- 
- /**
-  This is a sample program to illustrate the use of the MQTT Client library
-  on the mbed platform.  The Client class requires two classes which mediate
-  access to system interfaces for networking and timing.  As long as these two
-  classes provide the required public programming interfaces, it does not matter
-  what facilities they use underneath. In this program, they use the mbed
-  system libraries.
- 
- */
- 
- // change this to 0 to output messages to serial instead of LCD
-#define USE_LCD 1
+/*
+ * Author: Edoardo De Marchi
+ * Date: 14-01-2017
+ * Notes: Send the temperature value over MQTT protocol
+*/
 
-#if USE_LCD
-#include "C12832.h"
 
-#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
-
-#define printf lcd.cls();lcd.printf
-
-#endif
-
-#define MQTTCLIENT_QOS2 1
-
-#include "MQTTEthernet.h"
-#include "MQTTClient.h"
-
-int arrivedcount = 0;
+#include "main.h"
 
 
 void messageArrived(MQTT::MessageData& md)
 {
     MQTT::Message &message = md.message;
+    
+
     printf("Message arrived: qos %d, retained %d, dup %d, packetid %d\n", message.qos, message.retained, message.dup, message.id);
-    printf("Payload %.*s\n", message.payloadlen, (char*)message.payload);
-    ++arrivedcount;
+    printf("Payload [len: %d] %s\n", message.payloadlen, message.payload);
+    
+    memset(bufMQTT, 0, sizeof(bufMQTT));
+    message.payloadlen = 0;
 }
 
 
+
+
+
+
+// Thread that read the temperature from LM75 sensor
+void temp_sensor_thread(void const *argument)
+{
+    while (true) 
+    {
+        if(bStart)
+        {
+            
+            // Read Temperature
+            fTemperature = TempSensor.read_T();
+            if(fTemperature != fTemperatureTemp)
+            {         
+                int len = sprintf(bufMQTT, "The room temperature is: %4.2f degree C\n", fTemperature);
+                
+                fTemperatureTemp = fTemperature;
+                bNewValue = true;
+            }
+    
+            led3 = !led3;
+        
+        }
+        
+        osDelay(1000);  
+    } 
+} 
+
+
+
+
+
+
+
+void init()
+{
+    led1 = 0;
+    led2 = 0;
+    led3 = 0;
+    led4 = 0;
+    
+    
+    // Create Thread
+    osThreadCreate(osThread(temp_sensor_thread), NULL); 
+}
+
+
+
+
 int main(int argc, char* argv[])
 {   
-    MQTTEthernet ipstack = MQTTEthernet();
-    float version = 0.5;
-    char* topic = "mbed-sample";
+
+   
+    init();
+
+    printf("Connecting to %s:%d\n", hostbroker, port);
+        
     
-    printf("HelloMQTT: version is %f\n", version);
-              
-    MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
-    
-    char* hostname = "m2m.eclipse.org";
-    int port = 1883;
-    printf("Connecting to %s:%d\n", hostname, port);
-    int rc = ipstack.connect(hostname, port);
-    if (rc != 0)
+    // dhcp
+    MQTTEthernet ipstack = MQTTEthernet();
+
+
+    EthernetInterface& eth = ipstack.getEth();
+    printf("IP addr is %s\n", eth.getIPAddress());
+    printf("MAC addr is %s\n", eth.getMACAddress());
+    printf("Gateway addr is %s\n", eth.getGateway());
+
+
+    MQTT::Client<MQTTEthernet, Countdown> clientMQTT = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
+
+
+    // tcp connection
+    if ((rc = ipstack.connect(hostbroker, port)) != 0)
+    {
         printf("rc from TCP connect is %d\n", rc);
- 
-    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;       
-    data.MQTTVersion = 3;
-    data.clientID.cstring = "mbed-sample";
-    data.username.cstring = "testuser";
-    data.password.cstring = "testpassword";
-    if ((rc = client.connect(data)) != 0)
-        printf("rc from MQTT connect is %d\n", rc);
+    }else
+    {
+        printf("TCP connection OK\n");
+        led1 = 1;       
+    }
+
+
+
+    // Connection data         
+    MQTTPacket_connectData dataMQTT = MQTTPacket_connectData_initializer;       
+    dataMQTT.MQTTVersion = 3;
+    dataMQTT.clientID.cstring = clientID;
+    dataMQTT.username.cstring = username;
+    dataMQTT.password.cstring = password;
     
-    if ((rc = client.subscribe(topic, MQTT::QOS2, messageArrived)) != 0)
+
+    // client connection
+    if ((rc = clientMQTT.connect(dataMQTT)) != 0)
+    {
+        printf("rc from MQTT connect is %d\n", rc);
+    }else
+    {
+        printf("MQTT connection OK\n");
+        led2 = 1;
+    }
+    
+    
+    // topic subscribe
+    if ((rc = clientMQTT.subscribe(topic, MQTT::QOS2, messageArrived)) != 0)
+    {
         printf("rc from MQTT subscribe is %d\n", rc);
-
-    MQTT::Message message;
-
+    }else
+    {
+        printf("MQTT subscribe OK\n");
+    } 
+    
+    
     // QoS 0
-    char buf[100];
-    sprintf(buf, "Hello World!  QoS 0 message from app version %f\n", version);
     message.qos = MQTT::QOS0;
     message.retained = false;
     message.dup = false;
-    message.payload = (void*)buf;
-    message.payloadlen = strlen(buf)+1;
-    rc = client.publish(topic, message);
-    while (arrivedcount < 1)
-        client.yield(100);
-        
-    // QoS 1
-    sprintf(buf, "Hello World!  QoS 1 message from app version %f\n", version);
-    message.qos = MQTT::QOS1;
-    message.payloadlen = strlen(buf)+1;
-    rc = client.publish(topic, message);
-    while (arrivedcount < 2)
-        client.yield(100);
-        
-    // QoS 2
-    sprintf(buf, "Hello World!  QoS 2 message from app version %f\n", version);
-    message.qos = MQTT::QOS2;
-    message.payloadlen = strlen(buf)+1;
-    rc = client.publish(topic, message);
-    while (arrivedcount < 3)
-        client.yield(100);
+
+
+
+    // Set configuration register
+    TempSensor.write_reg(0x01, 0x00);
+    fTemperatureTemp = TempSensor.read_T();
+
+    bStart = true;
+
+    while(1) 
+    {
+
+        if(bNewValue)
+        {
+            bNewValue = false;
+            message.payload = (void*)bufMQTT;
+            message.payloadlen = strlen(bufMQTT)+1;
             
-    if ((rc = client.unsubscribe(topic)) != 0)
-        printf("rc from unsubscribe was %d\n", rc);
-    
-    if ((rc = client.disconnect()) != 0)
-        printf("rc from disconnect was %d\n", rc);
-    
-    ipstack.disconnect();
-    
-    printf("Version %.2f: finish %d msgs\n", version, arrivedcount);
-    
-    return 0;
+            // publish message
+            rc = clientMQTT.publish(topic, message);
+        }
+         
+      
+        clientMQTT.yield(100);     
+    }
 }