Example application using MQTT for a thermostat application.

Dependencies:   C12832 EthernetInterface LM75B MQTT MbedJSONValue RGB-fun mbed-rtos mbed

Fork of HelloMQTT_FRDMK64F by Junichi SHIBA

Files at this revision

API Documentation at this revision

Comitter:
sillevl
Date:
Tue Apr 25 12:22:31 2017 +0000
Parent:
17:e3aa8f5ee6ed
Child:
19:852fa5912f91
Commit message:
mqtt thermostat example

Changed in this revision

LM75B.lib Show annotated file Show diff for this revision Revisions of this file
MbedJSONValue.lib Show annotated file Show diff for this revision Revisions of this file
RGB-fun.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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LM75B.lib	Tue Apr 25 12:22:31 2017 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/chris/code/LM75B/#6a70c9303bbe
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/MbedJSONValue.lib	Tue Apr 25 12:22:31 2017 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/samux/code/MbedJSONValue/#10a99cdf7846
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/RGB-fun.lib	Tue Apr 25 12:22:31 2017 +0000
@@ -0,0 +1,1 @@
+https://mbed.org/users/sillevl/code/RGB-fun/#d10cfeb2f18e
--- a/main.cpp	Mon Apr 13 09:41:48 2015 +0000
+++ b/main.cpp	Tue Apr 25 12:22:31 2017 +0000
@@ -1,66 +1,80 @@
-/*******************************************************************************
- * Copyright (c) 2014 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
- *******************************************************************************/
- 
- /**
-  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.
- 
- */
-
-
 #include "C12832.h"
-//C12832 lcd(p5, p7, p6, p8, p11);
-// Using Arduino pin notation
-C12832 lcd(D11, D13, D12, D7, D10);
-
+#include "LM75B.h"
 #include "MQTTEthernet.h"
 #include "MQTTClient.h"
+#include "rtos.h"
+#include "MbedJSONValue.h"
+#include "RGB.h"
 
-int arrivedcount = 0;
+/*** IMPORTANT !!! 
+ * Change the following values 
+ */
+ 
+char* hostname = "mqtt.labict.be";
+char* temperature_topic = "softwareengineering/thermostat/YOURSENSORID/temperature";
+char* led_topic = "softwareengineering/thermostat/YOURSENSORID/led";
+int port = 1883;
+char* clientId = "myrandomstringclientid";
+
+//#define K64F 1
 
+#ifdef K64F
+    C12832 lcd(D11, D13, D12, D7, D10);
+    LM75B sensor(D14,D15);   
+    RGB led(p23,p24,p25);
+#else   //LPC1768
+    C12832 lcd(p5, p7, p6, p8, p11); 
+    LM75B sensor(p28,p27); 
+    RGB led(p23,p24,p25);
+#endif
 
-void messageArrived(MQTT::MessageData& md)
+MQTT::Client<MQTTEthernet, Countdown>* client;
+
+void send_temperature(void const * arg)
+{
+    while(true){
+        char buf[100];
+        sprintf(buf, "{\"temperature\": %.2f}", sensor.read());
+        
+        MQTT::Message message;
+        message.qos = MQTT::QOS0;
+        message.retained = false;
+        message.dup = false;
+        message.payload = (void*)buf;
+        message.payloadlen = strlen(buf);
+        client->publish(temperature_topic, message); 
+        
+        Thread::wait(5000);     
+    }
+}
+
+void process_rgb(MQTT::MessageData& md)
 {
     MQTT::Message &message = md.message;
     lcd.cls();
     lcd.locate(0,3);
     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;
-    lcd.puts((char*)message.payload);
+    
+    Color color((int) std::strtol((char*)message.payload, 0, 16));
+    led.setColor(&color);
+    
+/*    //lcd.puts((char*)message.payload);
+    
+    MbedJSONValue payload;
+    parse(payload, (char*)message.payload);
+    
+    std::string color = payload["color"].get<std::string>();
+    printf("Color: %s\n", color.c_str());*/
+    
 }
 
-
 int main(int argc, char* argv[])
 {   
     MQTTEthernet ipstack = MQTTEthernet();
-    float version = 0.47;
-    char* topic = "mbed-sample";
     
-    lcd.printf("Version is %f\n", version);
-    printf("Version is %f\n", version);
-              
-    MQTT::Client<MQTTEthernet, Countdown> client = MQTT::Client<MQTTEthernet, Countdown>(ipstack);
+    client = new MQTT::Client<MQTTEthernet, Countdown>(ipstack);
     
-    char* hostname = "m2m.eclipse.org";
-    int port = 1883;
     lcd.printf("Connecting to %s:%d\n", hostname, port);
     int rc = ipstack.connect(hostname, port);
     if (rc != 0)
@@ -68,68 +82,22 @@
  
     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)
-        lcd.printf("rc from MQTT connect is %d\n", rc);
-    
-    if ((rc = client.subscribe(topic, MQTT::QOS1, messageArrived)) != 0)
-        lcd.printf("rc from MQTT subscribe is %d\n", rc);
-
-    MQTT::Message message;
+    data.clientID.cstring = clientId;
 
-    // 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);
+    if ((rc = client->connect(data)) != 0)
+        lcd.printf("rc from MQTT connect is %d\n", rc);
         
-    // 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);
-        
-    // n * QoS 2
-    for (int i = 1; i <= 10; ++i)
-    {
-        sprintf(buf, "Hello World!  QoS 2 message number %d from app version %f\n", i, version);
-        message.qos = MQTT::QOS2;
-        message.payloadlen = strlen(buf)+1;
-        rc = client.publish(topic, message);
-        while (arrivedcount < i + 3)
-            client.yield(100);
+    if ((rc = client->subscribe(led_topic, MQTT::QOS1, process_rgb)) != 0)
+        lcd.printf("rc from MQTT subscribe is %d\n", rc);
+    
+
+    Thread send_thread(send_temperature);
+
+
+    while(true){
+        client->yield(100);    
     }
-    
-    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();
-    
-    lcd.cls();
-    lcd.locate(0,3);
-    lcd.printf("Version %.2f: finish %d msgs\n", version, arrivedcount);
-    printf("Finishing with %d messages received\n", arrivedcount);
+
     
     return 0;
 }