hwsdf

Dependencies:   C12832 hw4f HW4 MQTT

Dependents:   HW4

Fork of HW4 by Hyoeun Choi

main.cpp

Committer:
Hyoeunchoi
Date:
2018-01-05
Revision:
23:d508f2806faa
Parent:
21:a68bd76740f9
Child:
24:4b8390b87ab3

File content as of revision 23:d508f2806faa:

 // change this to 1 to output messages to LCD instead of serial
#define logMessage printf
#define MQTTCLIENT_QOS2 1

#include <string>
#include "mbed.h"
#include "easy-connect.h"
#include "MQTTNetwork.h"
#include "MQTTmbed.h"
#include "MQTTClient.h"
#include "TCPSocket.h"
#include "DHT22.h"

#define WIFI_HW_RESET_PIN D4

#define MQTT_BROKER_ADDR "192.168.0.10"
#define MQTT_BROKER_PORT 1883

DigitalOut wifiHwResetPin(WIFI_HW_RESET_PIN);
DigitalOut led2(LED2);
DHT22 dht22(D7);
Serial pc(USBTX, USBRX, 115200);

volatile bool flag = false;

Mutex mqttMtx;

char* topic_toGW = "toGW";
char* topic_fromGW = "toNUCLEO";

void messageArrived(MQTT::MessageData& md)
{
    MQTT::Message &message = md.message;
    //logMessage("Message arrived: qos %d, retained %d, dup %d, packetid %d\r\n", message.qos, message.retained, message.dup, message.id);
    //logMessage("Payload %.*s\r\n", message.payloadlen, (char*)message.payload);
    
    pc.printf("Subscribe from GW: %.*s\r\n", message.payloadlen, (char*)message.payload);
    char fwdTarget = ((char*)message.payload)[0];
    switch(fwdTarget){
        case '0':
            led2 = 0;
            pc.printf("LED Turn Off\r\n\r\n");
            break;
        case '1':
            led2 = 1;
            pc.printf("LED Turn On\r\n");
            break;
        default:
            pc.printf("Unknown MQTT message\r\n");
            break;
    }
}

double getTemp(void){
    double temp;
    if(dht22.sample()){
        temp=dht22.getTemperature()/10.0;
        pc.printf("temperature: %3.1f\r\n",temp);
    } else{
        temp=-999;
        pc.printf("Checksum error\r\n");
    }
    return temp;
}

int main(int argc, char* argv[])
{
    float version = 0.5;
    NetworkInterface* net = easy_connect(true);
    if (!net) {
        pc.printf("Error in easy connection\r\n");
        return -1;
    }
    logMessage("HelloMQTT: version is %.2f\r\n", version);

    wait(0.2);
    pc.printf("Resetting ESP8266 Hardware...\r\n");
    wifiHwResetPin = 0;
    wait_ms(500);
    wifiHwResetPin = 1;
    
    MQTTNetwork mqttNetwork(net);
    MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork);

    logMessage("Connecting to %s:%d\r\n", MQTT_BROKER_ADDR, MQTT_BROKER_PORT);
    int rc = mqttNetwork.connect(MQTT_BROKER_ADDR, MQTT_BROKER_PORT);
    if (rc != 0)
        logMessage("rc from GW connect is %d\r\n", rc);

    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    data.MQTTVersion = 3;
    data.clientID.cstring = "mbed-sample-Hyoeun";
    data.username.cstring = "testuser";
    data.password.cstring = "testpassword";
    if ((rc = client.connect(data)) != 0)
        logMessage("rc from MQTT connect is %d\r\n", rc);

    if ((rc = client.subscribe(topic_fromGW, MQTT::QOS2, messageArrived)) != 0)
        logMessage("rc from MQTT subscribe is %d\r\n", rc);

    int count = 0;
    while(1){
        Thread::wait(1000);
        char buf[100];
        MQTT::Message message;
        
        if(count == 5){
            pc.printf("Publish: toGW\r\n");
            sprintf(buf, "{\"temp\": %3.1f}", getTemp());
            message.qos = MQTT::QOS0;
            message.retained = false;
            message.dup = false;
            message.payload = (void*)buf;
            message.payloadlen = strlen(buf)+1;
            pc.printf("%s",message);
            mqttMtx.lock();
            rc = client.publish(topic_toGW, message);
            mqttMtx.unlock();
            count = 0;
            pc.printf("\r\n");
        }
        if(!client.isConnected()) NVIC_SystemReset();
        client.yield(10);
        count++;
    }
}