watersensor and temp

Dependencies:   MQTT NetworkSocketAPI X_NUCLEO_IDW01M1v2 mbed watersenor_and_temp_code

Fork of IDW01M1-MQTT by CHANG rozen

Committer:
rozendhyan@gmail.com
Date:
Tue Oct 31 18:41:30 2017 +0800
Revision:
0:80c7778c82b8
Child:
1:2ee9e5685a1e
My commit message

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rozendhyan@gmail.com 0:80c7778c82b8 1 #include "mbed.h"
rozendhyan@gmail.com 0:80c7778c82b8 2 #include "BME280.hpp"
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
rozendhyan@gmail.com 0:80c7778c82b8 12 #define BROKER_URL "192.168.0.10";
rozendhyan@gmail.com 0:80c7778c82b8 13 #define MQTT_PORT 1883
rozendhyan@gmail.com 0:80c7778c82b8 14 //MQTT use Topic
rozendhyan@gmail.com 0:80c7778c82b8 15 #define TOPIC "temp"
rozendhyan@gmail.com 0:80c7778c82b8 16
rozendhyan@gmail.com 0:80c7778c82b8 17
rozendhyan@gmail.com 0:80c7778c82b8 18 //Wifi network
rozendhyan@gmail.com 0:80c7778c82b8 19 #define SSID "megu megu fire"
rozendhyan@gmail.com 0:80c7778c82b8 20 #define PASSW "66666667"
rozendhyan@gmail.com 0:80c7778c82b8 21
rozendhyan@gmail.com 0:80c7778c82b8 22 DigitalOut myled(LED1);
rozendhyan@gmail.com 0:80c7778c82b8 23 BME280 bmpSensor;
rozendhyan@gmail.com 0:80c7778c82b8 24
rozendhyan@gmail.com 0:80c7778c82b8 25 int connack_rc = 0; // MQTT connack return code
rozendhyan@gmail.com 0:80c7778c82b8 26 const char * ip_addr = "";
rozendhyan@gmail.com 0:80c7778c82b8 27 char *host_addr = "";
rozendhyan@gmail.com 0:80c7778c82b8 28 bool netConnecting = false;
rozendhyan@gmail.com 0:80c7778c82b8 29 int connectTimeout = 1000;
rozendhyan@gmail.com 0:80c7778c82b8 30 bool mqttConnecting = false;
rozendhyan@gmail.com 0:80c7778c82b8 31 bool netConnected = false;
rozendhyan@gmail.com 0:80c7778c82b8 32 bool connected = false;
rozendhyan@gmail.com 0:80c7778c82b8 33 int retryAttempt = 0;
rozendhyan@gmail.com 0:80c7778c82b8 34 char subscription_url[MQTT_MAX_PAYLOAD_SIZE];
rozendhyan@gmail.com 0:80c7778c82b8 35
rozendhyan@gmail.com 0:80c7778c82b8 36 MQTT::Message message;
rozendhyan@gmail.com 0:80c7778c82b8 37 MQTTString TopicName={TOPIC};
rozendhyan@gmail.com 0:80c7778c82b8 38 MQTT::MessageData MsgData(TopicName, message);
rozendhyan@gmail.com 0:80c7778c82b8 39
rozendhyan@gmail.com 0:80c7778c82b8 40
rozendhyan@gmail.com 0:80c7778c82b8 41 void subscribe_cb(MQTT::MessageData & msgMQTT) {
rozendhyan@gmail.com 0:80c7778c82b8 42 char msg[MQTT_MAX_PAYLOAD_SIZE];
rozendhyan@gmail.com 0:80c7778c82b8 43 msg[0]='\0';
rozendhyan@gmail.com 0:80c7778c82b8 44 strncat (msg, (char*)msgMQTT.message.payload, msgMQTT.message.payloadlen);
rozendhyan@gmail.com 0:80c7778c82b8 45 printf ("--->>> subscribe_cb msg: %s\n\r", msg);
rozendhyan@gmail.com 0:80c7778c82b8 46 }
rozendhyan@gmail.com 0:80c7778c82b8 47 int subscribe(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
rozendhyan@gmail.com 0:80c7778c82b8 48 {
rozendhyan@gmail.com 0:80c7778c82b8 49 char* pubTopic = TOPIC;
rozendhyan@gmail.com 0:80c7778c82b8 50 return client->subscribe(pubTopic, MQTT::QOS1, subscribe_cb);
rozendhyan@gmail.com 0:80c7778c82b8 51 }
rozendhyan@gmail.com 0:80c7778c82b8 52
rozendhyan@gmail.com 0:80c7778c82b8 53
rozendhyan@gmail.com 0:80c7778c82b8 54 int connect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client,MQTTWiFi* ipstack){
rozendhyan@gmail.com 0:80c7778c82b8 55 const char* host = BROKER_URL;
rozendhyan@gmail.com 0:80c7778c82b8 56
rozendhyan@gmail.com 0:80c7778c82b8 57 char hostname[strlen(host) + 1];
rozendhyan@gmail.com 0:80c7778c82b8 58 sprintf(hostname,"%s", host);
rozendhyan@gmail.com 0:80c7778c82b8 59
rozendhyan@gmail.com 0:80c7778c82b8 60 SpwfSAInterface& WiFi = ipstack->getWiFi();
rozendhyan@gmail.com 0:80c7778c82b8 61
rozendhyan@gmail.com 0:80c7778c82b8 62 //Network Debug statements
rozendhyan@gmail.com 0:80c7778c82b8 63 LOG("=====================================\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 64 LOG("Connecting WiFi.\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 65 LOG("Nucleo IP ADDRESS: %s\n\r", WiFi.get_ip_address());
rozendhyan@gmail.com 0:80c7778c82b8 66 LOG("Nucleo MAC ADDRESS: %s\n\r", WiFi.get_mac_address());
rozendhyan@gmail.com 0:80c7778c82b8 67 LOG("Server Hostname: %s port: %d\n\r", hostname, MQTT_PORT);
rozendhyan@gmail.com 0:80c7778c82b8 68 LOG("Topic: %s\n\r", TOPIC);
rozendhyan@gmail.com 0:80c7778c82b8 69 //need subscrie
rozendhyan@gmail.com 0:80c7778c82b8 70 LOG("=====================================\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 71 netConnecting = true;
rozendhyan@gmail.com 0:80c7778c82b8 72 ipstack->open(&ipstack->getWiFi());
rozendhyan@gmail.com 0:80c7778c82b8 73 int rc = ipstack->connect(hostname,MQTT_PORT,connectTimeout);
rozendhyan@gmail.com 0:80c7778c82b8 74 if (rc != 0)
rozendhyan@gmail.com 0:80c7778c82b8 75 {
rozendhyan@gmail.com 0:80c7778c82b8 76 WARN("IP Stack connect returned: %d\n", rc);
rozendhyan@gmail.com 0:80c7778c82b8 77 return rc;
rozendhyan@gmail.com 0:80c7778c82b8 78 }
rozendhyan@gmail.com 0:80c7778c82b8 79 printf ("--->TCP Connected\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 80 netConnected = true;
rozendhyan@gmail.com 0:80c7778c82b8 81 netConnecting = false;
rozendhyan@gmail.com 0:80c7778c82b8 82
rozendhyan@gmail.com 0:80c7778c82b8 83 //MQTT Connect
rozendhyan@gmail.com 0:80c7778c82b8 84 mqttConnecting = true;
rozendhyan@gmail.com 0:80c7778c82b8 85 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
rozendhyan@gmail.com 0:80c7778c82b8 86 data.MQTTVersion = 4;
rozendhyan@gmail.com 0:80c7778c82b8 87 data.struct_version =0;
rozendhyan@gmail.com 0:80c7778c82b8 88
rozendhyan@gmail.com 0:80c7778c82b8 89 if((rc = client->connect(data)) == 0){
rozendhyan@gmail.com 0:80c7778c82b8 90 connected = true;
rozendhyan@gmail.com 0:80c7778c82b8 91 printf("--->MQTT Connected\n\r");
rozendhyan@gmail.com 0:80c7778c82b8 92 #ifdef SUBSCRIBE
rozendhyan@gmail.com 0:80c7778c82b8 93 if (!subscribe(client, ipstack)) printf ("--->>>MQTT subscribed to: %s\n\r",TOPIC);
rozendhyan@gmail.com 0:80c7778c82b8 94 #endif
rozendhyan@gmail.com 0:80c7778c82b8 95 }else {
rozendhyan@gmail.com 0:80c7778c82b8 96 WARN("MQTT connect returned %d\n", rc);
rozendhyan@gmail.com 0:80c7778c82b8 97 }
rozendhyan@gmail.com 0:80c7778c82b8 98 if (rc >= 0)
rozendhyan@gmail.com 0:80c7778c82b8 99 connack_rc = rc;
rozendhyan@gmail.com 0:80c7778c82b8 100 mqttConnecting = false;
rozendhyan@gmail.com 0:80c7778c82b8 101 return rc;
rozendhyan@gmail.com 0:80c7778c82b8 102
rozendhyan@gmail.com 0:80c7778c82b8 103 }
rozendhyan@gmail.com 0:80c7778c82b8 104 int getConnTimeout(int attemptNumber)
rozendhyan@gmail.com 0:80c7778c82b8 105 { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
rozendhyan@gmail.com 0:80c7778c82b8 106 // after 20 attempts, retry every 10 minutes
rozendhyan@gmail.com 0:80c7778c82b8 107 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
rozendhyan@gmail.com 0:80c7778c82b8 108 }
rozendhyan@gmail.com 0:80c7778c82b8 109 void attemptConnect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
rozendhyan@gmail.com 0:80c7778c82b8 110 {
rozendhyan@gmail.com 0:80c7778c82b8 111 connected = false;
rozendhyan@gmail.com 0:80c7778c82b8 112
rozendhyan@gmail.com 0:80c7778c82b8 113 while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED)
rozendhyan@gmail.com 0:80c7778c82b8 114 {
rozendhyan@gmail.com 0:80c7778c82b8 115 /*if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
rozendhyan@gmail.com 0:80c7778c82b8 116 printf ("File: %s, Line: %d Error: %d\n\r",__FILE__,__LINE__, connack_rc);
rozendhyan@gmail.com 0:80c7778c82b8 117 return; // don't reattempt to connect if credentials are wrong
rozendhyan@gmail.com 0:80c7778c82b8 118 } */
rozendhyan@gmail.com 0:80c7778c82b8 119 int timeout = getConnTimeout(++retryAttempt);
rozendhyan@gmail.com 0:80c7778c82b8 120 WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
rozendhyan@gmail.com 0:80c7778c82b8 121
rozendhyan@gmail.com 0:80c7778c82b8 122 // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
rozendhyan@gmail.com 0:80c7778c82b8 123 // or maybe just add the proper members to do this disconnect and call attemptConnect(...)
rozendhyan@gmail.com 0:80c7778c82b8 124 // this works - reset the system when the retry count gets to a threshold
rozendhyan@gmail.com 0:80c7778c82b8 125 if (retryAttempt == 5)
rozendhyan@gmail.com 0:80c7778c82b8 126 NVIC_SystemReset();
rozendhyan@gmail.com 0:80c7778c82b8 127 else
rozendhyan@gmail.com 0:80c7778c82b8 128 wait(timeout);
rozendhyan@gmail.com 0:80c7778c82b8 129 }
rozendhyan@gmail.com 0:80c7778c82b8 130 }
rozendhyan@gmail.com 0:80c7778c82b8 131 int publish (MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client,MQTTWiFi* ipstack){
rozendhyan@gmail.com 0:80c7778c82b8 132
rozendhyan@gmail.com 0:80c7778c82b8 133
rozendhyan@gmail.com 0:80c7778c82b8 134 MQTT::Message message;
rozendhyan@gmail.com 0:80c7778c82b8 135 int data = bmpSensor.Temp_read();
rozendhyan@gmail.com 0:80c7778c82b8 136 char *pubTopic = TOPIC;
rozendhyan@gmail.com 0:80c7778c82b8 137 char buf[MQTT_MAX_PAYLOAD_SIZE];
rozendhyan@gmail.com 0:80c7778c82b8 138
rozendhyan@gmail.com 0:80c7778c82b8 139
rozendhyan@gmail.com 0:80c7778c82b8 140 printf("Temp = %d\n", data);
rozendhyan@gmail.com 0:80c7778c82b8 141 sprintf(buf,"%d",data);
rozendhyan@gmail.com 0:80c7778c82b8 142 message.qos = MQTT::QOS0;
rozendhyan@gmail.com 0:80c7778c82b8 143 message.retained = false;
rozendhyan@gmail.com 0:80c7778c82b8 144 message.dup = false;
rozendhyan@gmail.com 0:80c7778c82b8 145 message.payload = (void*)buf;
rozendhyan@gmail.com 0:80c7778c82b8 146 message.payloadlen = strlen(buf);
rozendhyan@gmail.com 0:80c7778c82b8 147
rozendhyan@gmail.com 0:80c7778c82b8 148 printf("Publishing %s\n\r", buf);
rozendhyan@gmail.com 0:80c7778c82b8 149 return client->publish(pubTopic, message);
rozendhyan@gmail.com 0:80c7778c82b8 150 }
rozendhyan@gmail.com 0:80c7778c82b8 151
rozendhyan@gmail.com 0:80c7778c82b8 152 int main(int argc, char const *argv[])
rozendhyan@gmail.com 0:80c7778c82b8 153 {
rozendhyan@gmail.com 0:80c7778c82b8 154 myled =0;
rozendhyan@gmail.com 0:80c7778c82b8 155 /* code */
rozendhyan@gmail.com 0:80c7778c82b8 156 const char *ssid = SSID;
rozendhyan@gmail.com 0:80c7778c82b8 157 const char *seckey = PASSW;
rozendhyan@gmail.com 0:80c7778c82b8 158 //use SpwfSAInterface connect AP
rozendhyan@gmail.com 0:80c7778c82b8 159 SpwfSAInterface spwf(D8,D2, false);
rozendhyan@gmail.com 0:80c7778c82b8 160
rozendhyan@gmail.com 0:80c7778c82b8 161 printf("\r\nX-NUCLEO-IDW01M1 mbed \n");
rozendhyan@gmail.com 0:80c7778c82b8 162 printf("\r\nconnecting to AP\n");
rozendhyan@gmail.com 0:80c7778c82b8 163 //connect to Wifi
rozendhyan@gmail.com 0:80c7778c82b8 164 MQTTWiFi ipstack(spwf, ssid, seckey, NSAPI_SECURITY_WPA2);
rozendhyan@gmail.com 0:80c7778c82b8 165 //check wifi has got ip_address
rozendhyan@gmail.com 0:80c7778c82b8 166 if(ipstack.getWiFi().get_ip_address() == 0){
rozendhyan@gmail.com 0:80c7778c82b8 167 printf("Connect WiFi is failed!\nPlease check your ssid and passwd is correct");
rozendhyan@gmail.com 0:80c7778c82b8 168 return 0;
rozendhyan@gmail.com 0:80c7778c82b8 169 }
rozendhyan@gmail.com 0:80c7778c82b8 170 printf("ip: %s\n",ipstack.getWiFi().get_ip_address() );
rozendhyan@gmail.com 0:80c7778c82b8 171
rozendhyan@gmail.com 0:80c7778c82b8 172 MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
rozendhyan@gmail.com 0:80c7778c82b8 173 attemptConnect(&client, &ipstack);
rozendhyan@gmail.com 0:80c7778c82b8 174
rozendhyan@gmail.com 0:80c7778c82b8 175 myled=1;
rozendhyan@gmail.com 0:80c7778c82b8 176 int count = 0;
rozendhyan@gmail.com 0:80c7778c82b8 177 // tyeld.start();
rozendhyan@gmail.com 0:80c7778c82b8 178 while (true)
rozendhyan@gmail.com 0:80c7778c82b8 179 {
rozendhyan@gmail.com 0:80c7778c82b8 180 if (++count == 100)
rozendhyan@gmail.com 0:80c7778c82b8 181 { // Publish a message every second
rozendhyan@gmail.com 0:80c7778c82b8 182 if (publish(&client, &ipstack) != 0) {
rozendhyan@gmail.com 0:80c7778c82b8 183 myled=0;
rozendhyan@gmail.com 0:80c7778c82b8 184 attemptConnect(&client, &ipstack); // if we have lost the connection
rozendhyan@gmail.com 0:80c7778c82b8 185 } else myled=1;
rozendhyan@gmail.com 0:80c7778c82b8 186 count = 0;
rozendhyan@gmail.com 0:80c7778c82b8 187 }
rozendhyan@gmail.com 0:80c7778c82b8 188 // int start = tyeld.read_ms();
rozendhyan@gmail.com 0:80c7778c82b8 189 client.yield(10); // allow the MQTT client to receive messages
rozendhyan@gmail.com 0:80c7778c82b8 190 // printf ("tyeld: %d\n\r",tyeld.read_ms()-start);
rozendhyan@gmail.com 0:80c7778c82b8 191
rozendhyan@gmail.com 0:80c7778c82b8 192 }
rozendhyan@gmail.com 0:80c7778c82b8 193
rozendhyan@gmail.com 0:80c7778c82b8 194 return 0;
rozendhyan@gmail.com 0:80c7778c82b8 195 }