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

main.cpp

Committer:
sillevl
Date:
2017-04-25
Revision:
19:852fa5912f91
Parent:
18:da0ba00e21ab

File content as of revision 19:852fa5912f91:

#include "C12832.h"
#include "LM75B.h"
#include "MQTTEthernet.h"
#include "MQTTClient.h"
#include "rtos.h"
#include "MbedJSONValue.h"
#include "RGB.h"

/*** 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

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);
    lcd.puts((char*)message.payload);
    
    char buffer[32] = {0};
    memcpy(buffer, message.payload, message.payloadlen);
    
    MbedJSONValue payload;
    parse(payload, buffer);
    
    std::string color_string = payload["color"].get<std::string>();
    printf("Color: %s\n", color_string.c_str());
    
    Color color((int) std::strtol(color_string.c_str(), 0, 16));
    led.setColor(&color);
}

int main(int argc, char* argv[])
{   
    MQTTEthernet ipstack = MQTTEthernet();
    
    client = new MQTT::Client<MQTTEthernet, Countdown>(ipstack);
    
    lcd.printf("Connecting to %s:%d\n", hostname, port);
    int rc = ipstack.connect(hostname, port);
    if (rc != 0)
        lcd.printf("rc from TCP connect is %d\n", rc);
 
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;       
    data.MQTTVersion = 3;
    data.clientID.cstring = clientId;

    if ((rc = client->connect(data)) != 0)
        lcd.printf("rc from MQTT connect is %d\n", rc);
        
    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);    
    }

    
    return 0;
}