iot_water_monitor_v2

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

Committer:
DuyLionTran
Date:
Thu Jan 04 17:17:42 2018 +0000
Revision:
28:82f5420bf388
version 1.8.8: json parser works fine, next update will turn on/off a led online

Who changed what in which revision?

UserRevisionLine numberNew contents of line
DuyLionTran 28:82f5420bf388 1 #ifndef __SIMPLEMQTT_H__
DuyLionTran 28:82f5420bf388 2 #define __SIMPLEMQTT_H__
DuyLionTran 28:82f5420bf388 3
DuyLionTran 28:82f5420bf388 4 /***************************************************************
DuyLionTran 28:82f5420bf388 5 * Includes
DuyLionTran 28:82f5420bf388 6 ***************************************************************/
DuyLionTran 28:82f5420bf388 7 #include "easy-connect.h"
DuyLionTran 28:82f5420bf388 8 #include "MQTTClient.h"
DuyLionTran 28:82f5420bf388 9 #include "NDefLib/NDefNfcTag.h"
DuyLionTran 28:82f5420bf388 10 #include "NDefLib/RecordType/RecordURI.h"
DuyLionTran 28:82f5420bf388 11 #include "MQTTNetwork.h"
DuyLionTran 28:82f5420bf388 12 #include "MQTTmbed.h"
DuyLionTran 28:82f5420bf388 13
DuyLionTran 28:82f5420bf388 14 #include "Json.h"
DuyLionTran 28:82f5420bf388 15 /***************************************************************
DuyLionTran 28:82f5420bf388 16 * Definitions
DuyLionTran 28:82f5420bf388 17 ***************************************************************/
DuyLionTran 28:82f5420bf388 18 // Configuration values needed to connect to IBM IoT Cloud
DuyLionTran 28:82f5420bf388 19 #define ORG MQTT_ORG_ID // connect to ORG.internetofthings.ibmcloud.com/ For a registered connection, replace with your org
DuyLionTran 28:82f5420bf388 20 #define ID MQTT_DEVICE_ID // For a registered connection is your device id
DuyLionTran 28:82f5420bf388 21 #define AUTH_TOKEN MQTT_DEVICE_PASSWORD // For a registered connection is a device auth-token
DuyLionTran 28:82f5420bf388 22 #define DEFAULT_TYPE_NAME MQTT_DEVICE_TYPE // For a registered connection is device type
DuyLionTran 28:82f5420bf388 23 #define AUTH_METHOD MQTT_USERNAME
DuyLionTran 28:82f5420bf388 24
DuyLionTran 28:82f5420bf388 25 #define TYPE DEFAULT_TYPE_NAME // For a registered connection, replace with your type
DuyLionTran 28:82f5420bf388 26 #define IBM_IOT_PORT MQTT_PORT
DuyLionTran 28:82f5420bf388 27
DuyLionTran 28:82f5420bf388 28 #define MQTT_MAX_PACKET_SIZE 400
DuyLionTran 28:82f5420bf388 29 #define MQTT_MAX_PAYLOAD_SIZE 300
DuyLionTran 28:82f5420bf388 30
DuyLionTran 28:82f5420bf388 31 /***************************************************************
DuyLionTran 28:82f5420bf388 32 * Variables
DuyLionTran 28:82f5420bf388 33 ***************************************************************/
DuyLionTran 28:82f5420bf388 34 typedef enum {
DuyLionTran 28:82f5420bf388 35 ADC_VALUE = 0,
DuyLionTran 28:82f5420bf388 36 SENSOR_VALUE,
DuyLionTran 28:82f5420bf388 37 RELAY_STATE,
DuyLionTran 28:82f5420bf388 38 CONFIG_VALUE
DuyLionTran 28:82f5420bf388 39 } UploadType;
DuyLionTran 28:82f5420bf388 40
DuyLionTran 28:82f5420bf388 41 struct UploadValue {
DuyLionTran 28:82f5420bf388 42 float ADC_PHVal;
DuyLionTran 28:82f5420bf388 43 float ADC_DOVal;
DuyLionTran 28:82f5420bf388 44
DuyLionTran 28:82f5420bf388 45 int RELAY_State_1;
DuyLionTran 28:82f5420bf388 46 int RELAY_State_2;
DuyLionTran 28:82f5420bf388 47
DuyLionTran 28:82f5420bf388 48 uint8_t CONFIG_Mode;
DuyLionTran 28:82f5420bf388 49 uint8_t CONFIG_MinOxi;
DuyLionTran 28:82f5420bf388 50 uint8_t CONFIG_MaxOxi;
DuyLionTran 28:82f5420bf388 51 uint16_t CONFIG_UploadInterval;
DuyLionTran 28:82f5420bf388 52 } UploadValue;
DuyLionTran 28:82f5420bf388 53
DuyLionTran 28:82f5420bf388 54 char *projectName = "WaterMonitor";
DuyLionTran 28:82f5420bf388 55 static char id[30] = ID; // mac without colons
DuyLionTran 28:82f5420bf388 56 static char org[12] = ORG;
DuyLionTran 28:82f5420bf388 57 static char type[30] = TYPE;
DuyLionTran 28:82f5420bf388 58 static char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode
DuyLionTran 28:82f5420bf388 59 static int connack_rc = 0; // MQTT connack return code
DuyLionTran 28:82f5420bf388 60 static bool netConnecting = false;
DuyLionTran 28:82f5420bf388 61 static bool mqttConnecting = false;
DuyLionTran 28:82f5420bf388 62 static bool netConnected = false;
DuyLionTran 28:82f5420bf388 63 static bool connected = false;
DuyLionTran 28:82f5420bf388 64 static int retryAttempt = 0;
DuyLionTran 28:82f5420bf388 65 static int connectTimeout = 1000;
DuyLionTran 28:82f5420bf388 66 uint16_t commandID = 0;
DuyLionTran 28:82f5420bf388 67 static char subscription_url[MQTT_MAX_PAYLOAD_SIZE];
DuyLionTran 28:82f5420bf388 68
DuyLionTran 28:82f5420bf388 69 /***************************************************************
DuyLionTran 28:82f5420bf388 70 * Unity function definitions
DuyLionTran 28:82f5420bf388 71 ***************************************************************/
DuyLionTran 28:82f5420bf388 72 /** brief Callback function when MQTT message arrives
DuyLionTran 28:82f5420bf388 73 * param[in] msgMQTT
DuyLionTran 28:82f5420bf388 74 * retral None
DuyLionTran 28:82f5420bf388 75 */
DuyLionTran 28:82f5420bf388 76 void MQTT_SubscribeCallback(MQTT::MessageData & msgMQTT);
DuyLionTran 28:82f5420bf388 77
DuyLionTran 28:82f5420bf388 78 /** brief Subscribe to a MQTT topic and set the MQTT callback function
DuyLionTran 28:82f5420bf388 79 * param[in] subscribeTopic Topic to be subscribed
DuyLionTran 28:82f5420bf388 80 * param[in] client MQTT client
DuyLionTran 28:82f5420bf388 81 * retral returnCode from MQTTClient.h
DuyLionTran 28:82f5420bf388 82 */
DuyLionTran 28:82f5420bf388 83 int MQTT_Subscribe(char *subscribeTopic, MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client);
DuyLionTran 28:82f5420bf388 84
DuyLionTran 28:82f5420bf388 85 /** brief Connect to the internet then the MQTT network
DuyLionTran 28:82f5420bf388 86 * param[in] client MQTT client
DuyLionTran 28:82f5420bf388 87 * param[in] mqttNetwork MQTT network
DuyLionTran 28:82f5420bf388 88 * param[in] network The internet network interface (ethernet, wifi...)
DuyLionTran 28:82f5420bf388 89 * retral Internet connect result and returnCode from MQTTClient.h
DuyLionTran 28:82f5420bf388 90 */
DuyLionTran 28:82f5420bf388 91 int MQTT_Connect(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTNetwork *mqttNetwork, NetworkInterface* network);
DuyLionTran 28:82f5420bf388 92
DuyLionTran 28:82f5420bf388 93 /** brief Setup the number of attempt to re-connect to the internet
DuyLionTran 28:82f5420bf388 94 * param[in] attemptNumber The number of attemp
DuyLionTran 28:82f5420bf388 95 */
DuyLionTran 28:82f5420bf388 96 int MQTT_GetConnTimeout(int attemptNumber);
DuyLionTran 28:82f5420bf388 97
DuyLionTran 28:82f5420bf388 98 /** brief Try to reconnect to the internet and MQTT network
DuyLionTran 28:82f5420bf388 99 * retral None
DuyLionTran 28:82f5420bf388 100 */
DuyLionTran 28:82f5420bf388 101 void MQTT_AttemptConnect(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTNetwork *mqttNetwork, NetworkInterface* network);
DuyLionTran 28:82f5420bf388 102
DuyLionTran 28:82f5420bf388 103 /** brief Publish ADC values to the server
DuyLionTran 28:82f5420bf388 104 * param[in] client MQTT client
DuyLionTran 28:82f5420bf388 105 * param[in] inputTime The time when the data is attempt to be sent
DuyLionTran 28:82f5420bf388 106 * param[in] adcVal_0 The ADC value to be sent
DuyLionTran 28:82f5420bf388 107 * retral returnCode from MQTTClient.h
DuyLionTran 28:82f5420bf388 108 */
DuyLionTran 28:82f5420bf388 109 int MQTT_PublishADC(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, time_t inputTime, float adcVal_0);
DuyLionTran 28:82f5420bf388 110
DuyLionTran 28:82f5420bf388 111 /** brief Publish relay states to the server
DuyLionTran 28:82f5420bf388 112 * param[in] client MQTT client
DuyLionTran 28:82f5420bf388 113 * param[in] inputTime The time when the data is attempt to be sent
DuyLionTran 28:82f5420bf388 114 * param[in] relay1 Relay 1 state
DuyLionTran 28:82f5420bf388 115 * param[in] relay2 Relay 2 state
DuyLionTran 28:82f5420bf388 116 * retral returnCode from MQTTClient.h
DuyLionTran 28:82f5420bf388 117 */
DuyLionTran 28:82f5420bf388 118 int MQTT_PublishRelayState(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, time_t inputTime, int relay1, int relay2);
DuyLionTran 28:82f5420bf388 119
DuyLionTran 28:82f5420bf388 120 /** brief Publish relay states to the server
DuyLionTran 28:82f5420bf388 121 * param[in] client MQTT client
DuyLionTran 28:82f5420bf388 122 * param[in] inputTime The time when the data is attempt to be sent
DuyLionTran 28:82f5420bf388 123 * param[in] mode current mode: automatic (0) or manual (1)
DuyLionTran 28:82f5420bf388 124 * param[in] maxOxi Maximum Oxygen value
DuyLionTran 28:82f5420bf388 125 * param[in] minOxi Minimum Oxygen value
DuyLionTran 28:82f5420bf388 126 // * param[in] uploadInterval Interval between upload turns
DuyLionTran 28:82f5420bf388 127 * retral returnCode from MQTTClient.h
DuyLionTran 28:82f5420bf388 128 */
DuyLionTran 28:82f5420bf388 129 int MQTT_PublishConfigValue(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, time_t inputTime, uint8_t mode, uint8_t minOxi, uint8_t maxOxi);
DuyLionTran 28:82f5420bf388 130
DuyLionTran 28:82f5420bf388 131 /** brief Upload all the data to the MQTT server
DuyLionTran 28:82f5420bf388 132 * param[in] client MQTT client
DuyLionTran 28:82f5420bf388 133 * param[in] inputTime The time when the data is attempt to be sent
DuyLionTran 28:82f5420bf388 134 * param[in] uploadInterval The period between each upload moment
DuyLionTran 28:82f5420bf388 135 * retral returnCode from MQTTClient.h
DuyLionTran 28:82f5420bf388 136 */
DuyLionTran 28:82f5420bf388 137 int MQTT_PublishAll(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, time_t inputTime, uint8_t uploadType, struct UploadValue uploadStruct);
DuyLionTran 28:82f5420bf388 138
DuyLionTran 28:82f5420bf388 139 /********************************************************************************************************************************************************************************************/
DuyLionTran 28:82f5420bf388 140 /***************************************************************
DuyLionTran 28:82f5420bf388 141 * Unity function declarations
DuyLionTran 28:82f5420bf388 142 ***************************************************************/
DuyLionTran 28:82f5420bf388 143 void MQTT_SubscribeCallback(MQTT::MessageData & msgMQTT) {
DuyLionTran 28:82f5420bf388 144 char msg[MQTT_MAX_PAYLOAD_SIZE];
DuyLionTran 28:82f5420bf388 145 msg[0]='\0';
DuyLionTran 28:82f5420bf388 146 strncat (msg, (char*)msgMQTT.message.payload, msgMQTT.message.payloadlen);
DuyLionTran 28:82f5420bf388 147 printf ("--->>> MQTT_SubscribeCallback msg: %s\n\r", msg);
DuyLionTran 28:82f5420bf388 148 //{"type":"3","deviceId":"string"}
DuyLionTran 28:82f5420bf388 149 Json json(msg, msgMQTT.message.payloadlen);
DuyLionTran 28:82f5420bf388 150 if (!json.isValidJson()) {
DuyLionTran 28:82f5420bf388 151 printf("Invalid JSON: %s", msg);
DuyLionTran 28:82f5420bf388 152 }
DuyLionTran 28:82f5420bf388 153 else {
DuyLionTran 28:82f5420bf388 154 if (json.type(0) != JSMN_OBJECT ) {
DuyLionTran 28:82f5420bf388 155 printf("Invalid JSON. ROOT element is not Object: %s", msg);
DuyLionTran 28:82f5420bf388 156 }
DuyLionTran 28:82f5420bf388 157 else {
DuyLionTran 28:82f5420bf388 158 int CommandType;
DuyLionTran 28:82f5420bf388 159 int KeyIndex = json.findKeyIndexIn("type", 0);
DuyLionTran 28:82f5420bf388 160 int KeyValueIndex = json.findChildIndexOf(KeyIndex, 0);
DuyLionTran 28:82f5420bf388 161 int ret = json.tokenIntegerValue(KeyValueIndex, CommandType);
DuyLionTran 28:82f5420bf388 162 printf("Command Type: %d, error %d\r\n", CommandType, ret);
DuyLionTran 28:82f5420bf388 163
DuyLionTran 28:82f5420bf388 164 char DeviceID[32];
DuyLionTran 28:82f5420bf388 165 KeyIndex = json.findKeyIndexIn("deviceId", 0);
DuyLionTran 28:82f5420bf388 166 KeyValueIndex = json.findChildIndexOf(KeyIndex, 0);
DuyLionTran 28:82f5420bf388 167
DuyLionTran 28:82f5420bf388 168 const char *valueStart = json.tokenAddress(KeyValueIndex);
DuyLionTran 28:82f5420bf388 169 int valueLength = json.tokenLength(KeyValueIndex);
DuyLionTran 28:82f5420bf388 170 strncpy(DeviceID, valueStart, valueLength);
DuyLionTran 28:82f5420bf388 171 DeviceID[valueLength] = 0;
DuyLionTran 28:82f5420bf388 172 printf("Device ID: %s\r\n", DeviceID);
DuyLionTran 28:82f5420bf388 173 }
DuyLionTran 28:82f5420bf388 174 }
DuyLionTran 28:82f5420bf388 175 }
DuyLionTran 28:82f5420bf388 176
DuyLionTran 28:82f5420bf388 177 int MQTT_Subscribe(char *subscribeTopic, MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client) {
DuyLionTran 28:82f5420bf388 178 return client->subscribe(subscribeTopic, MQTT::QOS1, MQTT_SubscribeCallback);
DuyLionTran 28:82f5420bf388 179 }
DuyLionTran 28:82f5420bf388 180
DuyLionTran 28:82f5420bf388 181 int MQTT_Connect(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTNetwork *mqttNetwork, NetworkInterface* network) {
DuyLionTran 28:82f5420bf388 182 const char* iot_ibm = MQTT_BROKER_URL;
DuyLionTran 28:82f5420bf388 183 char hostname[strlen(org) + strlen(iot_ibm) + 1];
DuyLionTran 28:82f5420bf388 184
DuyLionTran 28:82f5420bf388 185 sprintf(hostname, "%s%s", org, iot_ibm);
DuyLionTran 28:82f5420bf388 186 // Construct clientId - d:org:type:id
DuyLionTran 28:82f5420bf388 187 char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
DuyLionTran 28:82f5420bf388 188 sprintf(clientId, "d:%s:%s:%s", org, type, id);
DuyLionTran 28:82f5420bf388 189 sprintf(subscription_url, "%s.%s/#/device/%s/%s/", org, "internetofthings.ibmcloud.com", id, DEFAULT_TYPE_NAME);
DuyLionTran 28:82f5420bf388 190
DuyLionTran 28:82f5420bf388 191 // Network debug statements
DuyLionTran 28:82f5420bf388 192 LOG("=====================================\n\r");
DuyLionTran 28:82f5420bf388 193 LOG("Nucleo IP ADDRESS: %s\n\r", network->get_ip_address());
DuyLionTran 28:82f5420bf388 194 LOG("Nucleo MAC ADDRESS: %s\n\r", network->get_mac_address());
DuyLionTran 28:82f5420bf388 195 LOG("Server Hostname: %s port: %d\n\r", hostname, IBM_IOT_PORT);
DuyLionTran 28:82f5420bf388 196 LOG("Client ID: %s\n\r", clientId);
DuyLionTran 28:82f5420bf388 197 LOG("Topic: %s\n\r",MQTT_EVENT_TOPIC);
DuyLionTran 28:82f5420bf388 198 LOG("Subscription URL: %s\n\r", subscription_url);
DuyLionTran 28:82f5420bf388 199 LOG("=====================================\n\r");
DuyLionTran 28:82f5420bf388 200 netConnecting = true;
DuyLionTran 28:82f5420bf388 201 int rc = mqttNetwork->connect(hostname, IBM_IOT_PORT);
DuyLionTran 28:82f5420bf388 202 if (rc != 0) {
DuyLionTran 28:82f5420bf388 203 printf("rc from TCP connect is %d\r\n", rc);
DuyLionTran 28:82f5420bf388 204 return rc;
DuyLionTran 28:82f5420bf388 205 }
DuyLionTran 28:82f5420bf388 206
DuyLionTran 28:82f5420bf388 207 printf ("--->TCP Connected\n\r");
DuyLionTran 28:82f5420bf388 208 netConnected = true;
DuyLionTran 28:82f5420bf388 209 netConnecting = false;
DuyLionTran 28:82f5420bf388 210
DuyLionTran 28:82f5420bf388 211 // MQTT Connect
DuyLionTran 28:82f5420bf388 212 mqttConnecting = true;
DuyLionTran 28:82f5420bf388 213 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
DuyLionTran 28:82f5420bf388 214 data.MQTTVersion = 4;
DuyLionTran 28:82f5420bf388 215 data.struct_version = 0;
DuyLionTran 28:82f5420bf388 216 data.clientID.cstring = clientId;
DuyLionTran 28:82f5420bf388 217 data.keepAliveInterval = MQTT_KEEPALIVE; // in Sec
DuyLionTran 28:82f5420bf388 218 data.username.cstring = AUTH_METHOD;
DuyLionTran 28:82f5420bf388 219 data.password.cstring = auth_token;
DuyLionTran 28:82f5420bf388 220 printf ("AutToken: %s\n\r", auth_token);
DuyLionTran 28:82f5420bf388 221
DuyLionTran 28:82f5420bf388 222 if ((rc = client->connect(data)) != 0) {
DuyLionTran 28:82f5420bf388 223 printf("rc from MQTT connect is %d\r\n", rc);
DuyLionTran 28:82f5420bf388 224 connack_rc = rc;
DuyLionTran 28:82f5420bf388 225 return rc;
DuyLionTran 28:82f5420bf388 226 }
DuyLionTran 28:82f5420bf388 227 connected = true;
DuyLionTran 28:82f5420bf388 228 printf ("--->MQTT Connected\n\r");
DuyLionTran 28:82f5420bf388 229 if ((rc = MQTT_Subscribe(MQTT_COMMAND_TOPIC, client)) == 0) {
DuyLionTran 28:82f5420bf388 230 LOG ("--->>>MQTT subscribed to: %s\n\r", MQTT_COMMAND_TOPIC);
DuyLionTran 28:82f5420bf388 231 } else {
DuyLionTran 28:82f5420bf388 232 LOG ("--->>>ERROR MQTT subscribe : %s\n\r", MQTT_COMMAND_TOPIC);
DuyLionTran 28:82f5420bf388 233 }
DuyLionTran 28:82f5420bf388 234 mqttConnecting = false;
DuyLionTran 28:82f5420bf388 235 connack_rc = rc;
DuyLionTran 28:82f5420bf388 236 return rc;
DuyLionTran 28:82f5420bf388 237 }
DuyLionTran 28:82f5420bf388 238
DuyLionTran 28:82f5420bf388 239
DuyLionTran 28:82f5420bf388 240 int MQTT_GetConnTimeout(int attemptNumber) { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
DuyLionTran 28:82f5420bf388 241 // after 20 attempts, retry every 10 minutes
DuyLionTran 28:82f5420bf388 242 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
DuyLionTran 28:82f5420bf388 243 }
DuyLionTran 28:82f5420bf388 244
DuyLionTran 28:82f5420bf388 245
DuyLionTran 28:82f5420bf388 246 void MQTT_AttemptConnect(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTNetwork *mqttNetwork, NetworkInterface* network) {
DuyLionTran 28:82f5420bf388 247 connected = false;
DuyLionTran 28:82f5420bf388 248
DuyLionTran 28:82f5420bf388 249 while (MQTT_Connect(client, mqttNetwork, network) != MQTT_CONNECTION_ACCEPTED) {
DuyLionTran 28:82f5420bf388 250 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
DuyLionTran 28:82f5420bf388 251 printf ("File: %s, Line: %d Error: %d\n\r",__FILE__,__LINE__, connack_rc);
DuyLionTran 28:82f5420bf388 252 return; // don't reattempt to connect if credentials are wrong
DuyLionTran 28:82f5420bf388 253 }
DuyLionTran 28:82f5420bf388 254 int timeout = MQTT_GetConnTimeout(++retryAttempt);
DuyLionTran 28:82f5420bf388 255 WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
DuyLionTran 28:82f5420bf388 256
DuyLionTran 28:82f5420bf388 257 // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
DuyLionTran 28:82f5420bf388 258 // or maybe just add the proper members to do this disconnect and call MQTT_AttemptConnect(...)
DuyLionTran 28:82f5420bf388 259 // this works - reset the system when the retry count gets to a threshold
DuyLionTran 28:82f5420bf388 260 if (retryAttempt == 5)
DuyLionTran 28:82f5420bf388 261 NVIC_SystemReset();
DuyLionTran 28:82f5420bf388 262 else
DuyLionTran 28:82f5420bf388 263 wait(timeout);
DuyLionTran 28:82f5420bf388 264 }
DuyLionTran 28:82f5420bf388 265 }
DuyLionTran 28:82f5420bf388 266
DuyLionTran 28:82f5420bf388 267 int MQTT_PublishADC(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, time_t inputTime, float adcVal_0) {
DuyLionTran 28:82f5420bf388 268 MQTT::Message message;
DuyLionTran 28:82f5420bf388 269 const char* pubTopic = MQTT_EVENT_TOPIC;
DuyLionTran 28:82f5420bf388 270
DuyLionTran 28:82f5420bf388 271 char buf[MQTT_MAX_PAYLOAD_SIZE];
DuyLionTran 28:82f5420bf388 272 char timeBuf[50];
DuyLionTran 28:82f5420bf388 273
DuyLionTran 28:82f5420bf388 274 if (!client->isConnected()) {
DuyLionTran 28:82f5420bf388 275 printf ("---> MQTT DISCONNECTED\n\r"); return MQTT::FAILURE;
DuyLionTran 28:82f5420bf388 276 }
DuyLionTran 28:82f5420bf388 277
DuyLionTran 28:82f5420bf388 278 strftime(timeBuf, 50, "%Y/%m/%d %H:%M:%S", localtime(&inputTime));
DuyLionTran 28:82f5420bf388 279 // sprintf(buf,
DuyLionTran 28:82f5420bf388 280 // "{\"Project\":\"%s\",\"Time\":\"%s\",\"Type\":1,\"cmdID\":%d,\"ADC0\":%0.2f}",
DuyLionTran 28:82f5420bf388 281 // projectName, timeBuf, commandID, adcVal_0);
DuyLionTran 28:82f5420bf388 282 sprintf(buf, "{\"type\":1,\"deviceId\":\"PROEVN\",\"time\":\"%s\",\"cmdId\":%d,\"adc0\":%0.2f}",
DuyLionTran 28:82f5420bf388 283 timeBuf, commandID, adcVal_0);
DuyLionTran 28:82f5420bf388 284 message.qos = MQTT::QOS0;
DuyLionTran 28:82f5420bf388 285 message.retained = false;
DuyLionTran 28:82f5420bf388 286 message.dup = false;
DuyLionTran 28:82f5420bf388 287 message.payload = (void*)buf;
DuyLionTran 28:82f5420bf388 288 message.payloadlen = strlen(buf);
DuyLionTran 28:82f5420bf388 289
DuyLionTran 28:82f5420bf388 290 if((message.payloadlen + strlen(pubTopic)+1) >= MQTT_MAX_PACKET_SIZE)
DuyLionTran 28:82f5420bf388 291 printf("message too long!\r\n");
DuyLionTran 28:82f5420bf388 292
DuyLionTran 28:82f5420bf388 293 LOG("Publishing %s\n\r", buf);
DuyLionTran 28:82f5420bf388 294 return client->publish(pubTopic, message);
DuyLionTran 28:82f5420bf388 295 }
DuyLionTran 28:82f5420bf388 296
DuyLionTran 28:82f5420bf388 297 int MQTT_PublishRelayState(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, time_t inputTime, int relay1, int relay2) {
DuyLionTran 28:82f5420bf388 298 MQTT::Message message;
DuyLionTran 28:82f5420bf388 299 const char* pubTopic = MQTT_EVENT_TOPIC;
DuyLionTran 28:82f5420bf388 300 char buf[MQTT_MAX_PAYLOAD_SIZE];
DuyLionTran 28:82f5420bf388 301 char timeBuf[50];
DuyLionTran 28:82f5420bf388 302
DuyLionTran 28:82f5420bf388 303 if (!client->isConnected()) {
DuyLionTran 28:82f5420bf388 304 printf ("---> MQTT DISCONNECTED\n\r");
DuyLionTran 28:82f5420bf388 305 return MQTT::FAILURE;
DuyLionTran 28:82f5420bf388 306 }
DuyLionTran 28:82f5420bf388 307 strftime(timeBuf, 50, "%Y/%m/%d %H:%M:%S", localtime(&inputTime));
DuyLionTran 28:82f5420bf388 308 sprintf(buf, "{\"type\":3,\"deviceId\":\"PROEVN\",\"time\":\"%s\",\"cmdId\":%d,\"relay1\":%d,\"relay2\":%d}",
DuyLionTran 28:82f5420bf388 309 timeBuf, commandID, relay1, relay2);
DuyLionTran 28:82f5420bf388 310 message.qos = MQTT::QOS0;
DuyLionTran 28:82f5420bf388 311 message.retained = false;
DuyLionTran 28:82f5420bf388 312 message.dup = false;
DuyLionTran 28:82f5420bf388 313 message.payload = (void*)buf;
DuyLionTran 28:82f5420bf388 314 message.payloadlen = strlen(buf);
DuyLionTran 28:82f5420bf388 315
DuyLionTran 28:82f5420bf388 316 if((message.payloadlen + strlen(pubTopic)+1) >= MQTT_MAX_PACKET_SIZE)
DuyLionTran 28:82f5420bf388 317 printf("message too long!\r\n");
DuyLionTran 28:82f5420bf388 318
DuyLionTran 28:82f5420bf388 319 LOG("Publishing %s\n\r", buf);
DuyLionTran 28:82f5420bf388 320 return client->publish(pubTopic, message);
DuyLionTran 28:82f5420bf388 321 }
DuyLionTran 28:82f5420bf388 322
DuyLionTran 28:82f5420bf388 323 int MQTT_PublishConfigValue(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, time_t inputTime, uint8_t mode, uint8_t minOxi, uint8_t maxOxi) {
DuyLionTran 28:82f5420bf388 324 MQTT::Message message;
DuyLionTran 28:82f5420bf388 325 const char* pubTopic = MQTT_EVENT_TOPIC;
DuyLionTran 28:82f5420bf388 326 char buf[MQTT_MAX_PAYLOAD_SIZE];
DuyLionTran 28:82f5420bf388 327 char timeBuf[50];
DuyLionTran 28:82f5420bf388 328
DuyLionTran 28:82f5420bf388 329 if (!client->isConnected()) {
DuyLionTran 28:82f5420bf388 330 printf ("---> MQTT DISCONNECTED\n\r");
DuyLionTran 28:82f5420bf388 331 return MQTT::FAILURE;
DuyLionTran 28:82f5420bf388 332 }
DuyLionTran 28:82f5420bf388 333 strftime(timeBuf, 50, "%Y/%m/%d %H:%M:%S", localtime(&inputTime));
DuyLionTran 28:82f5420bf388 334 sprintf(buf, "{\"type\":4,\"deviceId\":\"PROEVN\",\"time\":\"%s\",\"cmdId\":%d,\"mode\":%d,\"minOxygenVal\":%d,\"maxOxygenVal\":%d}",
DuyLionTran 28:82f5420bf388 335 timeBuf, commandID, mode, minOxi, maxOxi);
DuyLionTran 28:82f5420bf388 336 message.qos = MQTT::QOS0;
DuyLionTran 28:82f5420bf388 337 message.retained = false;
DuyLionTran 28:82f5420bf388 338 message.dup = false;
DuyLionTran 28:82f5420bf388 339 message.payload = (void*)buf;
DuyLionTran 28:82f5420bf388 340 message.payloadlen = strlen(buf);
DuyLionTran 28:82f5420bf388 341
DuyLionTran 28:82f5420bf388 342 if((message.payloadlen + strlen(pubTopic)+1) >= MQTT_MAX_PACKET_SIZE)
DuyLionTran 28:82f5420bf388 343 printf("message too long!\r\n");
DuyLionTran 28:82f5420bf388 344
DuyLionTran 28:82f5420bf388 345 LOG("Publishing %s\n\r", buf);
DuyLionTran 28:82f5420bf388 346 return client->publish(pubTopic, message);
DuyLionTran 28:82f5420bf388 347 }
DuyLionTran 28:82f5420bf388 348
DuyLionTran 28:82f5420bf388 349 int MQTT_PublishAll(MQTT::Client<MQTTNetwork, Countdown, MQTT_MAX_PACKET_SIZE>* client, time_t inputTime, uint8_t uploadType, struct UploadValue uploadStruct) {
DuyLionTran 28:82f5420bf388 350 int retVal;
DuyLionTran 28:82f5420bf388 351 switch (uploadType) {
DuyLionTran 28:82f5420bf388 352 case (ADC_VALUE): retVal = MQTT_PublishADC(client, inputTime, uploadStruct.ADC_PHVal);
DuyLionTran 28:82f5420bf388 353 break;
DuyLionTran 28:82f5420bf388 354 case (SENSOR_VALUE): retVal = MQTT::SUCCESS;
DuyLionTran 28:82f5420bf388 355 break;
DuyLionTran 28:82f5420bf388 356 case (RELAY_STATE): retVal = MQTT_PublishRelayState(client, inputTime, uploadStruct.RELAY_State_1, uploadStruct.RELAY_State_2);
DuyLionTran 28:82f5420bf388 357 break;
DuyLionTran 28:82f5420bf388 358 case (CONFIG_VALUE): retVal = MQTT_PublishConfigValue(client, inputTime, uploadStruct.CONFIG_Mode, uploadStruct.CONFIG_MinOxi, uploadStruct.CONFIG_MaxOxi);
DuyLionTran 28:82f5420bf388 359 break;
DuyLionTran 28:82f5420bf388 360 default: break;
DuyLionTran 28:82f5420bf388 361 }
DuyLionTran 28:82f5420bf388 362 return retVal;
DuyLionTran 28:82f5420bf388 363 }
DuyLionTran 28:82f5420bf388 364
DuyLionTran 28:82f5420bf388 365 #endif /* __SIMPLEMQTT_H__ */