iot_water_monitor_v2

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

Committer:
DuyLionTran
Date:
Mon Jan 08 18:07:56 2018 +0000
Revision:
32:8226837c56ae
Parent:
31:0f7ea3981668
Child:
33:5b90257d2d57
version 2.1;

Who changed what in which revision?

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