iot_water_monitor_v2

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

Committer:
Duy Tran@DESKTOP-0RPIPEQ
Date:
Mon Jan 08 22:09:56 2018 +0700
Revision:
31:0f7ea3981668
Parent:
30:e49b8e99db65
Child:
32:8226837c56ae
version 2.0: add command execution

Who changed what in which revision?

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