watersensor and tmp

Dependencies:   DS1820 MQTT NetworkSocketAPI X_NUCLEO_IDW01M1v2 mbed

Fork of IDW01M1-MQTT by CHANG rozen

Committer:
e58136782000
Date:
Wed Nov 01 07:58:02 2017 +0000
Revision:
3:0511bd22e20f
Parent:
2:d2fb91dc221e
watersensor and tmp

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rozendhyan@gmail.com 0:80c7778c82b8 1 #include "mbed.h"
e58136782000 2:d2fb91dc221e 2 #include "DS1820.h"
rozendhyan@gmail.com 0:80c7778c82b8 3 #include "SpwfInterface.h"
rozendhyan@gmail.com 0:80c7778c82b8 4 #include "TCPSocket.h"
rozendhyan@gmail.com 0:80c7778c82b8 5 #include "MQTTClient.h"
rozendhyan@gmail.com 0:80c7778c82b8 6 #include "MQTTWiFi.h"
rozendhyan@gmail.com 0:80c7778c82b8 7
rozendhyan@gmail.com 0:80c7778c82b8 8 // MQTT use
rozendhyan@gmail.com 0:80c7778c82b8 9 #define MQTT_MAX_PACKET_SIZE 250
rozendhyan@gmail.com 0:80c7778c82b8 10 #define MQTT_MAX_PAYLOAD_SIZE 300
rozendhyan@gmail.com 0:80c7778c82b8 11 //Configuration value needed to connect Red-node
e58136782000 2:d2fb91dc221e 12 #define BROKER_URL "192.168.20.116";
rozendhyan@gmail.com 0:80c7778c82b8 13 #define MQTT_PORT 1883
rozendhyan@gmail.com 0:80c7778c82b8 14 //MQTT use Topic
e58136782000 2:d2fb91dc221e 15 #define TOPIC0 "1"
e58136782000 2:d2fb91dc221e 16 #define TOPIC1 "3"
rozendhyan@gmail.com 1:2ee9e5685a1e 17 #define SUB_TOPIC "LED"
rozendhyan@gmail.com 0:80c7778c82b8 18
rozendhyan@gmail.com 0:80c7778c82b8 19
rozendhyan@gmail.com 0:80c7778c82b8 20 //Wifi network
e58136782000 2:d2fb91dc221e 21 #define SSID "tnta"
e58136782000 2:d2fb91dc221e 22 #define PASSW "tnta2355818"
rozendhyan@gmail.com 0:80c7778c82b8 23
e58136782000 2:d2fb91dc221e 24 Serial serial(USBTX, USBRX);
rozendhyan@gmail.com 0:80c7778c82b8 25 DigitalOut myled(LED1);
e58136782000 2:d2fb91dc221e 26 DS1820 ds1820(PA_9);
e58136782000 2:d2fb91dc221e 27 DigitalIn sensor_in(D4);
rozendhyan@gmail.com 0:80c7778c82b8 28
rozendhyan@gmail.com 0:80c7778c82b8 29 int connack_rc = 0; // MQTT connack return code
rozendhyan@gmail.com 0:80c7778c82b8 30 const char * ip_addr = "";
rozendhyan@gmail.com 0:80c7778c82b8 31 char *host_addr = "";
rozendhyan@gmail.com 0:80c7778c82b8 32 bool netConnecting = false;
rozendhyan@gmail.com 0:80c7778c82b8 33 int connectTimeout = 1000;
rozendhyan@gmail.com 0:80c7778c82b8 34 bool mqttConnecting = false;
rozendhyan@gmail.com 0:80c7778c82b8 35 bool netConnected = false;
rozendhyan@gmail.com 0:80c7778c82b8 36 bool connected = false;
rozendhyan@gmail.com 0:80c7778c82b8 37 int retryAttempt = 0;
rozendhyan@gmail.com 0:80c7778c82b8 38 char subscription_url[MQTT_MAX_PAYLOAD_SIZE];
rozendhyan@gmail.com 0:80c7778c82b8 39
rozendhyan@gmail.com 0:80c7778c82b8 40 MQTT::Message message;
e58136782000 2:d2fb91dc221e 41 MQTTString TopicName1 = {TOPIC0};
e58136782000 2:d2fb91dc221e 42 MQTTString TopicName2 = {TOPIC1};
e58136782000 2:d2fb91dc221e 43 MQTT::MessageData MsgData1(TopicName1, message);
e58136782000 2:d2fb91dc221e 44 MQTT::MessageData MsgData2(TopicName2, message);
rozendhyan@gmail.com 0:80c7778c82b8 45
rozendhyan@gmail.com 1:2ee9e5685a1e 46 void subscribe_LED(char* msg){
rozendhyan@gmail.com 1:2ee9e5685a1e 47 int value = atoi(msg);
rozendhyan@gmail.com 1:2ee9e5685a1e 48 //printf("value = %d\n", value);
rozendhyan@gmail.com 1:2ee9e5685a1e 49 if(value ==1){
rozendhyan@gmail.com 1:2ee9e5685a1e 50 myled = !myled;
rozendhyan@gmail.com 1:2ee9e5685a1e 51 }
rozendhyan@gmail.com 1:2ee9e5685a1e 52
rozendhyan@gmail.com 1:2ee9e5685a1e 53 }
rozendhyan@gmail.com 1:2ee9e5685a1e 54
rozendhyan@gmail.com 0:80c7778c82b8 55
rozendhyan@gmail.com 0:80c7778c82b8 56 void subscribe_cb(MQTT::MessageData & msgMQTT) {
rozendhyan@gmail.com 0:80c7778c82b8 57 char msg[MQTT_MAX_PAYLOAD_SIZE];
rozendhyan@gmail.com 0:80c7778c82b8 58 msg[0]='\0';
rozendhyan@gmail.com 0:80c7778c82b8 59 strncat (msg, (char*)msgMQTT.message.payload, msgMQTT.message.payloadlen);
rozendhyan@gmail.com 0:80c7778c82b8 60 printf ("--->>> subscribe_cb msg: %s\n\r", msg);
rozendhyan@gmail.com 1:2ee9e5685a1e 61 subscribe_LED(msg);
rozendhyan@gmail.com 0:80c7778c82b8 62 }
rozendhyan@gmail.com 0:80c7778c82b8 63 int subscribe(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
rozendhyan@gmail.com 0:80c7778c82b8 64 {
rozendhyan@gmail.com 1:2ee9e5685a1e 65 char* pubTopic = SUB_TOPIC;
rozendhyan@gmail.com 0:80c7778c82b8 66 return client->subscribe(pubTopic, MQTT::QOS1, subscribe_cb);
rozendhyan@gmail.com 0:80c7778c82b8 67 }
rozendhyan@gmail.com 0:80c7778c82b8 68
rozendhyan@gmail.com 0:80c7778c82b8 69
rozendhyan@gmail.com 0:80c7778c82b8 70 int connect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client,MQTTWiFi* ipstack){
rozendhyan@gmail.com 0:80c7778c82b8 71 const char* host = BROKER_URL;
rozendhyan@gmail.com 0:80c7778c82b8 72
rozendhyan@gmail.com 0:80c7778c82b8 73 char hostname[strlen(host) + 1];
rozendhyan@gmail.com 0:80c7778c82b8 74 sprintf(hostname,"%s", host);
rozendhyan@gmail.com 0:80c7778c82b8 75
rozendhyan@gmail.com 0:80c7778c82b8 76 SpwfSAInterface& WiFi = ipstack->getWiFi();
rozendhyan@gmail.com 0:80c7778c82b8 77
rozendhyan@gmail.com 0:80c7778c82b8 78 //Network Debug statements
rozendhyan@gmail.com 0:80c7778c82b8 79 LOG("=====================================\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 80 LOG("Connecting WiFi.\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 81 LOG("Nucleo IP ADDRESS: %s\n\r", WiFi.get_ip_address());
rozendhyan@gmail.com 0:80c7778c82b8 82 LOG("Nucleo MAC ADDRESS: %s\n\r", WiFi.get_mac_address());
rozendhyan@gmail.com 0:80c7778c82b8 83 LOG("Server Hostname: %s port: %d\n\r", hostname, MQTT_PORT);
e58136782000 2:d2fb91dc221e 84 LOG("Topic: %s\n\r", TOPIC0);
e58136782000 2:d2fb91dc221e 85 LOG("Topic: %s\n\r", TOPIC1);
rozendhyan@gmail.com 0:80c7778c82b8 86 //need subscrie
rozendhyan@gmail.com 0:80c7778c82b8 87 LOG("=====================================\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 88 netConnecting = true;
rozendhyan@gmail.com 0:80c7778c82b8 89 ipstack->open(&ipstack->getWiFi());
rozendhyan@gmail.com 0:80c7778c82b8 90 int rc = ipstack->connect(hostname,MQTT_PORT,connectTimeout);
rozendhyan@gmail.com 0:80c7778c82b8 91 if (rc != 0)
rozendhyan@gmail.com 0:80c7778c82b8 92 {
rozendhyan@gmail.com 0:80c7778c82b8 93 WARN("IP Stack connect returned: %d\n", rc);
rozendhyan@gmail.com 0:80c7778c82b8 94 return rc;
rozendhyan@gmail.com 0:80c7778c82b8 95 }
rozendhyan@gmail.com 0:80c7778c82b8 96 printf ("--->TCP Connected\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 97 netConnected = true;
rozendhyan@gmail.com 0:80c7778c82b8 98 netConnecting = false;
rozendhyan@gmail.com 0:80c7778c82b8 99
rozendhyan@gmail.com 0:80c7778c82b8 100 //MQTT Connect
rozendhyan@gmail.com 0:80c7778c82b8 101 mqttConnecting = true;
rozendhyan@gmail.com 0:80c7778c82b8 102 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
rozendhyan@gmail.com 0:80c7778c82b8 103 data.MQTTVersion = 4;
rozendhyan@gmail.com 0:80c7778c82b8 104 data.struct_version =0;
rozendhyan@gmail.com 0:80c7778c82b8 105
rozendhyan@gmail.com 0:80c7778c82b8 106 if((rc = client->connect(data)) == 0){
rozendhyan@gmail.com 0:80c7778c82b8 107 connected = true;
rozendhyan@gmail.com 0:80c7778c82b8 108 printf("--->MQTT Connected\n\r");
rozendhyan@gmail.com 1:2ee9e5685a1e 109 //#ifdef SUBSCRIBE
rozendhyan@gmail.com 1:2ee9e5685a1e 110 if (!subscribe(client, ipstack)) printf ("--->>>MQTT subscribed to: %s\n\r",SUB_TOPIC);
rozendhyan@gmail.com 1:2ee9e5685a1e 111 //#endif
rozendhyan@gmail.com 0:80c7778c82b8 112 }else {
rozendhyan@gmail.com 0:80c7778c82b8 113 WARN("MQTT connect returned %d\n", rc);
rozendhyan@gmail.com 0:80c7778c82b8 114 }
rozendhyan@gmail.com 0:80c7778c82b8 115 if (rc >= 0)
rozendhyan@gmail.com 0:80c7778c82b8 116 connack_rc = rc;
rozendhyan@gmail.com 0:80c7778c82b8 117 mqttConnecting = false;
rozendhyan@gmail.com 0:80c7778c82b8 118 return rc;
rozendhyan@gmail.com 0:80c7778c82b8 119
rozendhyan@gmail.com 0:80c7778c82b8 120 }
rozendhyan@gmail.com 0:80c7778c82b8 121 int getConnTimeout(int attemptNumber)
rozendhyan@gmail.com 0:80c7778c82b8 122 { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
rozendhyan@gmail.com 0:80c7778c82b8 123 // after 20 attempts, retry every 10 minutes
rozendhyan@gmail.com 0:80c7778c82b8 124 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
rozendhyan@gmail.com 0:80c7778c82b8 125 }
rozendhyan@gmail.com 0:80c7778c82b8 126 void attemptConnect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
rozendhyan@gmail.com 0:80c7778c82b8 127 {
rozendhyan@gmail.com 0:80c7778c82b8 128 connected = false;
rozendhyan@gmail.com 0:80c7778c82b8 129
rozendhyan@gmail.com 0:80c7778c82b8 130 while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED)
rozendhyan@gmail.com 0:80c7778c82b8 131 {
rozendhyan@gmail.com 0:80c7778c82b8 132 /*if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
rozendhyan@gmail.com 0:80c7778c82b8 133 printf ("File: %s, Line: %d Error: %d\n\r",__FILE__,__LINE__, connack_rc);
rozendhyan@gmail.com 0:80c7778c82b8 134 return; // don't reattempt to connect if credentials are wrong
rozendhyan@gmail.com 0:80c7778c82b8 135 } */
rozendhyan@gmail.com 0:80c7778c82b8 136 int timeout = getConnTimeout(++retryAttempt);
rozendhyan@gmail.com 0:80c7778c82b8 137 WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
rozendhyan@gmail.com 0:80c7778c82b8 138
rozendhyan@gmail.com 0:80c7778c82b8 139 // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
rozendhyan@gmail.com 0:80c7778c82b8 140 // or maybe just add the proper members to do this disconnect and call attemptConnect(...)
rozendhyan@gmail.com 0:80c7778c82b8 141 // this works - reset the system when the retry count gets to a threshold
rozendhyan@gmail.com 0:80c7778c82b8 142 if (retryAttempt == 5)
rozendhyan@gmail.com 0:80c7778c82b8 143 NVIC_SystemReset();
rozendhyan@gmail.com 0:80c7778c82b8 144 else
rozendhyan@gmail.com 0:80c7778c82b8 145 wait(timeout);
rozendhyan@gmail.com 0:80c7778c82b8 146 }
rozendhyan@gmail.com 0:80c7778c82b8 147 }
e58136782000 2:d2fb91dc221e 148 int publish0 (MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client,MQTTWiFi* ipstack){
e58136782000 3:0511bd22e20f 149 if(ds1820.begin())
e58136782000 3:0511bd22e20f 150 {
e58136782000 3:0511bd22e20f 151 ds1820.startConversion(); // start temperature conversion
e58136782000 3:0511bd22e20f 152 wait(1.0); // let DS1820 complete the temperature conversion
e58136782000 3:0511bd22e20f 153 ds1820.startConversion(); // start temperature conversion
e58136782000 3:0511bd22e20f 154 wait(1.0); // let DS1820 complete the temperature conversion
e58136782000 3:0511bd22e20f 155 }
e58136782000 3:0511bd22e20f 156 else
e58136782000 3:0511bd22e20f 157 {
e58136782000 3:0511bd22e20f 158 serial.printf("No DS1820 sensor found!\r\n");
e58136782000 3:0511bd22e20f 159 }
rozendhyan@gmail.com 0:80c7778c82b8 160 MQTT::Message message;
e58136782000 2:d2fb91dc221e 161 char *pubTopic = TOPIC0;
e58136782000 2:d2fb91dc221e 162 char buf[MQTT_MAX_PAYLOAD_SIZE];
e58136782000 3:0511bd22e20f 163 int buffervalue;
e58136782000 3:0511bd22e20f 164 buffervalue = ds1820.read();
e58136782000 3:0511bd22e20f 165 serial.printf("Temp = %d\n",buffervalue);
e58136782000 3:0511bd22e20f 166 sprintf(buf,"%d",buffervalue);
e58136782000 2:d2fb91dc221e 167 message.qos = MQTT::QOS0;
e58136782000 2:d2fb91dc221e 168 message.retained = false;
e58136782000 2:d2fb91dc221e 169 message.dup = false;
e58136782000 2:d2fb91dc221e 170 message.payload = (void*)buf;
e58136782000 2:d2fb91dc221e 171 message.payloadlen = strlen(buf);
e58136782000 2:d2fb91dc221e 172 printf("Publishing %s\n\r", buf);
e58136782000 2:d2fb91dc221e 173 return client->publish(pubTopic, message);
e58136782000 2:d2fb91dc221e 174 }
e58136782000 2:d2fb91dc221e 175
e58136782000 2:d2fb91dc221e 176 int publish1 (MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client,MQTTWiFi* ipstack)
e58136782000 2:d2fb91dc221e 177 {
e58136782000 2:d2fb91dc221e 178 MQTT::Message message;
e58136782000 2:d2fb91dc221e 179 char *pubTopic = TOPIC1;
rozendhyan@gmail.com 0:80c7778c82b8 180 char buf[MQTT_MAX_PAYLOAD_SIZE];
e58136782000 3:0511bd22e20f 181 int buffervalue = sensor_in;
e58136782000 3:0511bd22e20f 182 serial.printf("Watersensor = %d\n", buffervalue);
e58136782000 3:0511bd22e20f 183 sprintf(buf,"%d",buffervalue);
rozendhyan@gmail.com 0:80c7778c82b8 184 message.qos = MQTT::QOS0;
rozendhyan@gmail.com 0:80c7778c82b8 185 message.retained = false;
rozendhyan@gmail.com 0:80c7778c82b8 186 message.dup = false;
rozendhyan@gmail.com 0:80c7778c82b8 187 message.payload = (void*)buf;
rozendhyan@gmail.com 0:80c7778c82b8 188 message.payloadlen = strlen(buf);
rozendhyan@gmail.com 0:80c7778c82b8 189
rozendhyan@gmail.com 0:80c7778c82b8 190 printf("Publishing %s\n\r", buf);
rozendhyan@gmail.com 0:80c7778c82b8 191 return client->publish(pubTopic, message);
rozendhyan@gmail.com 0:80c7778c82b8 192 }
rozendhyan@gmail.com 0:80c7778c82b8 193
rozendhyan@gmail.com 0:80c7778c82b8 194 int main(int argc, char const *argv[])
rozendhyan@gmail.com 0:80c7778c82b8 195 {
e58136782000 3:0511bd22e20f 196 DS1820 ds1820(PA_9);
rozendhyan@gmail.com 0:80c7778c82b8 197 myled =0;
rozendhyan@gmail.com 0:80c7778c82b8 198 /* code */
rozendhyan@gmail.com 0:80c7778c82b8 199 const char *ssid = SSID;
rozendhyan@gmail.com 0:80c7778c82b8 200 const char *seckey = PASSW;
rozendhyan@gmail.com 0:80c7778c82b8 201 //use SpwfSAInterface connect AP
rozendhyan@gmail.com 0:80c7778c82b8 202 SpwfSAInterface spwf(D8,D2, false);
rozendhyan@gmail.com 0:80c7778c82b8 203
e58136782000 2:d2fb91dc221e 204 serial.printf("\r\nX-NUCLEO-IDW01M1 mbed \n");
e58136782000 2:d2fb91dc221e 205 serial.printf("\r\nconnecting to AP\n");
rozendhyan@gmail.com 0:80c7778c82b8 206 //connect to Wifi
rozendhyan@gmail.com 0:80c7778c82b8 207 MQTTWiFi ipstack(spwf, ssid, seckey, NSAPI_SECURITY_WPA2);
rozendhyan@gmail.com 0:80c7778c82b8 208 //check wifi has got ip_address
e58136782000 2:d2fb91dc221e 209 serial.printf(ipstack.getWiFi().get_ip_address());
rozendhyan@gmail.com 0:80c7778c82b8 210 if(ipstack.getWiFi().get_ip_address() == 0){
rozendhyan@gmail.com 0:80c7778c82b8 211 printf("Connect WiFi is failed!\nPlease check your ssid and passwd is correct");
rozendhyan@gmail.com 0:80c7778c82b8 212 return 0;
rozendhyan@gmail.com 0:80c7778c82b8 213 }
rozendhyan@gmail.com 0:80c7778c82b8 214 printf("ip: %s\n",ipstack.getWiFi().get_ip_address() );
rozendhyan@gmail.com 0:80c7778c82b8 215
rozendhyan@gmail.com 0:80c7778c82b8 216 MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
rozendhyan@gmail.com 0:80c7778c82b8 217 attemptConnect(&client, &ipstack);
rozendhyan@gmail.com 0:80c7778c82b8 218
rozendhyan@gmail.com 1:2ee9e5685a1e 219
rozendhyan@gmail.com 0:80c7778c82b8 220 int count = 0;
rozendhyan@gmail.com 0:80c7778c82b8 221 // tyeld.start();
rozendhyan@gmail.com 0:80c7778c82b8 222 while (true)
rozendhyan@gmail.com 0:80c7778c82b8 223 {
rozendhyan@gmail.com 0:80c7778c82b8 224 if (++count == 100)
e58136782000 2:d2fb91dc221e 225 { // Publish a message every second
e58136782000 2:d2fb91dc221e 226 if (publish0(&client, &ipstack) != 0)
e58136782000 2:d2fb91dc221e 227 {
e58136782000 2:d2fb91dc221e 228 attemptConnect(&client, &ipstack); // if we have lost the connection
e58136782000 2:d2fb91dc221e 229 }
e58136782000 2:d2fb91dc221e 230 if (publish1(&client, &ipstack) != 0)
e58136782000 2:d2fb91dc221e 231 {
rozendhyan@gmail.com 0:80c7778c82b8 232 attemptConnect(&client, &ipstack); // if we have lost the connection
rozendhyan@gmail.com 1:2ee9e5685a1e 233 }
rozendhyan@gmail.com 0:80c7778c82b8 234 count = 0;
e58136782000 2:d2fb91dc221e 235 wait(5);
e58136782000 3:0511bd22e20f 236 }
e58136782000 3:0511bd22e20f 237
rozendhyan@gmail.com 0:80c7778c82b8 238 // int start = tyeld.read_ms();
rozendhyan@gmail.com 0:80c7778c82b8 239 client.yield(10); // allow the MQTT client to receive messages
rozendhyan@gmail.com 0:80c7778c82b8 240 // printf ("tyeld: %d\n\r",tyeld.read_ms()-start);
rozendhyan@gmail.com 0:80c7778c82b8 241
rozendhyan@gmail.com 0:80c7778c82b8 242 }
rozendhyan@gmail.com 0:80c7778c82b8 243
rozendhyan@gmail.com 0:80c7778c82b8 244 }