989

Dependencies:   mbed Servo X_NUCLEO_IKS01A2 X_NUCLEO_IDW01M1v2 NetworkSocketAPI NDefLib MQTT

Committer:
fishzhang
Date:
Wed Nov 04 02:51:05 2020 +0000
Revision:
25:d7f1e43736cf
Parent:
24:a59eb8bdc431
9

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 0:cbf8bc43bc9e 1 #include "mbed.h"
mapellil 14:641560b57584 2 #include "SpwfInterface.h"
mridup 4:1ed7f173eec5 3 #include "TCPSocket.h"
fabiombed 13:0b31131bf711 4 #include "MQTTClient.h"
mapellil 14:641560b57584 5 #include "MQTTWiFi.h"
mapellil 14:641560b57584 6 #include <ctype.h>
mapellil 23:43f9e34781f2 7 #include "NDefLib/NDefNfcTag.h"
mapellil 23:43f9e34781f2 8 #include "NDefLib/RecordType/RecordURI.h"
fishzhang 25:d7f1e43736cf 9 #include "Servo.h"
fishzhang 25:d7f1e43736cf 10 #include"XNucleoIKS01A2.h"
fishzhang 25:d7f1e43736cf 11 #include "stm32f4xx_hal.h"
fishzhang 25:d7f1e43736cf 12 Servo servo(D10);
fabiombed 13:0b31131bf711 13
fishzhang 25:d7f1e43736cf 14 float range = 0.005;
fishzhang 25:d7f1e43736cf 15 float position = 0.5;
fishzhang 25:d7f1e43736cf 16
mridup 8:6df01cb43137 17 Serial pc(SERIAL_TX, SERIAL_RX);
mapellil 14:641560b57584 18 bool quickstartMode = true;
mapellil 17:83d0cd810ed3 19
fishzhang 25:d7f1e43736cf 20 #define ORG_QUICKSTART 101.132.47.170 // comment to connect to play.internetofthings.ibmcloud.com
mapellil 23:43f9e34781f2 21 //#define SUBSCRIBE // uncomment to subscribe to broker msgs (not to be used with IBM broker)
mapellil 14:641560b57584 22
mapellil 14:641560b57584 23 #define MQTT_MAX_PACKET_SIZE 250
mapellil 14:641560b57584 24 #define MQTT_MAX_PAYLOAD_SIZE 300
mapellil 17:83d0cd810ed3 25
mapellil 14:641560b57584 26 // Configuration values needed to connect to IBM IoT Cloud
fishzhang 25:d7f1e43736cf 27 #define BROKER_URL ".132.47.170";
mapellil 17:83d0cd810ed3 28 #ifdef ORG_QUICKSTART
fishzhang 25:d7f1e43736cf 29 #define ORG "101" // connect to quickstart.internetofthings.ibmcloud.com/ For a registered connection, replace with your org
fishzhang 25:d7f1e43736cf 30 #define ID "168"
fishzhang 25:d7f1e43736cf 31 #define AUTH_TOKEN "10"
fishzhang 25:d7f1e43736cf 32 #define DEFAULT_TYPE_NAME "145"
mapellil 23:43f9e34781f2 33 #else // not def ORG_QUICKSTART
fishzhang 25:d7f1e43736cf 34 #define ORG "192" // connect to play.internetofthings.ibmcloud.com/ For a registered connection, replace with your org
fishzhang 25:d7f1e43736cf 35 #define ID "168" // For a registered connection, replace with your id
fishzhang 25:d7f1e43736cf 36 #define AUTH_TOKEN "10"// For a registered connection, replace with your auth-token
fishzhang 25:d7f1e43736cf 37 #define DEFAULT_TYPE_NAME "145"
mapellil 17:83d0cd810ed3 38 #endif
fishzhang 25:d7f1e43736cf 39 #define TOPIC "TempA"
fishzhang 25:d7f1e43736cf 40 #define TOPIC2 "commond"
fishzhang 25:d7f1e43736cf 41 #define TOPICT_hum "hum"
fishzhang 25:d7f1e43736cf 42 #define TOPICT_x "x"
fishzhang 25:d7f1e43736cf 43 #define TOPICT_y "y"
fishzhang 25:d7f1e43736cf 44 #define TOPICT_z "z"
fishzhang 25:d7f1e43736cf 45 #define TOPICT_ax "a_x"
fishzhang 25:d7f1e43736cf 46 #define TOPICT_ay "a_y"
fishzhang 25:d7f1e43736cf 47 #define TOPICT_az "a_z"
fishzhang 25:d7f1e43736cf 48 #define TOPICT_bx "b_x"
fishzhang 25:d7f1e43736cf 49 #define TOPICT_by "b_y"
fishzhang 25:d7f1e43736cf 50 #define TOPICT_bz "b_z"
fishzhang 25:d7f1e43736cf 51
mapellil 17:83d0cd810ed3 52
mapellil 14:641560b57584 53 #define TYPE DEFAULT_TYPE_NAME // For a registered connection, replace with your type
mapellil 14:641560b57584 54 #define MQTT_PORT 1883
mapellil 14:641560b57584 55 #define MQTT_TLS_PORT 8883
mapellil 14:641560b57584 56 #define IBM_IOT_PORT MQTT_PORT
mapellil 16:233b89a6b72f 57 // WiFi network credential
fishzhang 25:d7f1e43736cf 58 #define SSID "LongFreeMoble" // Network must be visible otherwise it can't connect
fishzhang 25:d7f1e43736cf 59 #define PASSW "iots8230"
nikapov 20:517b559ce91d 60 #warning "Wifi SSID & password empty"
fishzhang 25:d7f1e43736cf 61 char* topic = "TempA";
mapellil 14:641560b57584 62
mapellil 14:641560b57584 63 char id[30] = ID; // mac without colons
mapellil 14:641560b57584 64 char org[12] = ORG;
mapellil 14:641560b57584 65 int connack_rc = 0; // MQTT connack return code
mapellil 14:641560b57584 66 const char* ip_addr = "";
mapellil 14:641560b57584 67 char* host_addr = "";
mapellil 14:641560b57584 68 char type[30] = TYPE;
mapellil 14:641560b57584 69 char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode
mapellil 14:641560b57584 70 bool netConnecting = false;
mapellil 23:43f9e34781f2 71 int connectTimeout = 1000;
mapellil 14:641560b57584 72 bool mqttConnecting = false;
mapellil 14:641560b57584 73 bool netConnected = false;
mapellil 14:641560b57584 74 bool connected = false;
mapellil 14:641560b57584 75 int retryAttempt = 0;
mapellil 23:43f9e34781f2 76 char subscription_url[MQTT_MAX_PAYLOAD_SIZE];
fishzhang 25:d7f1e43736cf 77
fishzhang 25:d7f1e43736cf 78
fishzhang 25:d7f1e43736cf 79 static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
mapellil 14:641560b57584 80
fishzhang 25:d7f1e43736cf 81 /* Retrieve the composing elements of the expansion board */
fishzhang 25:d7f1e43736cf 82 static LSM303AGRMagSensor *magnetometer = mems_expansion_board->magnetometer;
fishzhang 25:d7f1e43736cf 83 static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
fishzhang 25:d7f1e43736cf 84 static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor;
fishzhang 25:d7f1e43736cf 85 static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
fishzhang 25:d7f1e43736cf 86 static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
fishzhang 25:d7f1e43736cf 87
fishzhang 25:d7f1e43736cf 88 class WatchDog {
fishzhang 25:d7f1e43736cf 89
fishzhang 25:d7f1e43736cf 90 private:
fishzhang 25:d7f1e43736cf 91
fishzhang 25:d7f1e43736cf 92 IWDG_HandleTypeDef hiwdg;
fishzhang 25:d7f1e43736cf 93
fishzhang 25:d7f1e43736cf 94 public:
fishzhang 25:d7f1e43736cf 95
fishzhang 25:d7f1e43736cf 96 WatchDog(uint32_t prescaler = IWDG_PRESCALER_256, uint32_t reload = 0xfff) {
fishzhang 25:d7f1e43736cf 97
fishzhang 25:d7f1e43736cf 98 hiwdg.Instance = IWDG;
fishzhang 25:d7f1e43736cf 99
fishzhang 25:d7f1e43736cf 100 hiwdg.Init.Prescaler = prescaler;
fishzhang 25:d7f1e43736cf 101
fishzhang 25:d7f1e43736cf 102 hiwdg.Init.Reload = reload;
fishzhang 25:d7f1e43736cf 103
fishzhang 25:d7f1e43736cf 104 HAL_IWDG_Init(&hiwdg);
fishzhang 25:d7f1e43736cf 105
fishzhang 25:d7f1e43736cf 106 }
fishzhang 25:d7f1e43736cf 107
fishzhang 25:d7f1e43736cf 108 void feed() {
fishzhang 25:d7f1e43736cf 109
fishzhang 25:d7f1e43736cf 110 HAL_IWDG_Refresh(&hiwdg);
fishzhang 25:d7f1e43736cf 111
fishzhang 25:d7f1e43736cf 112 }
fishzhang 25:d7f1e43736cf 113
fishzhang 25:d7f1e43736cf 114 };
fishzhang 25:d7f1e43736cf 115
fishzhang 25:d7f1e43736cf 116
fishzhang 25:d7f1e43736cf 117 /* Retrieve the composing elements of the expansion board */
fishzhang 25:d7f1e43736cf 118 //PressureSensor *pressure_sensor;
fishzhang 25:d7f1e43736cf 119 //HumiditySensor *humidity_sensor;
fishzhang 25:d7f1e43736cf 120 //TempSensor *temp_sensor1;
mapellil 14:641560b57584 121
mapellil 23:43f9e34781f2 122 MQTT::Message message;
mapellil 23:43f9e34781f2 123 MQTTString TopicName={TOPIC};
mapellil 23:43f9e34781f2 124 MQTT::MessageData MsgData(TopicName, message);
mapellil 23:43f9e34781f2 125
mapellil 23:43f9e34781f2 126 void subscribe_cb(MQTT::MessageData & msgMQTT) {
mapellil 23:43f9e34781f2 127 char msg[MQTT_MAX_PAYLOAD_SIZE];
mapellil 23:43f9e34781f2 128 msg[0]='\0';
mapellil 23:43f9e34781f2 129 strncat (msg, (char*)msgMQTT.message.payload, msgMQTT.message.payloadlen);
mapellil 23:43f9e34781f2 130 printf ("--->>> subscribe_cb msg: %s\n\r", msg);
fishzhang 25:d7f1e43736cf 131 printf("%d\r\n",strlen(msg));
fishzhang 25:d7f1e43736cf 132 if(strlen(msg)==2)
fishzhang 25:d7f1e43736cf 133 {
fishzhang 25:d7f1e43736cf 134 printf ("I AM WORKING\n\r");
fishzhang 25:d7f1e43736cf 135 int i=0;
fishzhang 25:d7f1e43736cf 136 while(i<500) {
fishzhang 25:d7f1e43736cf 137 i++;
fishzhang 25:d7f1e43736cf 138 servo = position;
fishzhang 25:d7f1e43736cf 139 position += range;
fishzhang 25:d7f1e43736cf 140 if(position >= 1) {
fishzhang 25:d7f1e43736cf 141 position = 0;
fishzhang 25:d7f1e43736cf 142 wait(0.5);
fishzhang 25:d7f1e43736cf 143 }
fishzhang 25:d7f1e43736cf 144 wait(0.002);
fishzhang 25:d7f1e43736cf 145 }
fishzhang 25:d7f1e43736cf 146 }
mapellil 23:43f9e34781f2 147 }
mapellil 23:43f9e34781f2 148
mapellil 23:43f9e34781f2 149 int subscribe(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 23:43f9e34781f2 150 {
fishzhang 25:d7f1e43736cf 151 char* pubTopic = TOPIC2;
fishzhang 25:d7f1e43736cf 152 printf("subscribe int finished\r\n");
mapellil 23:43f9e34781f2 153 return client->subscribe(pubTopic, MQTT::QOS1, subscribe_cb);
mapellil 23:43f9e34781f2 154 }
mapellil 14:641560b57584 155
mapellil 14:641560b57584 156 int connect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 23:43f9e34781f2 157 {
mapellil 23:43f9e34781f2 158 const char* iot_ibm = BROKER_URL;
mapellil 23:43f9e34781f2 159
mapellil 14:641560b57584 160
mapellil 14:641560b57584 161 char hostname[strlen(org) + strlen(iot_ibm) + 1];
mapellil 14:641560b57584 162 sprintf(hostname, "%s%s", org, iot_ibm);
mapellil 14:641560b57584 163 SpwfSAInterface& WiFi = ipstack->getWiFi();
mapellil 23:43f9e34781f2 164 char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
mapellil 23:43f9e34781f2 165 sprintf(clientId, "d:%s:%s:%s", org, type, id);
fishzhang 25:d7f1e43736cf 166 sprintf(subscription_url, "%s.%s/#/device/%s/sensor/", org, "iots",id);
mapellil 23:43f9e34781f2 167
mapellil 14:641560b57584 168 // Network debug statements
fishzhang 25:d7f1e43736cf 169 LOG("\n\r=====================================\n\r");
mapellil 14:641560b57584 170 LOG("Connecting WiFi.\n\r");
mapellil 23:43f9e34781f2 171 LOG("Nucleo IP ADDRESS: %s\n\r", WiFi.get_ip_address());
mapellil 23:43f9e34781f2 172 LOG("Nucleo MAC ADDRESS: %s\n\r", WiFi.get_mac_address());
mapellil 23:43f9e34781f2 173 LOG("Server Hostname: %s port: %d\n\r", hostname, IBM_IOT_PORT);
mapellil 24:a59eb8bdc431 174 LOG("Client ID: %s\n\r", clientId);
mapellil 23:43f9e34781f2 175 LOG("Topic: %s\n\r",TOPIC);
mapellil 23:43f9e34781f2 176 LOG("Subscription URL: %s\n\r", subscription_url);
mapellil 14:641560b57584 177 LOG("=====================================\n\r");
mapellil 14:641560b57584 178
mapellil 14:641560b57584 179 netConnecting = true;
mapellil 14:641560b57584 180 ipstack->open(&ipstack->getWiFi());
mapellil 23:43f9e34781f2 181 int rc = ipstack->connect(hostname, IBM_IOT_PORT, connectTimeout);
mapellil 14:641560b57584 182 if (rc != 0)
mapellil 14:641560b57584 183 {
mapellil 14:641560b57584 184 WARN("IP Stack connect returned: %d\n", rc);
mapellil 14:641560b57584 185 return rc;
mapellil 14:641560b57584 186 }
mapellil 23:43f9e34781f2 187 printf ("--->TCP Connected\n\r");
mapellil 14:641560b57584 188 netConnected = true;
mapellil 14:641560b57584 189 netConnecting = false;
mapellil 14:641560b57584 190
mapellil 14:641560b57584 191 // MQTT Connect
mapellil 14:641560b57584 192 mqttConnecting = true;
mapellil 14:641560b57584 193 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
mapellil 17:83d0cd810ed3 194 data.MQTTVersion = 4;
mapellil 17:83d0cd810ed3 195 data.struct_version=0;
mapellil 14:641560b57584 196 data.clientID.cstring = clientId;
mapellil 14:641560b57584 197
mapellil 14:641560b57584 198 if (!quickstartMode)
mapellil 14:641560b57584 199 {
mapellil 14:641560b57584 200 data.username.cstring = "use-token-auth";
mapellil 14:641560b57584 201 data.password.cstring = auth_token;
mapellil 23:43f9e34781f2 202 }
mapellil 14:641560b57584 203 if ((rc = client->connect(data)) == 0)
mapellil 14:641560b57584 204 {
mapellil 14:641560b57584 205 connected = true;
mapellil 23:43f9e34781f2 206 printf ("--->MQTT Connected\n\r");
mapellil 23:43f9e34781f2 207 #ifdef SUBSCRIBE
mapellil 23:43f9e34781f2 208 if (!subscribe(client, ipstack)) printf ("--->>>MQTT subscribed to: %s\n\r",TOPIC);
mapellil 23:43f9e34781f2 209 #endif
mapellil 14:641560b57584 210 }
mapellil 14:641560b57584 211 else {
mapellil 14:641560b57584 212 WARN("MQTT connect returned %d\n", rc);
mapellil 14:641560b57584 213 }
mapellil 14:641560b57584 214 if (rc >= 0)
mapellil 14:641560b57584 215 connack_rc = rc;
mapellil 14:641560b57584 216 mqttConnecting = false;
mapellil 14:641560b57584 217 return rc;
mapellil 14:641560b57584 218 }
mapellil 14:641560b57584 219
mapellil 14:641560b57584 220 int getConnTimeout(int attemptNumber)
mapellil 14:641560b57584 221 { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
mapellil 14:641560b57584 222 // after 20 attempts, retry every 10 minutes
mapellil 14:641560b57584 223 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
mapellil 14:641560b57584 224 }
mapellil 14:641560b57584 225
mapellil 14:641560b57584 226 void attemptConnect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 14:641560b57584 227 {
mapellil 14:641560b57584 228 connected = false;
mapellil 14:641560b57584 229
mapellil 14:641560b57584 230 while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED)
mapellil 14:641560b57584 231 {
mapellil 14:641560b57584 232 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
mapellil 23:43f9e34781f2 233 printf ("File: %s, Line: %d Error: %d\n\r",__FILE__,__LINE__, connack_rc);
mapellil 14:641560b57584 234 return; // don't reattempt to connect if credentials are wrong
mapellil 23:43f9e34781f2 235 }
mapellil 14:641560b57584 236 int timeout = getConnTimeout(++retryAttempt);
mapellil 14:641560b57584 237 WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
mapellil 14:641560b57584 238
mapellil 14:641560b57584 239 // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
mapellil 23:43f9e34781f2 240 // or maybe just add the proper members to do this disconnect and call attemptConnect(...)
mapellil 14:641560b57584 241 // this works - reset the system when the retry count gets to a threshold
mapellil 14:641560b57584 242 if (retryAttempt == 5)
mapellil 14:641560b57584 243 NVIC_SystemReset();
mapellil 14:641560b57584 244 else
mapellil 14:641560b57584 245 wait(timeout);
mapellil 14:641560b57584 246 }
mapellil 14:641560b57584 247 }
mapellil 14:641560b57584 248
mapellil 14:641560b57584 249 int publish(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 14:641560b57584 250 {
mapellil 14:641560b57584 251 MQTT::Message message;
mapellil 23:43f9e34781f2 252 char* pubTopic = TOPIC;
fishzhang 25:d7f1e43736cf 253 char buf[MQTT_MAX_PAYLOAD_SIZE];
fishzhang 25:d7f1e43736cf 254 float temp, press, hum;
fishzhang 25:d7f1e43736cf 255 printf("%f\r\n",press);
fishzhang 25:d7f1e43736cf 256 hum_temp->get_temperature(&temp);
fishzhang 25:d7f1e43736cf 257 hum_temp->get_humidity(&hum);
fishzhang 25:d7f1e43736cf 258 // temp_sensor1->GetTemperature(&temp);
fishzhang 25:d7f1e43736cf 259 // humidity_sensor->GetHumidity(&hum);
fishzhang 25:d7f1e43736cf 260 // pressure_sensor->GetPressure(&press);
fishzhang 25:d7f1e43736cf 261
fishzhang 25:d7f1e43736cf 262
fishzhang 25:d7f1e43736cf 263 sprintf(buf,"%0.4f",temp);
fishzhang 25:d7f1e43736cf 264 message.qos = MQTT::QOS1;
fishzhang 25:d7f1e43736cf 265 message.retained = false;
fishzhang 25:d7f1e43736cf 266 message.dup = false;
fishzhang 25:d7f1e43736cf 267 message.payload = (void*)buf;
fishzhang 25:d7f1e43736cf 268 message.payloadlen = strlen(buf);
fishzhang 25:d7f1e43736cf 269 //message.payloadlen = sizeof(temp);
fishzhang 25:d7f1e43736cf 270
fishzhang 25:d7f1e43736cf 271 // LOG("Publishing %s\n\r", buf);
fishzhang 25:d7f1e43736cf 272 printf("Publishing hum %s\n\r", buf);
fishzhang 25:d7f1e43736cf 273 return client->publish(pubTopic, message);
fishzhang 25:d7f1e43736cf 274 }
fishzhang 25:d7f1e43736cf 275 int publish2(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
fishzhang 25:d7f1e43736cf 276 {
fishzhang 25:d7f1e43736cf 277 MQTT::Message message;
fishzhang 25:d7f1e43736cf 278 char* pubTopic = TOPICT_hum;
fishzhang 25:d7f1e43736cf 279 uint8_t id;
fishzhang 25:d7f1e43736cf 280
fishzhang 25:d7f1e43736cf 281 char buf[MQTT_MAX_PAYLOAD_SIZE];
fishzhang 25:d7f1e43736cf 282 float temp, press, hum;
fishzhang 25:d7f1e43736cf 283 printf("%f\r\n",press);
fishzhang 25:d7f1e43736cf 284 hum_temp->get_temperature(&temp);
fishzhang 25:d7f1e43736cf 285 hum_temp->get_humidity(&hum);
fishzhang 25:d7f1e43736cf 286 // temp_sensor1->GetTemperature(&temp);
fishzhang 25:d7f1e43736cf 287 // humidity_sensor->GetHumidity(&hum);
fishzhang 25:d7f1e43736cf 288 // pressure_sensor->GetPressure(&press);
fishzhang 25:d7f1e43736cf 289
fishzhang 25:d7f1e43736cf 290
fishzhang 25:d7f1e43736cf 291 sprintf(buf,"%0.4f",hum);
fishzhang 25:d7f1e43736cf 292 message.qos = MQTT::QOS1;
fishzhang 25:d7f1e43736cf 293 message.retained = false;
fishzhang 25:d7f1e43736cf 294 message.dup = false;
fishzhang 25:d7f1e43736cf 295 message.payload = (void*)buf;
fishzhang 25:d7f1e43736cf 296 message.payloadlen = strlen(buf);
fishzhang 25:d7f1e43736cf 297 //message.payloadlen = sizeof(temp);
fishzhang 25:d7f1e43736cf 298
fishzhang 25:d7f1e43736cf 299 // LOG("Publishing %s\n\r", buf);
fishzhang 25:d7f1e43736cf 300 printf("Publishing temp %s\n\r", buf);
fishzhang 25:d7f1e43736cf 301 return client->publish(pubTopic, message);
fishzhang 25:d7f1e43736cf 302 }
fishzhang 25:d7f1e43736cf 303 int publish3(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
fishzhang 25:d7f1e43736cf 304 {
fishzhang 25:d7f1e43736cf 305 int32_t axes[3];
fishzhang 25:d7f1e43736cf 306 MQTT::Message message;
fishzhang 25:d7f1e43736cf 307 char* pubTopic = TOPICT_x;
fishzhang 25:d7f1e43736cf 308 uint8_t id;
mapellil 14:641560b57584 309
mapellil 14:641560b57584 310 char buf[MQTT_MAX_PAYLOAD_SIZE];
mapellil 14:641560b57584 311 float temp, press, hum;
fishzhang 25:d7f1e43736cf 312 printf("%f\r\n",press);
fishzhang 25:d7f1e43736cf 313 hum_temp->get_temperature(&temp);
fishzhang 25:d7f1e43736cf 314 hum_temp->get_humidity(&hum);
fishzhang 25:d7f1e43736cf 315 magnetometer->get_m_axes(axes);
fishzhang 25:d7f1e43736cf 316
fishzhang 25:d7f1e43736cf 317
fishzhang 25:d7f1e43736cf 318 sprintf(buf,"%0.4d",axes[0]);
fishzhang 25:d7f1e43736cf 319 message.qos = MQTT::QOS1;
fishzhang 25:d7f1e43736cf 320 message.retained = false;
fishzhang 25:d7f1e43736cf 321 message.dup = false;
fishzhang 25:d7f1e43736cf 322 message.payload = (void*)buf;
fishzhang 25:d7f1e43736cf 323 message.payloadlen = strlen(buf);
fishzhang 25:d7f1e43736cf 324 printf("Publishing x %s\n\r", buf);
fishzhang 25:d7f1e43736cf 325 return client->publish(pubTopic, message);
fishzhang 25:d7f1e43736cf 326 }
fishzhang 25:d7f1e43736cf 327 int publish4(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
fishzhang 25:d7f1e43736cf 328 {
fishzhang 25:d7f1e43736cf 329 int32_t axes[3];
fishzhang 25:d7f1e43736cf 330 MQTT::Message message;
fishzhang 25:d7f1e43736cf 331 char* pubTopic = TOPICT_y;
fishzhang 25:d7f1e43736cf 332 uint8_t id;
fishzhang 25:d7f1e43736cf 333
fishzhang 25:d7f1e43736cf 334 char buf[MQTT_MAX_PAYLOAD_SIZE];
fishzhang 25:d7f1e43736cf 335 magnetometer->get_m_axes(axes);
fishzhang 25:d7f1e43736cf 336
fishzhang 25:d7f1e43736cf 337 printf("axes's number%d\r\n",axes[1]);
fishzhang 25:d7f1e43736cf 338 sprintf(buf,"%0.4d",axes[1]);
fishzhang 25:d7f1e43736cf 339 message.qos = MQTT::QOS1;
fishzhang 25:d7f1e43736cf 340 message.retained = false;
fishzhang 25:d7f1e43736cf 341 message.dup = false;
fishzhang 25:d7f1e43736cf 342 message.payload = (void*)buf;
fishzhang 25:d7f1e43736cf 343 message.payloadlen = strlen(buf);
fishzhang 25:d7f1e43736cf 344 printf("Publishing y %s\n\r", buf);
fishzhang 25:d7f1e43736cf 345 return client->publish(pubTopic, message);
fishzhang 25:d7f1e43736cf 346 }
fishzhang 25:d7f1e43736cf 347 int publish5(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
fishzhang 25:d7f1e43736cf 348 {
fishzhang 25:d7f1e43736cf 349 int32_t axes[3];
fishzhang 25:d7f1e43736cf 350 MQTT::Message message;
fishzhang 25:d7f1e43736cf 351 char* pubTopic = TOPICT_z;
fishzhang 25:d7f1e43736cf 352 uint8_t id;
fishzhang 25:d7f1e43736cf 353
fishzhang 25:d7f1e43736cf 354 char buf[MQTT_MAX_PAYLOAD_SIZE];
fishzhang 25:d7f1e43736cf 355 float temp, press, hum;
fishzhang 25:d7f1e43736cf 356 hum_temp->get_temperature(&temp);
fishzhang 25:d7f1e43736cf 357 hum_temp->get_humidity(&hum);
fishzhang 25:d7f1e43736cf 358 magnetometer->get_m_axes(axes);
fishzhang 25:d7f1e43736cf 359
fishzhang 25:d7f1e43736cf 360
fishzhang 25:d7f1e43736cf 361 sprintf(buf,"%0.4d",axes[2]);
fishzhang 25:d7f1e43736cf 362 message.qos = MQTT::QOS1;
fishzhang 25:d7f1e43736cf 363 message.retained = false;
fishzhang 25:d7f1e43736cf 364 message.dup = false;
fishzhang 25:d7f1e43736cf 365 message.payload = (void*)buf;
fishzhang 25:d7f1e43736cf 366 message.payloadlen = strlen(buf);
fishzhang 25:d7f1e43736cf 367 //message.payloadlen = sizeof(temp);
fishzhang 25:d7f1e43736cf 368
fishzhang 25:d7f1e43736cf 369 // LOG("Publishing %s\n\r", buf);
fishzhang 25:d7f1e43736cf 370 printf("Publishing z %s\n\r", buf);
fishzhang 25:d7f1e43736cf 371 return client->publish(pubTopic, message);
fishzhang 25:d7f1e43736cf 372 }
fishzhang 25:d7f1e43736cf 373 int publish7(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
fishzhang 25:d7f1e43736cf 374 {
fishzhang 25:d7f1e43736cf 375 int32_t axes[3];
fishzhang 25:d7f1e43736cf 376 MQTT::Message message;
fishzhang 25:d7f1e43736cf 377 char* pubTopic = TOPICT_ax;
fishzhang 25:d7f1e43736cf 378
fishzhang 25:d7f1e43736cf 379 char buf[MQTT_MAX_PAYLOAD_SIZE];
fishzhang 25:d7f1e43736cf 380 accelerometer->get_x_axes(axes);
fishzhang 25:d7f1e43736cf 381 sprintf(buf,"%0.4d",axes[0]);
mapellil 14:641560b57584 382 message.qos = MQTT::QOS0;
mapellil 14:641560b57584 383 message.retained = false;
mapellil 14:641560b57584 384 message.dup = false;
mapellil 14:641560b57584 385 message.payload = (void*)buf;
mapellil 14:641560b57584 386 message.payloadlen = strlen(buf);
fishzhang 25:d7f1e43736cf 387 printf("Publishing %s\n\r", buf);
fishzhang 25:d7f1e43736cf 388 return client->publish(pubTopic, message);
fishzhang 25:d7f1e43736cf 389 }
fishzhang 25:d7f1e43736cf 390 int publish8(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
fishzhang 25:d7f1e43736cf 391 {
fishzhang 25:d7f1e43736cf 392 int32_t axes[3];
fishzhang 25:d7f1e43736cf 393 MQTT::Message message;
fishzhang 25:d7f1e43736cf 394 char* pubTopic = TOPICT_ay;
fishzhang 25:d7f1e43736cf 395
fishzhang 25:d7f1e43736cf 396 char buf[MQTT_MAX_PAYLOAD_SIZE];
fishzhang 25:d7f1e43736cf 397 accelerometer->get_x_axes(axes);
fishzhang 25:d7f1e43736cf 398 sprintf(buf,"%0.4d",axes[1]);
fishzhang 25:d7f1e43736cf 399 message.qos = MQTT::QOS0;
fishzhang 25:d7f1e43736cf 400 message.retained = false;
fishzhang 25:d7f1e43736cf 401 message.dup = false;
fishzhang 25:d7f1e43736cf 402 message.payload = (void*)buf;
fishzhang 25:d7f1e43736cf 403 message.payloadlen = strlen(buf);
fishzhang 25:d7f1e43736cf 404 printf("Publishing %s\n\r", buf);
fishzhang 25:d7f1e43736cf 405 return client->publish(pubTopic, message);
fishzhang 25:d7f1e43736cf 406 }
fishzhang 25:d7f1e43736cf 407 int publish9(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
fishzhang 25:d7f1e43736cf 408 {
fishzhang 25:d7f1e43736cf 409 int32_t axes[3];
fishzhang 25:d7f1e43736cf 410 MQTT::Message message;
fishzhang 25:d7f1e43736cf 411 char* pubTopic = TOPICT_az;
fishzhang 25:d7f1e43736cf 412
fishzhang 25:d7f1e43736cf 413 char buf[MQTT_MAX_PAYLOAD_SIZE];
fishzhang 25:d7f1e43736cf 414 accelerometer->get_x_axes(axes);
fishzhang 25:d7f1e43736cf 415 sprintf(buf,"%0.4d",axes[2]);
fishzhang 25:d7f1e43736cf 416 message.qos = MQTT::QOS0;
fishzhang 25:d7f1e43736cf 417 message.retained = false;
fishzhang 25:d7f1e43736cf 418 message.dup = false;
fishzhang 25:d7f1e43736cf 419 message.payload = (void*)buf;
fishzhang 25:d7f1e43736cf 420 message.payloadlen = strlen(buf);
fishzhang 25:d7f1e43736cf 421 printf("Publishing %s\n\r", buf);
fishzhang 25:d7f1e43736cf 422 return client->publish(pubTopic, message);
fishzhang 25:d7f1e43736cf 423 }
fishzhang 25:d7f1e43736cf 424 int publish10(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
fishzhang 25:d7f1e43736cf 425 {
fishzhang 25:d7f1e43736cf 426 int32_t axes[3];
fishzhang 25:d7f1e43736cf 427 MQTT::Message message;
fishzhang 25:d7f1e43736cf 428 char* pubTopic = TOPICT_bx;
fishzhang 25:d7f1e43736cf 429
fishzhang 25:d7f1e43736cf 430 char buf[MQTT_MAX_PAYLOAD_SIZE];
mapellil 14:641560b57584 431
fishzhang 25:d7f1e43736cf 432 acc_gyro->get_x_axes(axes);
fishzhang 25:d7f1e43736cf 433 sprintf(buf,"%0.4d",axes[0]);
fishzhang 25:d7f1e43736cf 434 message.qos = MQTT::QOS0;
fishzhang 25:d7f1e43736cf 435 message.retained = false;
fishzhang 25:d7f1e43736cf 436 message.dup = false;
fishzhang 25:d7f1e43736cf 437 message.payload = (void*)buf;
fishzhang 25:d7f1e43736cf 438 message.payloadlen = strlen(buf);
fishzhang 25:d7f1e43736cf 439 printf("Publishing %s\n\r", buf);
fishzhang 25:d7f1e43736cf 440 return client->publish(pubTopic, message);
fishzhang 25:d7f1e43736cf 441 }
fishzhang 25:d7f1e43736cf 442 int publish11(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
fishzhang 25:d7f1e43736cf 443 {
fishzhang 25:d7f1e43736cf 444 int32_t axes[3];
fishzhang 25:d7f1e43736cf 445 MQTT::Message message;
fishzhang 25:d7f1e43736cf 446 char* pubTopic = TOPICT_by;
fishzhang 25:d7f1e43736cf 447
fishzhang 25:d7f1e43736cf 448 char buf[MQTT_MAX_PAYLOAD_SIZE];
fishzhang 25:d7f1e43736cf 449
fishzhang 25:d7f1e43736cf 450 acc_gyro->get_x_axes(axes);
fishzhang 25:d7f1e43736cf 451 sprintf(buf,"%0.4d",axes[1]);
fishzhang 25:d7f1e43736cf 452 message.qos = MQTT::QOS0;
fishzhang 25:d7f1e43736cf 453 message.retained = false;
fishzhang 25:d7f1e43736cf 454 message.dup = false;
fishzhang 25:d7f1e43736cf 455 message.payload = (void*)buf;
fishzhang 25:d7f1e43736cf 456 message.payloadlen = strlen(buf);
fishzhang 25:d7f1e43736cf 457 printf("Publishing %s\n\r", buf);
fishzhang 25:d7f1e43736cf 458 return client->publish(pubTopic, message);
fishzhang 25:d7f1e43736cf 459 }
fishzhang 25:d7f1e43736cf 460 int publish12(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
fishzhang 25:d7f1e43736cf 461 {
fishzhang 25:d7f1e43736cf 462 int32_t axes[3];
fishzhang 25:d7f1e43736cf 463 MQTT::Message message;
fishzhang 25:d7f1e43736cf 464 char* pubTopic = TOPICT_bz;
fishzhang 25:d7f1e43736cf 465
fishzhang 25:d7f1e43736cf 466 char buf[MQTT_MAX_PAYLOAD_SIZE];
fishzhang 25:d7f1e43736cf 467
fishzhang 25:d7f1e43736cf 468 acc_gyro->get_x_axes(axes);
fishzhang 25:d7f1e43736cf 469 sprintf(buf,"%0.4d",axes[2]);
fishzhang 25:d7f1e43736cf 470 message.qos = MQTT::QOS0;
fishzhang 25:d7f1e43736cf 471 message.retained = false;
fishzhang 25:d7f1e43736cf 472 message.dup = false;
fishzhang 25:d7f1e43736cf 473 message.payload = (void*)buf;
fishzhang 25:d7f1e43736cf 474 message.payloadlen = strlen(buf);
mapellil 24:a59eb8bdc431 475 printf("Publishing %s\n\r", buf);
mapellil 14:641560b57584 476 return client->publish(pubTopic, message);
mapellil 14:641560b57584 477 }
mridup 4:1ed7f173eec5 478
fishzhang 25:d7f1e43736cf 479
fabiombed 13:0b31131bf711 480 int main()
fabiombed 13:0b31131bf711 481 {
fishzhang 25:d7f1e43736cf 482
mapellil 16:233b89a6b72f 483 const char * ssid = SSID; // Network must be visible otherwise it can't connect
mapellil 16:233b89a6b72f 484 const char * seckey = PASSW;
mapellil 24:a59eb8bdc431 485 SpwfSAInterface spwf(D8, D2, false);
mapellil 14:641560b57584 486 DevI2C *i2c = new DevI2C(I2C_SDA, I2C_SCL);
mapellil 14:641560b57584 487 i2c->frequency(400000);
mapellil 14:641560b57584 488
fishzhang 25:d7f1e43736cf 489
fishzhang 25:d7f1e43736cf 490
mridup 4:1ed7f173eec5 491
mridup 6:0d838d564181 492 pc.printf("\r\nX-NUCLEO-IDW01M1 mbed Application\r\n");
mapellil 14:641560b57584 493 pc.printf("\r\nconnecting to AP\r\n");
fishzhang 25:d7f1e43736cf 494
fishzhang 25:d7f1e43736cf 495 hum_temp->enable();
fishzhang 25:d7f1e43736cf 496 press_temp->enable();
fishzhang 25:d7f1e43736cf 497 magnetometer->enable();
fishzhang 25:d7f1e43736cf 498 accelerometer->enable();
fishzhang 25:d7f1e43736cf 499 acc_gyro->enable_x();
fishzhang 25:d7f1e43736cf 500 acc_gyro->enable_g();
fabiombed 13:0b31131bf711 501
mapellil 17:83d0cd810ed3 502 quickstartMode=false;
mapellil 16:233b89a6b72f 503 if (strcmp(org, "quickstart") == 0){quickstartMode = true;}
mapellil 16:233b89a6b72f 504 MQTTWiFi ipstack(spwf, ssid, seckey, NSAPI_SECURITY_WPA2);
mapellil 16:233b89a6b72f 505 MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
mapellil 16:233b89a6b72f 506 if (quickstartMode){
mapellil 24:a59eb8bdc431 507 char mac[50]; // remove all : from mac
mapellil 17:83d0cd810ed3 508 char *digit=NULL;
mapellil 17:83d0cd810ed3 509 sprintf (id,"%s", "");
mapellil 14:641560b57584 510 sprintf (mac,"%s",ipstack.getWiFi().get_mac_address());
mapellil 14:641560b57584 511 digit = strtok (mac,":");
mapellil 14:641560b57584 512 while (digit != NULL)
mapellil 14:641560b57584 513 {
mapellil 14:641560b57584 514 strcat (id, digit);
mapellil 14:641560b57584 515 digit = strtok (NULL, ":");
mapellil 24:a59eb8bdc431 516 }
mapellil 16:233b89a6b72f 517 }
mapellil 16:233b89a6b72f 518 attemptConnect(&client, &ipstack);
mapellil 16:233b89a6b72f 519 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD)
mapellil 16:233b89a6b72f 520 {
mapellil 16:233b89a6b72f 521 while (true)
mapellil 16:233b89a6b72f 522 wait(1.0); // Permanent failures - don't retry
fishzhang 25:d7f1e43736cf 523 }
fishzhang 25:d7f1e43736cf 524 WatchDog wdg(IWDG_PRESCALER_64, 62500);
mapellil 16:233b89a6b72f 525 int count = 0;
mapellil 16:233b89a6b72f 526 // tyeld.start();
mapellil 14:641560b57584 527 while (true)
fishzhang 25:d7f1e43736cf 528 {
fishzhang 25:d7f1e43736cf 529 wdg.feed();
fishzhang 25:d7f1e43736cf 530 if (++count == 100)
fishzhang 25:d7f1e43736cf 531 {
fishzhang 25:d7f1e43736cf 532 if(subscribe(&client, &ipstack)>30){
fishzhang 25:d7f1e43736cf 533 printf("ok \n\r");
fishzhang 25:d7f1e43736cf 534 }
fishzhang 25:d7f1e43736cf 535 publish2(&client, &ipstack);
fishzhang 25:d7f1e43736cf 536 publish3(&client, &ipstack);
fishzhang 25:d7f1e43736cf 537 publish4(&client, &ipstack);
fishzhang 25:d7f1e43736cf 538 publish5(&client, &ipstack);
fishzhang 25:d7f1e43736cf 539 publish5(&client, &ipstack);
fishzhang 25:d7f1e43736cf 540 publish7(&client, &ipstack);
fishzhang 25:d7f1e43736cf 541 publish8(&client, &ipstack);
fishzhang 25:d7f1e43736cf 542 publish9(&client, &ipstack);
fishzhang 25:d7f1e43736cf 543 publish10(&client, &ipstack);
fishzhang 25:d7f1e43736cf 544 publish11(&client, &ipstack);
fishzhang 25:d7f1e43736cf 545 publish12(&client, &ipstack);
fishzhang 25:d7f1e43736cf 546 if (publish(&client, &ipstack) != 0) {
fishzhang 25:d7f1e43736cf 547 attemptConnect(&client, &ipstack); // if we have lost the connection
fishzhang 25:d7f1e43736cf 548 }
fishzhang 25:d7f1e43736cf 549 count = 0;
mapellil 14:641560b57584 550 }
fishzhang 25:d7f1e43736cf 551 client.yield(10);
fishzhang 25:d7f1e43736cf 552 }
mridup 4:1ed7f173eec5 553 }