Published project at https://os.mbed.com/users/vlasov01/code/Watson-IoT-MQTT-WiFi-MEMS/

Dependencies:   Watson-IoT-MQTT-WiFi-MEMS NDefLib NetworkSocketAPI X_NUCLEO_IDW01M1v2 X_NUCLEO_IKS01A2 mbed

Committer:
vlasov01
Date:
Tue Nov 07 00:36:16 2017 +0000
Revision:
1:cc2d7fc65713
Parent:
0:a17fde465867
published project as public

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vlasov01 0:a17fde465867 1 /* SpwfInterface NetworkSocketAPI Example Program
vlasov01 0:a17fde465867 2 * Copyright (c) 2015 ARM Limited
vlasov01 0:a17fde465867 3 *
vlasov01 0:a17fde465867 4 * Licensed under the Apache License, Version 2.0 (the "License");
vlasov01 0:a17fde465867 5 * you may not use this file except in compliance with the License.
vlasov01 0:a17fde465867 6 * You may obtain a copy of the License at
vlasov01 0:a17fde465867 7 *
vlasov01 0:a17fde465867 8 * http://www.apache.org/licenses/LICENSE-2.0
vlasov01 0:a17fde465867 9 *
vlasov01 0:a17fde465867 10 * Unless required by applicable law or agreed to in writing, software
vlasov01 0:a17fde465867 11 * distributed under the License is distributed on an "AS IS" BASIS,
vlasov01 0:a17fde465867 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
vlasov01 0:a17fde465867 13 * See the License for the specific language governing permissions and
vlasov01 0:a17fde465867 14 * limitations under the License.
vlasov01 0:a17fde465867 15 */
vlasov01 0:a17fde465867 16
vlasov01 0:a17fde465867 17 #include "mbed.h"
vlasov01 0:a17fde465867 18 #include "SpwfInterface.h"
vlasov01 0:a17fde465867 19 #include "TCPSocket.h"
vlasov01 0:a17fde465867 20 #include "MQTTClient.h"
vlasov01 0:a17fde465867 21 #include "MQTTWiFi.h"
vlasov01 0:a17fde465867 22 #include <ctype.h>
vlasov01 0:a17fde465867 23 #include "XNucleoIKS01A2.h"
vlasov01 0:a17fde465867 24 //#include "x_nucleo_iks01a1.h"
vlasov01 0:a17fde465867 25 //#include "X_NUCLEO_NFC01A1.h"
vlasov01 0:a17fde465867 26 #include "NDefLib/NDefNfcTag.h"
vlasov01 0:a17fde465867 27 #include "NDefLib/RecordType/RecordURI.h"
vlasov01 0:a17fde465867 28
vlasov01 0:a17fde465867 29 //------------------------------------
vlasov01 0:a17fde465867 30 // Hyperterminal configuration
vlasov01 0:a17fde465867 31 // 9600 bauds, 8-bit data, no parity
vlasov01 0:a17fde465867 32 //------------------------------------
vlasov01 0:a17fde465867 33 Serial pc(SERIAL_TX, SERIAL_RX);
vlasov01 0:a17fde465867 34 DigitalOut myled(LED1);
vlasov01 0:a17fde465867 35 bool quickstartMode = true;
vlasov01 0:a17fde465867 36
vlasov01 0:a17fde465867 37 #define ORG_QUICKSTART // comment to connect to play.internetofthings.ibmcloud.com
vlasov01 0:a17fde465867 38 //#define SUBSCRIBE // uncomment to subscribe to broker msgs (not to be used with IBM broker)
vlasov01 0:a17fde465867 39 //#define X_NUCLEO_NFC01A1_PRESENT // uncomment to add NFC support
vlasov01 0:a17fde465867 40
vlasov01 0:a17fde465867 41 #define MQTT_MAX_PACKET_SIZE 250
vlasov01 0:a17fde465867 42 #define MQTT_MAX_PAYLOAD_SIZE 300
vlasov01 0:a17fde465867 43
vlasov01 0:a17fde465867 44 // Configuration values needed to connect to IBM IoT Cloud
vlasov01 0:a17fde465867 45 #define BROKER_URL ".messaging.internetofthings.ibmcloud.com";
vlasov01 0:a17fde465867 46 #ifdef ORG_QUICKSTART
vlasov01 0:a17fde465867 47 #define ORG "quickstart" // connect to quickstart.internetofthings.ibmcloud.com/ For a registered connection, replace with your org
vlasov01 0:a17fde465867 48 #define ID ""
vlasov01 0:a17fde465867 49 #define AUTH_TOKEN ""
vlasov01 0:a17fde465867 50 #define DEFAULT_TYPE_NAME "iotsample-mbed-Nucleo"
vlasov01 0:a17fde465867 51 #else // not def ORG_QUICKSTART
vlasov01 0:a17fde465867 52 #define ORG "play" // connect to play.internetofthings.ibmcloud.com/ For a registered connection, replace with your org
vlasov01 0:a17fde465867 53 #define ID "" // For a registered connection, replace with your id
vlasov01 0:a17fde465867 54 #define AUTH_TOKEN ""// For a registered connection, replace with your auth-token
vlasov01 0:a17fde465867 55 #define DEFAULT_TYPE_NAME "sensor"
vlasov01 0:a17fde465867 56 #endif
vlasov01 0:a17fde465867 57 #define TOPIC "iot-2/evt/status/fmt/json"
vlasov01 0:a17fde465867 58
vlasov01 0:a17fde465867 59 #define TYPE DEFAULT_TYPE_NAME // For a registered connection, replace with your type
vlasov01 0:a17fde465867 60 #define MQTT_PORT 1883
vlasov01 0:a17fde465867 61 #define MQTT_TLS_PORT 8883
vlasov01 0:a17fde465867 62 #define IBM_IOT_PORT MQTT_PORT
vlasov01 0:a17fde465867 63 // WiFi network credential
vlasov01 0:a17fde465867 64 #define SSID "" // Network must be visible otherwise it can't connect
vlasov01 0:a17fde465867 65 #define PASSW ""
vlasov01 0:a17fde465867 66 #warning "Wifi SSID & password empty"
vlasov01 0:a17fde465867 67
vlasov01 0:a17fde465867 68 char id[30] = ID; // mac without colons
vlasov01 0:a17fde465867 69 char org[12] = ORG;
vlasov01 0:a17fde465867 70 int connack_rc = 0; // MQTT connack return code
vlasov01 0:a17fde465867 71 const char* ip_addr = "";
vlasov01 0:a17fde465867 72 char* host_addr = "";
vlasov01 0:a17fde465867 73 char type[30] = TYPE;
vlasov01 0:a17fde465867 74 char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode
vlasov01 0:a17fde465867 75 bool netConnecting = false;
vlasov01 0:a17fde465867 76 int connectTimeout = 1000;
vlasov01 0:a17fde465867 77 bool mqttConnecting = false;
vlasov01 0:a17fde465867 78 bool netConnected = false;
vlasov01 0:a17fde465867 79 bool connected = false;
vlasov01 0:a17fde465867 80 int retryAttempt = 0;
vlasov01 0:a17fde465867 81 char subscription_url[MQTT_MAX_PAYLOAD_SIZE];
vlasov01 0:a17fde465867 82 /*
vlasov01 0:a17fde465867 83 PressureSensor *pressure_sensor;
vlasov01 0:a17fde465867 84 HumiditySensor *humidity_sensor;
vlasov01 0:a17fde465867 85 TempSensor *temp_sensor1;
vlasov01 0:a17fde465867 86 */
vlasov01 0:a17fde465867 87
vlasov01 0:a17fde465867 88 /* Instantiate the expansion board */
vlasov01 0:a17fde465867 89 static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
vlasov01 0:a17fde465867 90
vlasov01 0:a17fde465867 91 /* Retrieve the composing elements of the expansion board */
vlasov01 0:a17fde465867 92 static LSM303AGRMagSensor *magnetometer = mems_expansion_board->magnetometer;
vlasov01 0:a17fde465867 93 static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
vlasov01 0:a17fde465867 94 static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor;
vlasov01 0:a17fde465867 95 static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
vlasov01 0:a17fde465867 96 static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
vlasov01 0:a17fde465867 97
vlasov01 0:a17fde465867 98 InterruptIn mybutton(USER_BUTTON);
vlasov01 0:a17fde465867 99
vlasov01 0:a17fde465867 100 volatile int mems_event = 0;
vlasov01 0:a17fde465867 101 volatile int toggle_hw_event_enable = 0;
vlasov01 0:a17fde465867 102 static int hw_event_is_enabled = 1;
vlasov01 0:a17fde465867 103 uint16_t step_count = 0;
vlasov01 0:a17fde465867 104
vlasov01 0:a17fde465867 105 /* User button callback. */
vlasov01 0:a17fde465867 106 void pressed_cb() {
vlasov01 0:a17fde465867 107 toggle_hw_event_enable = 1;
vlasov01 0:a17fde465867 108 }
vlasov01 0:a17fde465867 109
vlasov01 0:a17fde465867 110 /* Interrupt 1 callback. */
vlasov01 0:a17fde465867 111 void int1_cb() {
vlasov01 0:a17fde465867 112 mems_event = 1;
vlasov01 0:a17fde465867 113 }
vlasov01 0:a17fde465867 114
vlasov01 0:a17fde465867 115 /* Interrupt 2 callback. */
vlasov01 0:a17fde465867 116 void int2_cb() {
vlasov01 0:a17fde465867 117 mems_event = 1;
vlasov01 0:a17fde465867 118 }
vlasov01 0:a17fde465867 119
vlasov01 0:a17fde465867 120 /* Print the orientation. */
vlasov01 0:a17fde465867 121 void send_orientation() {
vlasov01 0:a17fde465867 122 uint8_t xl = 0;
vlasov01 0:a17fde465867 123 uint8_t xh = 0;
vlasov01 0:a17fde465867 124 uint8_t yl = 0;
vlasov01 0:a17fde465867 125 uint8_t yh = 0;
vlasov01 0:a17fde465867 126 uint8_t zl = 0;
vlasov01 0:a17fde465867 127 uint8_t zh = 0;
vlasov01 0:a17fde465867 128
vlasov01 0:a17fde465867 129 acc_gyro->get_6d_orientation_xl(&xl);
vlasov01 0:a17fde465867 130 acc_gyro->get_6d_orientation_xh(&xh);
vlasov01 0:a17fde465867 131 acc_gyro->get_6d_orientation_yl(&yl);
vlasov01 0:a17fde465867 132 acc_gyro->get_6d_orientation_yh(&yh);
vlasov01 0:a17fde465867 133 acc_gyro->get_6d_orientation_zl(&zl);
vlasov01 0:a17fde465867 134 acc_gyro->get_6d_orientation_zh(&zh);
vlasov01 0:a17fde465867 135
vlasov01 0:a17fde465867 136 if ( xl == 0 && yl == 0 && zl == 0 && xh == 0 && yh == 1 && zh == 0 ) {
vlasov01 0:a17fde465867 137 printf( "\r\n ________________ " \
vlasov01 0:a17fde465867 138 "\r\n | | " \
vlasov01 0:a17fde465867 139 "\r\n | * | " \
vlasov01 0:a17fde465867 140 "\r\n | | " \
vlasov01 0:a17fde465867 141 "\r\n | | " \
vlasov01 0:a17fde465867 142 "\r\n | | " \
vlasov01 0:a17fde465867 143 "\r\n | | " \
vlasov01 0:a17fde465867 144 "\r\n |________________| \r\n" );
vlasov01 0:a17fde465867 145 }
vlasov01 0:a17fde465867 146
vlasov01 0:a17fde465867 147 else if ( xl == 1 && yl == 0 && zl == 0 && xh == 0 && yh == 0 && zh == 0 ) {
vlasov01 0:a17fde465867 148 printf( "\r\n ________________ " \
vlasov01 0:a17fde465867 149 "\r\n | | " \
vlasov01 0:a17fde465867 150 "\r\n | * | " \
vlasov01 0:a17fde465867 151 "\r\n | | " \
vlasov01 0:a17fde465867 152 "\r\n | | " \
vlasov01 0:a17fde465867 153 "\r\n | | " \
vlasov01 0:a17fde465867 154 "\r\n | | " \
vlasov01 0:a17fde465867 155 "\r\n |________________| \r\n" );
vlasov01 0:a17fde465867 156 }
vlasov01 0:a17fde465867 157
vlasov01 0:a17fde465867 158 else if ( xl == 0 && yl == 0 && zl == 0 && xh == 1 && yh == 0 && zh == 0 ) {
vlasov01 0:a17fde465867 159 printf( "\r\n ________________ " \
vlasov01 0:a17fde465867 160 "\r\n | | " \
vlasov01 0:a17fde465867 161 "\r\n | | " \
vlasov01 0:a17fde465867 162 "\r\n | | " \
vlasov01 0:a17fde465867 163 "\r\n | | " \
vlasov01 0:a17fde465867 164 "\r\n | | " \
vlasov01 0:a17fde465867 165 "\r\n | * | " \
vlasov01 0:a17fde465867 166 "\r\n |________________| \r\n" );
vlasov01 0:a17fde465867 167 }
vlasov01 0:a17fde465867 168
vlasov01 0:a17fde465867 169 else if ( xl == 0 && yl == 1 && zl == 0 && xh == 0 && yh == 0 && zh == 0 ) {
vlasov01 0:a17fde465867 170 printf( "\r\n ________________ " \
vlasov01 0:a17fde465867 171 "\r\n | | " \
vlasov01 0:a17fde465867 172 "\r\n | | " \
vlasov01 0:a17fde465867 173 "\r\n | | " \
vlasov01 0:a17fde465867 174 "\r\n | | " \
vlasov01 0:a17fde465867 175 "\r\n | | " \
vlasov01 0:a17fde465867 176 "\r\n | * | " \
vlasov01 0:a17fde465867 177 "\r\n |________________| \r\n" );
vlasov01 0:a17fde465867 178 }
vlasov01 0:a17fde465867 179
vlasov01 0:a17fde465867 180 else if ( xl == 0 && yl == 0 && zl == 0 && xh == 0 && yh == 0 && zh == 1 ) {
vlasov01 0:a17fde465867 181 printf( "\r\n __*_____________ " \
vlasov01 0:a17fde465867 182 "\r\n |________________| \r\n" );
vlasov01 0:a17fde465867 183 }
vlasov01 0:a17fde465867 184
vlasov01 0:a17fde465867 185 else if ( xl == 0 && yl == 0 && zl == 1 && xh == 0 && yh == 0 && zh == 0 ) {
vlasov01 0:a17fde465867 186 printf( "\r\n ________________ " \
vlasov01 0:a17fde465867 187 "\r\n |________________| " \
vlasov01 0:a17fde465867 188 "\r\n * \r\n" );
vlasov01 0:a17fde465867 189 }
vlasov01 0:a17fde465867 190
vlasov01 0:a17fde465867 191 else {
vlasov01 0:a17fde465867 192 printf( "None of the 6D orientation axes is set in LSM6DSL - accelerometer.\r\n" );
vlasov01 0:a17fde465867 193 }
vlasov01 0:a17fde465867 194 }
vlasov01 0:a17fde465867 195
vlasov01 0:a17fde465867 196
vlasov01 0:a17fde465867 197 MQTT::Message message;
vlasov01 0:a17fde465867 198 MQTTString TopicName={TOPIC};
vlasov01 0:a17fde465867 199 MQTT::MessageData MsgData(TopicName, message);
vlasov01 0:a17fde465867 200
vlasov01 0:a17fde465867 201 void subscribe_cb(MQTT::MessageData & msgMQTT) {
vlasov01 0:a17fde465867 202 char msg[MQTT_MAX_PAYLOAD_SIZE];
vlasov01 0:a17fde465867 203 msg[0]='\0';
vlasov01 0:a17fde465867 204 strncat (msg, (char*)msgMQTT.message.payload, msgMQTT.message.payloadlen);
vlasov01 0:a17fde465867 205 printf ("--->>> subscribe_cb msg: %s\n\r", msg);
vlasov01 0:a17fde465867 206 }
vlasov01 0:a17fde465867 207
vlasov01 0:a17fde465867 208 int subscribe(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
vlasov01 0:a17fde465867 209 {
vlasov01 0:a17fde465867 210 char* pubTopic = TOPIC;
vlasov01 0:a17fde465867 211 return client->subscribe(pubTopic, MQTT::QOS1, subscribe_cb);
vlasov01 0:a17fde465867 212 }
vlasov01 0:a17fde465867 213
vlasov01 0:a17fde465867 214 int connect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
vlasov01 0:a17fde465867 215 {
vlasov01 0:a17fde465867 216 const char* iot_ibm = BROKER_URL;
vlasov01 0:a17fde465867 217
vlasov01 0:a17fde465867 218
vlasov01 0:a17fde465867 219 char hostname[strlen(org) + strlen(iot_ibm) + 1];
vlasov01 0:a17fde465867 220 sprintf(hostname, "%s%s", org, iot_ibm);
vlasov01 0:a17fde465867 221 SpwfSAInterface& WiFi = ipstack->getWiFi();
vlasov01 0:a17fde465867 222 // ip_addr = WiFi.get_ip_address();
vlasov01 0:a17fde465867 223 // Construct clientId - d:org:type:id
vlasov01 0:a17fde465867 224 char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
vlasov01 0:a17fde465867 225 sprintf(clientId, "d:%s:%s:%s", org, type, id);
vlasov01 0:a17fde465867 226 sprintf(subscription_url, "%s.%s/#/device/%s/sensor/", org, "internetofthings.ibmcloud.com",id);
vlasov01 0:a17fde465867 227
vlasov01 0:a17fde465867 228 // Network debug statements
vlasov01 0:a17fde465867 229 LOG("=====================================\n\r");
vlasov01 0:a17fde465867 230 LOG("Connecting WiFi.\n\r");
vlasov01 0:a17fde465867 231 LOG("Nucleo IP ADDRESS: %s\n\r", WiFi.get_ip_address());
vlasov01 0:a17fde465867 232 LOG("Nucleo MAC ADDRESS: %s\n\r", WiFi.get_mac_address());
vlasov01 0:a17fde465867 233 LOG("Server Hostname: %s port: %d\n\r", hostname, IBM_IOT_PORT);
vlasov01 0:a17fde465867 234 // for(int i = 0; clientId[i]; i++){ // set lowercase mac
vlasov01 0:a17fde465867 235 // clientId[i] = tolower(clientId[i]);
vlasov01 0:a17fde465867 236 // }
vlasov01 0:a17fde465867 237 LOG("Client ID: %s\n\r", clientId);
vlasov01 0:a17fde465867 238 LOG("Topic: %s\n\r",TOPIC);
vlasov01 0:a17fde465867 239 LOG("Subscription URL: %s\n\r", subscription_url);
vlasov01 0:a17fde465867 240 LOG("=====================================\n\r");
vlasov01 0:a17fde465867 241
vlasov01 0:a17fde465867 242 netConnecting = true;
vlasov01 0:a17fde465867 243 ipstack->open(&ipstack->getWiFi());
vlasov01 0:a17fde465867 244 int rc = ipstack->connect(hostname, IBM_IOT_PORT, connectTimeout);
vlasov01 0:a17fde465867 245 if (rc != 0)
vlasov01 0:a17fde465867 246 {
vlasov01 0:a17fde465867 247 WARN("IP Stack connect returned: %d\n", rc);
vlasov01 0:a17fde465867 248 return rc;
vlasov01 0:a17fde465867 249 }
vlasov01 0:a17fde465867 250 printf ("--->TCP Connected\n\r");
vlasov01 0:a17fde465867 251 netConnected = true;
vlasov01 0:a17fde465867 252 netConnecting = false;
vlasov01 0:a17fde465867 253
vlasov01 0:a17fde465867 254 // MQTT Connect
vlasov01 0:a17fde465867 255 mqttConnecting = true;
vlasov01 0:a17fde465867 256 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
vlasov01 0:a17fde465867 257 data.MQTTVersion = 4;
vlasov01 0:a17fde465867 258 data.struct_version=0;
vlasov01 0:a17fde465867 259 data.clientID.cstring = clientId;
vlasov01 0:a17fde465867 260
vlasov01 0:a17fde465867 261 if (!quickstartMode)
vlasov01 0:a17fde465867 262 {
vlasov01 0:a17fde465867 263 data.username.cstring = "use-token-auth";
vlasov01 0:a17fde465867 264 data.password.cstring = auth_token;
vlasov01 0:a17fde465867 265 }
vlasov01 0:a17fde465867 266 if ((rc = client->connect(data)) == 0)
vlasov01 0:a17fde465867 267 {
vlasov01 0:a17fde465867 268 connected = true;
vlasov01 0:a17fde465867 269 printf ("--->MQTT Connected\n\r");
vlasov01 0:a17fde465867 270 #ifdef SUBSCRIBE
vlasov01 0:a17fde465867 271 if (!subscribe(client, ipstack)) printf ("--->>>MQTT subscribed to: %s\n\r",TOPIC);
vlasov01 0:a17fde465867 272 #endif
vlasov01 0:a17fde465867 273 }
vlasov01 0:a17fde465867 274 else {
vlasov01 0:a17fde465867 275 WARN("MQTT connect returned %d\n", rc);
vlasov01 0:a17fde465867 276 }
vlasov01 0:a17fde465867 277 if (rc >= 0)
vlasov01 0:a17fde465867 278 connack_rc = rc;
vlasov01 0:a17fde465867 279 mqttConnecting = false;
vlasov01 0:a17fde465867 280 return rc;
vlasov01 0:a17fde465867 281 }
vlasov01 0:a17fde465867 282
vlasov01 0:a17fde465867 283 int getConnTimeout(int attemptNumber)
vlasov01 0:a17fde465867 284 { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
vlasov01 0:a17fde465867 285 // after 20 attempts, retry every 10 minutes
vlasov01 0:a17fde465867 286 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
vlasov01 0:a17fde465867 287 }
vlasov01 0:a17fde465867 288
vlasov01 0:a17fde465867 289 void attemptConnect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
vlasov01 0:a17fde465867 290 {
vlasov01 0:a17fde465867 291 connected = false;
vlasov01 0:a17fde465867 292
vlasov01 0:a17fde465867 293 while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED)
vlasov01 0:a17fde465867 294 {
vlasov01 0:a17fde465867 295 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
vlasov01 0:a17fde465867 296 printf ("File: %s, Line: %d Error: %d\n\r",__FILE__,__LINE__, connack_rc);
vlasov01 0:a17fde465867 297 return; // don't reattempt to connect if credentials are wrong
vlasov01 0:a17fde465867 298 }
vlasov01 0:a17fde465867 299 int timeout = getConnTimeout(++retryAttempt);
vlasov01 0:a17fde465867 300 WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
vlasov01 0:a17fde465867 301
vlasov01 0:a17fde465867 302 // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
vlasov01 0:a17fde465867 303 // or maybe just add the proper members to do this disconnect and call attemptConnect(...)
vlasov01 0:a17fde465867 304 // this works - reset the system when the retry count gets to a threshold
vlasov01 0:a17fde465867 305 if (retryAttempt == 5)
vlasov01 0:a17fde465867 306 NVIC_SystemReset();
vlasov01 0:a17fde465867 307 else
vlasov01 0:a17fde465867 308 wait(timeout);
vlasov01 0:a17fde465867 309 }
vlasov01 0:a17fde465867 310 }
vlasov01 0:a17fde465867 311
vlasov01 0:a17fde465867 312 int publish(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
vlasov01 0:a17fde465867 313 {
vlasov01 0:a17fde465867 314 MQTT::Message message;
vlasov01 0:a17fde465867 315 char* pubTopic = TOPIC;
vlasov01 0:a17fde465867 316
vlasov01 0:a17fde465867 317 char buf[MQTT_MAX_PAYLOAD_SIZE];
vlasov01 0:a17fde465867 318 float temp, press, hum;
vlasov01 0:a17fde465867 319
vlasov01 0:a17fde465867 320 LSM6DSL_Event_Status_t status;
vlasov01 0:a17fde465867 321 if (mems_event) {
vlasov01 0:a17fde465867 322 mems_event = 0;
vlasov01 0:a17fde465867 323 acc_gyro->get_event_status(&status);
vlasov01 0:a17fde465867 324 if (status.StepStatus) {
vlasov01 0:a17fde465867 325 /* New step detected, so print the step counter */
vlasov01 0:a17fde465867 326 acc_gyro->get_step_counter(&step_count);
vlasov01 0:a17fde465867 327 printf("Step counter: %d\r\n", step_count);
vlasov01 0:a17fde465867 328 }
vlasov01 0:a17fde465867 329
vlasov01 0:a17fde465867 330 if (status.FreeFallStatus) {
vlasov01 0:a17fde465867 331 /* Output data. */
vlasov01 0:a17fde465867 332 printf("Free Fall Detected!\r\n");
vlasov01 0:a17fde465867 333 }
vlasov01 0:a17fde465867 334
vlasov01 0:a17fde465867 335 if (status.TapStatus) {
vlasov01 0:a17fde465867 336 /* Output data. */
vlasov01 0:a17fde465867 337 printf("Single Tap Detected!\r\n");
vlasov01 0:a17fde465867 338 }
vlasov01 0:a17fde465867 339
vlasov01 0:a17fde465867 340 if (status.DoubleTapStatus) {
vlasov01 0:a17fde465867 341 /* Output data. */
vlasov01 0:a17fde465867 342 printf("Double Tap Detected!\r\n");
vlasov01 0:a17fde465867 343 }
vlasov01 0:a17fde465867 344
vlasov01 0:a17fde465867 345 if (status.D6DOrientationStatus) {
vlasov01 0:a17fde465867 346 /* Send 6D Orientation */
vlasov01 0:a17fde465867 347 send_orientation();
vlasov01 0:a17fde465867 348 }
vlasov01 0:a17fde465867 349
vlasov01 0:a17fde465867 350 if (status.TiltStatus) {
vlasov01 0:a17fde465867 351 /* Output data. */
vlasov01 0:a17fde465867 352 printf("Tilt Detected!\r\n");
vlasov01 0:a17fde465867 353 }
vlasov01 0:a17fde465867 354
vlasov01 0:a17fde465867 355 if (status.WakeUpStatus) {
vlasov01 0:a17fde465867 356 /* Output data. */
vlasov01 0:a17fde465867 357 printf("Wake Up Detected!\r\n");
vlasov01 0:a17fde465867 358 }
vlasov01 0:a17fde465867 359 }
vlasov01 0:a17fde465867 360
vlasov01 0:a17fde465867 361 if (toggle_hw_event_enable) {
vlasov01 0:a17fde465867 362 toggle_hw_event_enable = 0;
vlasov01 0:a17fde465867 363 if (hw_event_is_enabled == 0) {
vlasov01 0:a17fde465867 364 /* Enable HW events. */
vlasov01 0:a17fde465867 365 acc_gyro->enable_pedometer();
vlasov01 0:a17fde465867 366 acc_gyro->enable_tilt_detection();
vlasov01 0:a17fde465867 367 acc_gyro->enable_free_fall_detection();
vlasov01 0:a17fde465867 368 acc_gyro->enable_single_tap_detection();
vlasov01 0:a17fde465867 369 acc_gyro->enable_double_tap_detection();
vlasov01 0:a17fde465867 370 acc_gyro->enable_6d_orientation();
vlasov01 0:a17fde465867 371 acc_gyro->enable_wake_up_detection();
vlasov01 0:a17fde465867 372 hw_event_is_enabled = 1;
vlasov01 0:a17fde465867 373 } else {
vlasov01 0:a17fde465867 374 acc_gyro->disable_pedometer();
vlasov01 0:a17fde465867 375 acc_gyro->disable_tilt_detection();
vlasov01 0:a17fde465867 376 acc_gyro->disable_free_fall_detection();
vlasov01 0:a17fde465867 377 acc_gyro->disable_single_tap_detection();
vlasov01 0:a17fde465867 378 acc_gyro->disable_double_tap_detection();
vlasov01 0:a17fde465867 379 acc_gyro->disable_6d_orientation();
vlasov01 0:a17fde465867 380 acc_gyro->disable_wake_up_detection();
vlasov01 0:a17fde465867 381 hw_event_is_enabled = 0;
vlasov01 0:a17fde465867 382 }
vlasov01 0:a17fde465867 383 }
vlasov01 0:a17fde465867 384
vlasov01 0:a17fde465867 385 hum_temp->get_temperature(&temp);
vlasov01 0:a17fde465867 386 //press_temp->get_temperature(&temp);
vlasov01 0:a17fde465867 387 hum_temp->get_humidity(&hum);
vlasov01 0:a17fde465867 388 press_temp->get_pressure(&press);
vlasov01 0:a17fde465867 389
vlasov01 0:a17fde465867 390 sprintf(buf,
vlasov01 0:a17fde465867 391 "{\"d\":{\"ST\":\"Nucleo-IoT-mbed\",\"Temp\":%0.4f,\"Pressure\":%0.4f,\"Humidity\":%0.4f,\"FreeFall\":%i,\"DoubleTap\":%i,\"TiltStatus\":%i}}",
vlasov01 0:a17fde465867 392 temp, press, hum, status.FreeFallStatus, status.DoubleTapStatus, status.TiltStatus);
vlasov01 0:a17fde465867 393 message.qos = MQTT::QOS0;
vlasov01 0:a17fde465867 394 message.retained = false;
vlasov01 0:a17fde465867 395 message.dup = false;
vlasov01 0:a17fde465867 396 message.payload = (void*)buf;
vlasov01 0:a17fde465867 397 message.payloadlen = strlen(buf);
vlasov01 0:a17fde465867 398
vlasov01 0:a17fde465867 399 // LOG("Publishing %s\n\r", buf);
vlasov01 0:a17fde465867 400 printf("Publishing %s\n\r", buf);
vlasov01 0:a17fde465867 401 return client->publish(pubTopic, message);
vlasov01 0:a17fde465867 402 }
vlasov01 0:a17fde465867 403
vlasov01 0:a17fde465867 404 void initSensors(){
vlasov01 0:a17fde465867 405 // A2 start
vlasov01 0:a17fde465867 406 uint8_t id;
vlasov01 0:a17fde465867 407 //float value1, value2;
vlasov01 0:a17fde465867 408 //char buffer1[32], buffer2[32];
vlasov01 0:a17fde465867 409 //int32_t axes[3];
vlasov01 0:a17fde465867 410
vlasov01 0:a17fde465867 411 /* Enable all sensors */
vlasov01 0:a17fde465867 412 hum_temp->enable();
vlasov01 0:a17fde465867 413 press_temp->enable();
vlasov01 0:a17fde465867 414 magnetometer->enable();
vlasov01 0:a17fde465867 415 accelerometer->enable();
vlasov01 0:a17fde465867 416 acc_gyro->enable_x();
vlasov01 0:a17fde465867 417 acc_gyro->enable_g();
vlasov01 0:a17fde465867 418
vlasov01 0:a17fde465867 419 printf("\r\n--- Starting new run ---\r\n");
vlasov01 0:a17fde465867 420
vlasov01 0:a17fde465867 421 hum_temp->read_id(&id);
vlasov01 0:a17fde465867 422 printf("HTS221 humidity & temperature = 0x%X\r\n", id);
vlasov01 0:a17fde465867 423 press_temp->read_id(&id);
vlasov01 0:a17fde465867 424 printf("LPS22HB pressure & temperature = 0x%X\r\n", id);
vlasov01 0:a17fde465867 425 magnetometer->read_id(&id);
vlasov01 0:a17fde465867 426 printf("LSM303AGR magnetometer = 0x%X\r\n", id);
vlasov01 0:a17fde465867 427 accelerometer->read_id(&id);
vlasov01 0:a17fde465867 428 printf("LSM303AGR accelerometer = 0x%X\r\n", id);
vlasov01 0:a17fde465867 429 acc_gyro->read_id(&id);
vlasov01 0:a17fde465867 430 printf("LSM6DSL accelerometer & gyroscope = 0x%X\r\n", id);
vlasov01 0:a17fde465867 431
vlasov01 0:a17fde465867 432 // A2 end
vlasov01 0:a17fde465867 433 }
vlasov01 0:a17fde465867 434
vlasov01 0:a17fde465867 435
vlasov01 0:a17fde465867 436 int main()
vlasov01 0:a17fde465867 437 {
vlasov01 0:a17fde465867 438 /* Attach callback to User button press */
vlasov01 0:a17fde465867 439 mybutton.fall(&pressed_cb);
vlasov01 0:a17fde465867 440 /* Attach callback to LSM6DSL INT1 */
vlasov01 0:a17fde465867 441 acc_gyro->attach_int1_irq(&int1_cb);
vlasov01 0:a17fde465867 442 /* Attach callback to LSM6DSL INT2 */
vlasov01 0:a17fde465867 443 acc_gyro->attach_int2_irq(&int2_cb);
vlasov01 0:a17fde465867 444
vlasov01 0:a17fde465867 445 /* Enable LSM6DSL accelerometer */
vlasov01 0:a17fde465867 446 acc_gyro->enable_x();
vlasov01 0:a17fde465867 447 /* Enable HW events. */
vlasov01 0:a17fde465867 448 acc_gyro->enable_pedometer();
vlasov01 0:a17fde465867 449 acc_gyro->enable_tilt_detection();
vlasov01 0:a17fde465867 450 acc_gyro->enable_free_fall_detection();
vlasov01 0:a17fde465867 451 acc_gyro->enable_single_tap_detection();
vlasov01 0:a17fde465867 452 acc_gyro->enable_double_tap_detection();
vlasov01 0:a17fde465867 453 acc_gyro->enable_6d_orientation();
vlasov01 0:a17fde465867 454 acc_gyro->enable_wake_up_detection();
vlasov01 0:a17fde465867 455
vlasov01 0:a17fde465867 456
vlasov01 0:a17fde465867 457
vlasov01 0:a17fde465867 458 const char * ssid = SSID; // Network must be visible otherwise it can't connect
vlasov01 0:a17fde465867 459 const char * seckey = PASSW;
vlasov01 0:a17fde465867 460 SpwfSAInterface spwf(D8, D2, false);
vlasov01 0:a17fde465867 461
vlasov01 0:a17fde465867 462 // Timer tyeld;
vlasov01 0:a17fde465867 463 myled=0;
vlasov01 0:a17fde465867 464 DevI2C *i2c = new DevI2C(I2C_SDA, I2C_SCL);
vlasov01 0:a17fde465867 465 i2c->frequency(400000);
vlasov01 0:a17fde465867 466
vlasov01 0:a17fde465867 467 //X_NUCLEO_IKS01A2
vlasov01 0:a17fde465867 468 initSensors();
vlasov01 0:a17fde465867 469 /*
vlasov01 0:a17fde465867 470 X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(i2c);
vlasov01 0:a17fde465867 471 pressure_sensor = mems_expansion_board->pt_sensor;
vlasov01 0:a17fde465867 472 temp_sensor1 = mems_expansion_board->ht_sensor;
vlasov01 0:a17fde465867 473 humidity_sensor = mems_expansion_board->ht_sensor;
vlasov01 0:a17fde465867 474 */
vlasov01 0:a17fde465867 475 pc.printf("\r\nX-NUCLEO-IDW01M1 mbed Application\r\n");
vlasov01 0:a17fde465867 476 pc.printf("\r\nconnecting to AP\r\n");
vlasov01 0:a17fde465867 477
vlasov01 0:a17fde465867 478 quickstartMode=false;
vlasov01 0:a17fde465867 479 if (strcmp(org, "quickstart") == 0){quickstartMode = true;}
vlasov01 0:a17fde465867 480 MQTTWiFi ipstack(spwf, ssid, seckey, NSAPI_SECURITY_WPA2);
vlasov01 0:a17fde465867 481 MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
vlasov01 0:a17fde465867 482 if (quickstartMode){
vlasov01 0:a17fde465867 483 char mac[50]; // remove all : from mac
vlasov01 0:a17fde465867 484 char *digit=NULL;
vlasov01 0:a17fde465867 485 sprintf (id,"%s", "");
vlasov01 0:a17fde465867 486 sprintf (mac,"%s",ipstack.getWiFi().get_mac_address());
vlasov01 0:a17fde465867 487 digit = strtok (mac,":");
vlasov01 0:a17fde465867 488 while (digit != NULL)
vlasov01 0:a17fde465867 489 {
vlasov01 0:a17fde465867 490 strcat (id, digit);
vlasov01 0:a17fde465867 491 digit = strtok (NULL, ":");
vlasov01 0:a17fde465867 492 }
vlasov01 0:a17fde465867 493 }
vlasov01 0:a17fde465867 494 attemptConnect(&client, &ipstack);
vlasov01 0:a17fde465867 495 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD)
vlasov01 0:a17fde465867 496 {
vlasov01 0:a17fde465867 497 while (true)
vlasov01 0:a17fde465867 498 wait(1.0); // Permanent failures - don't retry
vlasov01 0:a17fde465867 499 }
vlasov01 0:a17fde465867 500 #ifdef X_NUCLEO_NFC01A1_PRESENT
vlasov01 0:a17fde465867 501 // program NFC with broker URL
vlasov01 0:a17fde465867 502 X_NUCLEO_NFC01A1 *nfcNucleo = X_NUCLEO_NFC01A1::Instance(*i2c, NULL, X_NUCLEO_NFC01A1::DEFAULT_GPO_PIN, X_NUCLEO_NFC01A1::DEFAULT_RF_DISABLE_PIN, NC,NC,NC);
vlasov01 0:a17fde465867 503 NDefLib::NDefNfcTag& tag = nfcNucleo->getM24SR().getNDefTag();
vlasov01 0:a17fde465867 504 printf("NFC Init done: !\r\n");
vlasov01 0:a17fde465867 505 //open the i2c session with the nfc chip
vlasov01 0:a17fde465867 506 if(tag.openSession()){
vlasov01 0:a17fde465867 507 //create the NDef message and record
vlasov01 0:a17fde465867 508 NDefLib::Message msg;
vlasov01 0:a17fde465867 509 NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTPS, subscription_url);
vlasov01 0:a17fde465867 510 msg.addRecord(&rUri);
vlasov01 0:a17fde465867 511 //write the tag
vlasov01 0:a17fde465867 512 if(tag.write(msg)){
vlasov01 0:a17fde465867 513 printf("Tag writed \r\n");
vlasov01 0:a17fde465867 514 }
vlasov01 0:a17fde465867 515 //close the i2c session
vlasov01 0:a17fde465867 516 if(!tag.closeSession()){
vlasov01 0:a17fde465867 517 printf("Error Closing the session\r\n");
vlasov01 0:a17fde465867 518 }
vlasov01 0:a17fde465867 519 }else printf("Error open Session\r\n");
vlasov01 0:a17fde465867 520 #endif
vlasov01 0:a17fde465867 521 myled=1;
vlasov01 0:a17fde465867 522 int count = 0;
vlasov01 0:a17fde465867 523 // tyeld.start();
vlasov01 0:a17fde465867 524 while (true)
vlasov01 0:a17fde465867 525 {
vlasov01 0:a17fde465867 526 if (++count == 100)
vlasov01 0:a17fde465867 527 { // Publish a message every second
vlasov01 0:a17fde465867 528 if (publish(&client, &ipstack) != 0) {
vlasov01 0:a17fde465867 529 myled=0;
vlasov01 0:a17fde465867 530 attemptConnect(&client, &ipstack); // if we have lost the connection
vlasov01 0:a17fde465867 531 } else myled=1;
vlasov01 0:a17fde465867 532 count = 0;
vlasov01 0:a17fde465867 533 }
vlasov01 0:a17fde465867 534 // int start = tyeld.read_ms();
vlasov01 0:a17fde465867 535 client.yield(10); // allow the MQTT client to receive messages
vlasov01 0:a17fde465867 536 // printf ("tyeld: %d\n\r",tyeld.read_ms()-start);
vlasov01 0:a17fde465867 537 }
vlasov01 0:a17fde465867 538 }