Example application using MQTT for a thermostat application.
Dependencies: C12832 EthernetInterface LM75B MQTT MbedJSONValue RGB-fun mbed-rtos mbed
Fork of HelloMQTT_FRDMK64F by
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;
}
