Duy tran / Mbed OS iot_water_monitor_v2

Dependencies:   easy-connect-v16 Watchdog FP MQTTPacket RecordType-v-16 watersenor_and_temp_code

main.cpp

Committer:
DuyLionTran
Date:
2017-11-28
Revision:
5:7f353f2b63b9
Parent:
3:1bc26dfb6d35
Child:
6:3efc470a9f35

File content as of revision 5:7f353f2b63b9:

/***************************************************************
 * Includes
 ***************************************************************/
#include "mbed.h"
#include "easy-connect.h"
#include "MQTTNetwork.h"
#include "MQTTmbed.h"
#include "MQTTClient.h"
#include "string.h"

/***************************************************************
 * Definitions
 ***************************************************************/
#define logMessage printf
#define MQTTCLIENT_QOS2 (0)
#define MQTT_OK         (0)
#define MQTT_FAIL       (-1)
 
#define SENSOR_1_PIN  (A0)
#define SENSOR_2_PIN  (A1)
#define SENSOR_3_PIN  (A3)
#define SENSOR_4_PIN  (A4)

#define RELAY_1_PIN   (D11)
#define RELAY_2_PIN   (D12)

#define ORG           "a4nvkh"
#define DEVICE_TYPE   "Nucleo_8266"
#define DEVICE_ID     "PROEVN"
#define TOKEN         "PROEVN2017"

/***************************************************************
 * Variables
 ***************************************************************/
float firmwareVersion = 0.86; 
 
char server[]     = ORG ".messaging.internetofthings.ibmcloud.com";
char topicCMD[]   = "iot-2/cmd/test/fmt/json";
char topicEvent[] = "iot-2/evt/status/fmt/json";
char authMethod[] = "use-token-auth";
char token[]      = TOKEN;
char clientId[]   = "d:" ORG ":" DEVICE_TYPE ":" DEVICE_ID;
int  ibmPort      = 1883;

int arrivedcount = 0;
uint32_t lastRead = 0;
uint32_t timer_last_read = 0;

uint8_t readVal1 = 0, readVal2 = 7;;

Timer  readTime;
Thread thread;
Serial serial(USBTX, USBRX);

/***************************************************************
 * Structs/Classess
 ***************************************************************/
NetworkInterface* network = easy_connect(true);
MQTTNetwork mqttNetwork(network);
MQTT::Client<MQTTNetwork, Countdown> client(mqttNetwork);

/***************************************************************
 * Callbacks
 ***************************************************************/
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);
}

/***************************************************************
 * Unity function definitions
 ***************************************************************/
int MQTT_publish(char *sendMessage);
void clientYield();


/***************************************************************
 * Main
 ***************************************************************/
void main(int argc, char* argv[]) {
    serial.baud(115200);
    
    logMessage("IoT Water Monitor project, firmware version is %.2f\r\n", firmwareVersion);
    
    if (!network) {
        logMessage("Failed to connect to the internet\r\n");
        return ;
    }
    
    logMessage("Connecting to %s:%d\r\n", server, ibmPort);
    int rc = mqttNetwork.connect(server, ibmPort);
    if (rc != 0)
        logMessage("rc from TCP connect is %d\r\n", rc);
          
    MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
    data.MQTTVersion = 3;
    data.clientID.cstring = clientId;
    data.username.cstring = authMethod;
    data.password.cstring = token;
    
    if ((rc = client.connect(data)) != 0)
        logMessage("rc from MQTT connect is %d\r\n", rc);
    if ((rc = client.subscribe(topicCMD, MQTT::QOS0, messageArrived)) != 0)
        logMessage("rc from MQTT subscribe is %d\r\n", rc);
    
//    char* payload = "{\"d\":{\"Name\":\"PROEVN\",\"Firmware Version\":\"0.86\"}}";    
    char greetingMessage[100];
    sprintf(greetingMessage, "{\"d\":{\"Device ID\":\"PROEVN\",\"Firmware Version\":\"%f\"}}", firmwareVersion);
    
    printf("Sending payload: %s\r\n", greetingMessage);
    if (!MQTT_publish((char *)greetingMessage)) {
        printf("Publish ok\r\n");
    }    
    else {
        printf("Publish failed\r\n");
    }

    readTime.start();
    
    wait(2);
    
//    thread.start(callback(clientYield));
//    timer.attach(&publish, 2);
    uint8_t counter = 0;
    uint16_t cmdID  = 0;
        
    while(true) {  
        
        if ((uint32_t)(readTime.read() - lastRead) > 10) {
            counter++;
            char payload[100];
            sprintf(payload, "{\"d\":{\"Type\":\"1\",\"Command ID\":\"%d\",\"ADC0\":\"%d\",\"ADC1\":\"%d\"}}", cmdID, counter, counter++);
            printf("MQTT publish %s\r\n", payload);
            if (!MQTT_publish((char *)payload)) {
                printf("Publish ok\r\n");
                cmdID++;
            }    
            else {
                printf("Publish failed\r\n");
            }
            
            lastRead = readTime.read();
        }
        client.yield(100);
    
    }
        
}

/***************************************************************
 * Unity function declarations
 ***************************************************************/
int MQTT_publish(char *sendMessage) {
    
    MQTT::Message msg;
    msg.qos = MQTT::QOS0;
    msg.retained = false;
    msg.dup = false;
    msg.payload = sendMessage;
    msg.payloadlen = strlen(sendMessage) + 1;

    return client.publish(topicEvent, msg);
           
}