Avnet / Mbed 2 deprecated TELUS_BG96_IBM_QuickStart

Dependencies:   MQTT NetworkSocketAPI X_NUCLEO_IKS01A2 mbed

Fork of Nucleo_NbIotBG96_A2_cloud_IBM by Avnet Silica

Committer:
MCUTechMktr
Date:
Tue Mar 20 15:00:12 2018 +0000
Revision:
3:04dbacb98e86
Parent:
2:b72797c38464
Now includes reporting of the IMSI number

Who changed what in which revision?

UserRevisionLine numberNew contents of line
abci5961 0:ae6c6727b545 1 /* BG96 NetworkSocketAPI Example Program
abci5961 0:ae6c6727b545 2 * Copyright (c) 2015 ARM Limited
abci5961 0:ae6c6727b545 3 *
abci5961 0:ae6c6727b545 4 * Licensed under the Apache License, Version 2.0 (the "License");
abci5961 0:ae6c6727b545 5 * you may not use this file except in compliance with the License.
abci5961 0:ae6c6727b545 6 * You may obtain a copy of the License at
abci5961 0:ae6c6727b545 7 *
abci5961 0:ae6c6727b545 8 * http://www.apache.org/licenses/LICENSE-2.0
abci5961 0:ae6c6727b545 9 *
abci5961 0:ae6c6727b545 10 * Unless required by applicable law or agreed to in writing, software
abci5961 0:ae6c6727b545 11 * distributed under the License is distributed on an "AS IS" BASIS,
abci5961 0:ae6c6727b545 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
abci5961 0:ae6c6727b545 13 * See the License for the specific language governing permissions and
abci5961 0:ae6c6727b545 14 * limitations under the License.
abci5961 0:ae6c6727b545 15 */
abci5961 0:ae6c6727b545 16
abci5961 0:ae6c6727b545 17 #include "mbed.h"
abci5961 0:ae6c6727b545 18 #include "BG96Interface.h"
abci5961 0:ae6c6727b545 19 #include "TCPSocket.h"
abci5961 0:ae6c6727b545 20 #include "MQTTClient.h"
abci5961 0:ae6c6727b545 21 #include "MQTT_GSM.h"
abci5961 0:ae6c6727b545 22 #include <ctype.h>
abci5961 0:ae6c6727b545 23 //#include "x_nucleo_iks01a1.h"
abci5961 0:ae6c6727b545 24 #include "XNucleoIKS01A2.h"
abci5961 0:ae6c6727b545 25
abci5961 0:ae6c6727b545 26 #include "BG96.h"
abci5961 0:ae6c6727b545 27
MCUTechMktr 3:04dbacb98e86 28 //--------------------------------------
MCUTechMktr 3:04dbacb98e86 29 // Tera Term configuration: 115200,8N1N
MCUTechMktr 3:04dbacb98e86 30 //--------------------------------------
abci5961 0:ae6c6727b545 31 Serial pc(SERIAL_TX, SERIAL_RX);
abci5961 0:ae6c6727b545 32 DigitalOut myled(LED1);
abci5961 0:ae6c6727b545 33 bool quickstartMode = true;
abci5961 0:ae6c6727b545 34
abci5961 0:ae6c6727b545 35 #define MQTT_MAX_PACKET_SIZE 300
abci5961 0:ae6c6727b545 36 #define MQTT_MAX_PAYLOAD_SIZE 500
abci5961 0:ae6c6727b545 37
abci5961 0:ae6c6727b545 38 #define ORG_QUICKSTART // comment to connect to play.internetofthings.ibmcloud.com
MCUTechMktr 3:04dbacb98e86 39 //#define SUBSCRIBE // uncomment to subscribe to broker msgs (not to be used with IBM broker)
abci5961 0:ae6c6727b545 40
abci5961 0:ae6c6727b545 41 // Configuration values needed to connect to IBM IoT Cloud
abci5961 0:ae6c6727b545 42 #define BROKER_URL ".messaging.internetofthings.ibmcloud.com";
abci5961 0:ae6c6727b545 43 #ifdef ORG_QUICKSTART
MCUTechMktr 3:04dbacb98e86 44 #define ORG "quickstart" // connect to quickstart.internetofthings.ibmcloud.com/ For a registered connection, replace with your org
abci5961 0:ae6c6727b545 45 #define ID ""
abci5961 0:ae6c6727b545 46 #define AUTH_TOKEN ""
abci5961 0:ae6c6727b545 47 #define DEFAULT_TYPE_NAME "iotsample-mbed-Nucleo"
abci5961 0:ae6c6727b545 48 #define TOPIC "iot-2/evt/status/fmt/json"
abci5961 0:ae6c6727b545 49 #else // not def ORG_QUICKSTART
MCUTechMktr 3:04dbacb98e86 50 #define ORG "pvko17" // connect to play.internetofthings.ibmcloud.com/ For a registered connection, replace with your org
abci5961 0:ae6c6727b545 51 #define ID "testtype_112233445566" // For a registered connection, replace with your id
MCUTechMktr 3:04dbacb98e86 52 #define AUTH_TOKEN "testtype_112233445566" // For a registered connection, replace with your auth-token
abci5961 0:ae6c6727b545 53 #define DEFAULT_TYPE_NAME "TestType"
abci5961 0:ae6c6727b545 54 #define TOPIC "iot-2/type/TestType/id/testtype_112233445566/evt/status/fmt/json"
abci5961 0:ae6c6727b545 55 #endif
abci5961 0:ae6c6727b545 56
MCUTechMktr 3:04dbacb98e86 57 // network credentials
MCUTechMktr 3:04dbacb98e86 58 //#define APN "m2m-east.telus.iot" // TELUS APN #1
MCUTechMktr 3:04dbacb98e86 59 //#define APN "m2m-west.telus.iot" // TELUS APN #2
MCUTechMktr 3:04dbacb98e86 60 //#define APN "sp.telus.com" // TELUS APN #3
MCUTechMktr 3:04dbacb98e86 61 //#define APN "pp.telus.com" // TELUS APN #4
MCUTechMktr 3:04dbacb98e86 62 //#define APN "internet-west.prodtest.iot" // TELUS APN #5
MCUTechMktr 3:04dbacb98e86 63 //#define APN "type1-stwi.iot" // TELUS APN #6
MCUTechMktr 3:04dbacb98e86 64 #define APN "m2m.com.attz" // AT&T APN for IoT devices
MCUTechMktr 3:04dbacb98e86 65
abci5961 0:ae6c6727b545 66 #define PASSW ""
abci5961 0:ae6c6727b545 67 #define USNAME ""
abci5961 0:ae6c6727b545 68
abci5961 0:ae6c6727b545 69 #define TYPE DEFAULT_TYPE_NAME // For a registered connection, replace with your type
abci5961 0:ae6c6727b545 70 #define MQTT_PORT 1883
abci5961 0:ae6c6727b545 71 #define MQTT_TLS_PORT 8883
abci5961 0:ae6c6727b545 72 #define IBM_IOT_PORT MQTT_PORT
abci5961 0:ae6c6727b545 73
abci5961 0:ae6c6727b545 74 char id[30] = ID; // mac without colons
abci5961 0:ae6c6727b545 75 char org[12] = ORG;
abci5961 0:ae6c6727b545 76 int connack_rc = 0; // MQTT connack return code
abci5961 0:ae6c6727b545 77 //const char* ip_addr = "11.12.13.14";
abci5961 0:ae6c6727b545 78 //char* host_addr = "11.12.13.14";
abci5961 0:ae6c6727b545 79 char sensor_id[50];
abci5961 0:ae6c6727b545 80 char type[30] = TYPE;
abci5961 0:ae6c6727b545 81 char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode
abci5961 0:ae6c6727b545 82 bool netConnecting = false;
abci5961 0:ae6c6727b545 83 int connectTimeout = 1000;
abci5961 0:ae6c6727b545 84 bool mqttConnecting = false;
abci5961 0:ae6c6727b545 85 bool netConnected = false;
abci5961 0:ae6c6727b545 86 bool connected = false;
abci5961 0:ae6c6727b545 87 int retryAttempt = 0;
abci5961 0:ae6c6727b545 88 char subscription_url[MQTT_MAX_PAYLOAD_SIZE];
abci5961 0:ae6c6727b545 89
abci5961 0:ae6c6727b545 90 #define SENSOR_ENABLED 1
MCUTechMktr 3:04dbacb98e86 91 #define SENSOR_MODEL 2
abci5961 0:ae6c6727b545 92
MCUTechMktr 3:04dbacb98e86 93 #define FW_REV "1.0a"
abci5961 0:ae6c6727b545 94
abci5961 0:ae6c6727b545 95 PressureSensor *pressure_sensor;
abci5961 0:ae6c6727b545 96 HumiditySensor *humidity_sensor;
abci5961 0:ae6c6727b545 97 TempSensor *temp_sensor1;
abci5961 0:ae6c6727b545 98
abci5961 0:ae6c6727b545 99 MQTT::Message message;
abci5961 0:ae6c6727b545 100 MQTTString TopicName={TOPIC};
abci5961 0:ae6c6727b545 101 MQTT::MessageData MsgData(TopicName, message);
abci5961 0:ae6c6727b545 102
abci5961 1:a622606a49fd 103 /* Instantiate the expansion board */
abci5961 1:a622606a49fd 104 static XNucleoIKS01A2 *mems_expansion_board = XNucleoIKS01A2::instance(D14, D15, D4, D5);
abci5961 0:ae6c6727b545 105
abci5961 1:a622606a49fd 106 /* Retrieve the composing elements of the expansion board */
abci5961 1:a622606a49fd 107 static LSM303AGRMagSensor *magnetometer = mems_expansion_board->magnetometer;
abci5961 1:a622606a49fd 108 static HTS221Sensor *hum_temp = mems_expansion_board->ht_sensor;
abci5961 1:a622606a49fd 109 static LPS22HBSensor *press_temp = mems_expansion_board->pt_sensor;
abci5961 1:a622606a49fd 110 static LSM6DSLSensor *acc_gyro = mems_expansion_board->acc_gyro;
abci5961 1:a622606a49fd 111 static LSM303AGRAccSensor *accelerometer = mems_expansion_board->accelerometer;
abci5961 0:ae6c6727b545 112
abci5961 0:ae6c6727b545 113 void subscribe_cb(MQTT::MessageData & msgMQTT) {
abci5961 0:ae6c6727b545 114 char msg[MQTT_MAX_PAYLOAD_SIZE];
abci5961 0:ae6c6727b545 115 msg[0]='\0';
abci5961 0:ae6c6727b545 116 strncat (msg, (char*)msgMQTT.message.payload, msgMQTT.message.payloadlen);
abci5961 0:ae6c6727b545 117 printf ("--->>> subscribe_cb msg: %s\n\r", msg);
abci5961 0:ae6c6727b545 118 }
abci5961 0:ae6c6727b545 119
abci5961 0:ae6c6727b545 120 int subscribe(MQTT::Client<MQTT_GSM, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTT_GSM* ipstack)
abci5961 0:ae6c6727b545 121 {
abci5961 0:ae6c6727b545 122 char* pubTopic = TOPIC;
abci5961 0:ae6c6727b545 123 return client->subscribe(pubTopic, MQTT::QOS1, subscribe_cb);
abci5961 0:ae6c6727b545 124 }
abci5961 0:ae6c6727b545 125
abci5961 0:ae6c6727b545 126 int connect(MQTT::Client<MQTT_GSM, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTT_GSM* ipstack)
abci5961 0:ae6c6727b545 127 {
abci5961 0:ae6c6727b545 128 const char* iot_ibm = BROKER_URL;
abci5961 0:ae6c6727b545 129
abci5961 0:ae6c6727b545 130
abci5961 0:ae6c6727b545 131 char hostname[strlen(org) + strlen(iot_ibm) + 1];
abci5961 0:ae6c6727b545 132 sprintf(hostname, "%s%s", org, iot_ibm);
abci5961 0:ae6c6727b545 133
abci5961 0:ae6c6727b545 134
abci5961 0:ae6c6727b545 135 // Construct clientId - d:org:type:id
abci5961 0:ae6c6727b545 136 char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
abci5961 0:ae6c6727b545 137
abci5961 0:ae6c6727b545 138 #ifdef ORG_QUICKSTART
abci5961 0:ae6c6727b545 139 sprintf(clientId, "d:%s:%s:%s", org, type, id); //@@
abci5961 0:ae6c6727b545 140 #else
abci5961 0:ae6c6727b545 141 sprintf(clientId, "g:%s:%s:%s", org, type, id); //@@
abci5961 0:ae6c6727b545 142 #endif
abci5961 0:ae6c6727b545 143
abci5961 0:ae6c6727b545 144 sprintf(subscription_url, "%s.%s/#/device/%s/sensor/", org, "internetofthings.ibmcloud.com",id);
abci5961 0:ae6c6727b545 145
abci5961 0:ae6c6727b545 146 netConnecting = true;
abci5961 0:ae6c6727b545 147 ipstack->open(&ipstack->getGSM());
abci5961 0:ae6c6727b545 148 int rc = ipstack->connect(hostname, IBM_IOT_PORT, connectTimeout);
abci5961 0:ae6c6727b545 149 if (rc != 0)
abci5961 0:ae6c6727b545 150 {
abci5961 0:ae6c6727b545 151 //WARN("IP Stack connect returned: %d\n", rc);
abci5961 0:ae6c6727b545 152 return rc;
abci5961 0:ae6c6727b545 153 }
abci5961 0:ae6c6727b545 154 pc.printf ("--->TCP Connected\n\r");
abci5961 0:ae6c6727b545 155 netConnected = true;
abci5961 0:ae6c6727b545 156 netConnecting = false;
abci5961 0:ae6c6727b545 157
abci5961 0:ae6c6727b545 158 // MQTT Connect
abci5961 0:ae6c6727b545 159 mqttConnecting = true;
abci5961 0:ae6c6727b545 160 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
abci5961 0:ae6c6727b545 161 data.MQTTVersion = 3;
abci5961 0:ae6c6727b545 162 data.struct_version=0;
abci5961 0:ae6c6727b545 163 data.clientID.cstring = clientId;
abci5961 0:ae6c6727b545 164
abci5961 0:ae6c6727b545 165 if (!quickstartMode)
abci5961 0:ae6c6727b545 166 {
abci5961 0:ae6c6727b545 167 data.username.cstring = "use-token-auth";
abci5961 0:ae6c6727b545 168 data.password.cstring = auth_token;
abci5961 0:ae6c6727b545 169 }
abci5961 0:ae6c6727b545 170 if ((rc = client->connect(data)) == 0)
abci5961 0:ae6c6727b545 171 {
abci5961 0:ae6c6727b545 172 connected = true;
abci5961 0:ae6c6727b545 173 pc.printf ("--->MQTT Connected\n\r");
abci5961 0:ae6c6727b545 174 #ifdef SUBSCRIBE
abci5961 0:ae6c6727b545 175 if (!subscribe(client, ipstack)) printf ("--->>>MQTT subscribed to: %s\n\r",TOPIC);
abci5961 0:ae6c6727b545 176 #endif
abci5961 0:ae6c6727b545 177 }
abci5961 0:ae6c6727b545 178 else {
abci5961 0:ae6c6727b545 179 //WARN("MQTT connect returned %d\n", rc);
abci5961 0:ae6c6727b545 180 }
abci5961 0:ae6c6727b545 181 if (rc >= 0)
abci5961 0:ae6c6727b545 182 connack_rc = rc;
abci5961 0:ae6c6727b545 183 mqttConnecting = false;
abci5961 0:ae6c6727b545 184 return rc;
abci5961 0:ae6c6727b545 185 }
abci5961 0:ae6c6727b545 186
abci5961 0:ae6c6727b545 187 int getConnTimeout(int attemptNumber)
abci5961 0:ae6c6727b545 188 { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
abci5961 0:ae6c6727b545 189 // after 20 attempts, retry every 10 minutes
abci5961 0:ae6c6727b545 190 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
abci5961 0:ae6c6727b545 191 }
abci5961 0:ae6c6727b545 192
abci5961 0:ae6c6727b545 193 void attemptConnect(MQTT::Client<MQTT_GSM, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTT_GSM* ipstack)
abci5961 0:ae6c6727b545 194 {
abci5961 0:ae6c6727b545 195 connected = false;
abci5961 0:ae6c6727b545 196
abci5961 0:ae6c6727b545 197 while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED)
abci5961 0:ae6c6727b545 198 {
abci5961 0:ae6c6727b545 199 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
abci5961 0:ae6c6727b545 200 printf ("File: %s, Line: %d Error: %d\n\r",__FILE__,__LINE__, connack_rc);
abci5961 0:ae6c6727b545 201 return; // don't reattempt to connect if credentials are wrong
abci5961 0:ae6c6727b545 202 }
abci5961 0:ae6c6727b545 203 int timeout = getConnTimeout(++retryAttempt);
abci5961 0:ae6c6727b545 204 //WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
abci5961 0:ae6c6727b545 205
abci5961 0:ae6c6727b545 206 // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
abci5961 0:ae6c6727b545 207 // or maybe just add the proper members to do this disconnect and call attemptConnect(...)
abci5961 0:ae6c6727b545 208 // this works - reset the system when the retry count gets to a threshold
abci5961 0:ae6c6727b545 209 if (retryAttempt == 5){
abci5961 0:ae6c6727b545 210 pc.printf ("\n\n\rFAIL!! system reset!!\n\n\r");
abci5961 0:ae6c6727b545 211 NVIC_SystemReset();
abci5961 0:ae6c6727b545 212 }
abci5961 0:ae6c6727b545 213 else
abci5961 0:ae6c6727b545 214 wait(timeout);
abci5961 0:ae6c6727b545 215 }
abci5961 0:ae6c6727b545 216 }
abci5961 0:ae6c6727b545 217 float hum_global = 50.0;
abci5961 0:ae6c6727b545 218 uint32_t n_msg = 0;
abci5961 0:ae6c6727b545 219
abci5961 0:ae6c6727b545 220 int publish(MQTT::Client<MQTT_GSM, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTT_GSM* ipstack)
abci5961 0:ae6c6727b545 221 {
abci5961 0:ae6c6727b545 222 MQTT::Message message;
abci5961 0:ae6c6727b545 223 char* pubTopic = TOPIC;
abci5961 0:ae6c6727b545 224
abci5961 0:ae6c6727b545 225 char buf[MQTT_MAX_PAYLOAD_SIZE];
abci5961 0:ae6c6727b545 226 float temp, temp1, temp2, press, hum;
abci5961 0:ae6c6727b545 227
abci5961 0:ae6c6727b545 228 #if SENSOR_ENABLED
abci5961 1:a622606a49fd 229 pc.printf("A02 reading sensors...");
abci5961 1:a622606a49fd 230
abci5961 0:ae6c6727b545 231 hum_temp->get_temperature(&temp1);
abci5961 0:ae6c6727b545 232 hum_temp->get_humidity(&hum);
abci5961 0:ae6c6727b545 233
abci5961 0:ae6c6727b545 234 press_temp->get_temperature(&temp2);
abci5961 0:ae6c6727b545 235 press_temp->get_pressure(&press);
abci5961 0:ae6c6727b545 236 temp = (temp1+temp2)/2;
abci5961 0:ae6c6727b545 237
abci5961 0:ae6c6727b545 238 pc.printf(" DONE\r\n");
abci5961 0:ae6c6727b545 239 #else
abci5961 0:ae6c6727b545 240 temp=25.5;
abci5961 0:ae6c6727b545 241 hum_global +=0.1;
abci5961 0:ae6c6727b545 242 if (hum_global>99.0)
abci5961 0:ae6c6727b545 243 hum_global = 50.0;
abci5961 0:ae6c6727b545 244 hum=hum_global;
abci5961 0:ae6c6727b545 245 press=999;
abci5961 0:ae6c6727b545 246 #endif
abci5961 0:ae6c6727b545 247
abci5961 0:ae6c6727b545 248 #ifdef ORG_QUICKSTART
abci5961 0:ae6c6727b545 249 sprintf(buf,
abci5961 0:ae6c6727b545 250 "{\"d\":{\"ST\":\"Nucleo-IoT-mbed\",\"Temp\":%0.4f,\"Pressure\":%0.4f,\"Humidity\":%0.4f}}",
abci5961 0:ae6c6727b545 251 temp, press, hum);
abci5961 0:ae6c6727b545 252 #else
abci5961 0:ae6c6727b545 253 sprintf (buf,
abci5961 0:ae6c6727b545 254 "{\"%s\": {\"temp\":%0.4f,\"humidity\":%0.4f,\"pressure\":%0.4f,\"ambient\":0,\"uv\":0,\"accel_X\":0,\"accel_Y\":0,\"accel_Z\":0}}",
abci5961 0:ae6c6727b545 255 sensor_id, temp, hum, press);
abci5961 0:ae6c6727b545 256 #endif
abci5961 0:ae6c6727b545 257
MCUTechMktr 3:04dbacb98e86 258 message.qos = MQTT::QOS0;
abci5961 0:ae6c6727b545 259 message.retained = false;
abci5961 0:ae6c6727b545 260 message.dup = false;
abci5961 0:ae6c6727b545 261 message.payload = (void*)buf;
abci5961 0:ae6c6727b545 262 message.payloadlen = strlen(buf);
abci5961 0:ae6c6727b545 263
abci5961 0:ae6c6727b545 264 //LOG("Publishing %s\n\r", buf);
abci5961 0:ae6c6727b545 265 n_msg++;
abci5961 0:ae6c6727b545 266 pc.printf("Publishing V%s #%d %s\n\r", FW_REV, n_msg, buf);
abci5961 0:ae6c6727b545 267 return client->publish(pubTopic, message);
abci5961 0:ae6c6727b545 268 }
abci5961 0:ae6c6727b545 269
abci5961 0:ae6c6727b545 270
abci5961 0:ae6c6727b545 271 int loop_count = 0;
abci5961 0:ae6c6727b545 272 void test_sens(void);
abci5961 0:ae6c6727b545 273
abci5961 0:ae6c6727b545 274 int main()
abci5961 0:ae6c6727b545 275 {
MCUTechMktr 3:04dbacb98e86 276 const char * line_divider = "*******************************************************";
abci5961 0:ae6c6727b545 277 const char * apn = APN; // Network must be visible otherwise it can't connect
abci5961 0:ae6c6727b545 278 const char * username = USNAME;
MCUTechMktr 3:04dbacb98e86 279 const char * password = PASSW;
MCUTechMktr 3:04dbacb98e86 280 const char * IMSI_number = "302220XXXXXX"; // IMSI placeholder
MCUTechMktr 3:04dbacb98e86 281
abci5961 0:ae6c6727b545 282 BG96Interface bg96_if(D8, D2, false);
abci5961 0:ae6c6727b545 283 //sprintf(sensor_id,"%s",bg96_if.get_mac_address());
abci5961 0:ae6c6727b545 284 //Timer tyeld;
abci5961 0:ae6c6727b545 285
abci5961 0:ae6c6727b545 286 //change serial baud to 115200
abci5961 0:ae6c6727b545 287 pc.baud(115200);
abci5961 0:ae6c6727b545 288 wait(0.1);
abci5961 0:ae6c6727b545 289
abci5961 0:ae6c6727b545 290 myled=1;
abci5961 0:ae6c6727b545 291 //wait(0.5);
MCUTechMktr 3:04dbacb98e86 292 // pc.printf("*******************************************************");
MCUTechMktr 3:04dbacb98e86 293 pc.printf("\r\n%s\r\n", line_divider);
MCUTechMktr 3:04dbacb98e86 294 wait( 0.1 );
MCUTechMktr 3:04dbacb98e86 295 // pc.printf("\r\nAvnet Silica NbIotBG96 A02 mbed-os application\r\n");
MCUTechMktr 3:04dbacb98e86 296 pc.printf("TELUS LTE-M IoT Starter Kit: IBM QuickStart application");
abci5961 0:ae6c6727b545 297 wait( 0.1 );
MCUTechMktr 3:04dbacb98e86 298 pc.printf("\r\n%s\r\n", line_divider);
MCUTechMktr 3:04dbacb98e86 299 wait( 0.1 );
abci5961 0:ae6c6727b545 300 pc.printf("MBED online version %s\r\n", FW_REV);
abci5961 0:ae6c6727b545 301 wait( 0.1 );
MCUTechMktr 3:04dbacb98e86 302 pc.printf("APN = %s\r\n", APN);
abci5961 0:ae6c6727b545 303
MCUTechMktr 3:04dbacb98e86 304 #if SENSOR_ENABLED
MCUTechMktr 3:04dbacb98e86 305 /* Enable all sensors */
MCUTechMktr 3:04dbacb98e86 306 hum_temp->enable();
MCUTechMktr 3:04dbacb98e86 307 press_temp->enable();
MCUTechMktr 3:04dbacb98e86 308 //magnetometer->enable();
MCUTechMktr 3:04dbacb98e86 309 //accelerometer->enable();
MCUTechMktr 3:04dbacb98e86 310 //acc_gyro->enable_x();
MCUTechMktr 3:04dbacb98e86 311 //acc_gyro->enable_g();
MCUTechMktr 3:04dbacb98e86 312 #endif
abci5961 0:ae6c6727b545 313
abci5961 0:ae6c6727b545 314 quickstartMode=false;
abci5961 0:ae6c6727b545 315 if (strcmp(org, "quickstart") == 0){quickstartMode = true;}
abci5961 0:ae6c6727b545 316 MQTT_GSM ipstack(bg96_if, apn, username, password);
MCUTechMktr 3:04dbacb98e86 317
MCUTechMktr 3:04dbacb98e86 318 // Get the IMSI number from BG96
MCUTechMktr 3:04dbacb98e86 319 pc.printf("***********************\r\n");
MCUTechMktr 3:04dbacb98e86 320 wait( 0.1 );
MCUTechMktr 3:04dbacb98e86 321 pc.printf("IMSI = %s\r\n", bg96_if.get_IMSI_number()); // IMSI placeholder
MCUTechMktr 3:04dbacb98e86 322 wait( 0.1 );
MCUTechMktr 3:04dbacb98e86 323 pc.printf("***********************\r\n");
MCUTechMktr 3:04dbacb98e86 324 wait( 0.1 );
MCUTechMktr 3:04dbacb98e86 325
abci5961 0:ae6c6727b545 326 MQTT::Client<MQTT_GSM, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
abci5961 0:ae6c6727b545 327 if (quickstartMode){
abci5961 0:ae6c6727b545 328 char mac[50]; // remove all : from mac
abci5961 0:ae6c6727b545 329 char *digit=NULL;
abci5961 0:ae6c6727b545 330 sprintf (id,"%s", "");
abci5961 0:ae6c6727b545 331 sprintf (mac,"%s",ipstack.getGSM().get_mac_address());
abci5961 0:ae6c6727b545 332 digit = strtok (mac,":");
abci5961 0:ae6c6727b545 333 while (digit != NULL)
abci5961 0:ae6c6727b545 334 {
abci5961 0:ae6c6727b545 335 strcat (id, digit);
abci5961 0:ae6c6727b545 336 digit = strtok (NULL, ":");
abci5961 0:ae6c6727b545 337 }
abci5961 0:ae6c6727b545 338 }
abci5961 0:ae6c6727b545 339 attemptConnect(&client, &ipstack);
abci5961 0:ae6c6727b545 340 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD)
abci5961 0:ae6c6727b545 341 {
abci5961 0:ae6c6727b545 342 while (true)
abci5961 0:ae6c6727b545 343 wait(1.0); // Permanent failures - don't retry
abci5961 0:ae6c6727b545 344 }
abci5961 0:ae6c6727b545 345 myled=0;
abci5961 0:ae6c6727b545 346 sprintf(sensor_id,"%s",bg96_if.get_mac_address());
abci5961 0:ae6c6727b545 347
abci5961 0:ae6c6727b545 348 while (true)
abci5961 0:ae6c6727b545 349 {
MCUTechMktr 3:04dbacb98e86 350 if (++loop_count == 10) //pf this was 60
abci5961 0:ae6c6727b545 351 {
abci5961 0:ae6c6727b545 352 // Publish a message every 30 second
abci5961 0:ae6c6727b545 353 pc.printf("\n");
abci5961 0:ae6c6727b545 354 myled=1;
abci5961 0:ae6c6727b545 355 if (publish(&client, &ipstack) != 0) {
abci5961 0:ae6c6727b545 356 myled=0;
abci5961 0:ae6c6727b545 357 attemptConnect(&client, &ipstack); // if we have lost the connection
abci5961 0:ae6c6727b545 358 }
abci5961 0:ae6c6727b545 359 //else
abci5961 0:ae6c6727b545 360 myled=0;
abci5961 0:ae6c6727b545 361 loop_count = 0;
abci5961 0:ae6c6727b545 362 }
abci5961 0:ae6c6727b545 363 // int start = tyeld.read_ms();
abci5961 0:ae6c6727b545 364 client.yield(500); // allow the MQTT client to receive messages
abci5961 0:ae6c6727b545 365 pc.printf ("loop %d\r", (loop_count+1)); //: %d\n\r",tyeld.read_ms()-start);
abci5961 0:ae6c6727b545 366 }
abci5961 0:ae6c6727b545 367 }
abci5961 0:ae6c6727b545 368
abci5961 0:ae6c6727b545 369 /* Helper function for printing floats & doubles */
abci5961 0:ae6c6727b545 370 static char *print_double(char* str, double v, int decimalDigits=2)
abci5961 0:ae6c6727b545 371 {
abci5961 0:ae6c6727b545 372 int i = 1;
abci5961 0:ae6c6727b545 373 int intPart, fractPart;
abci5961 0:ae6c6727b545 374 int len;
abci5961 0:ae6c6727b545 375 char *ptr;
abci5961 0:ae6c6727b545 376
abci5961 0:ae6c6727b545 377 /* prepare decimal digits multiplicator */
abci5961 0:ae6c6727b545 378 for (;decimalDigits!=0; i*=10, decimalDigits--);
abci5961 0:ae6c6727b545 379
abci5961 0:ae6c6727b545 380 /* calculate integer & fractinal parts */
abci5961 0:ae6c6727b545 381 intPart = (int)v;
abci5961 0:ae6c6727b545 382 fractPart = (int)((v-(double)(int)v)*i);
abci5961 0:ae6c6727b545 383
abci5961 0:ae6c6727b545 384 /* fill in integer part */
abci5961 0:ae6c6727b545 385 sprintf(str, "%i.", intPart);
abci5961 0:ae6c6727b545 386
abci5961 0:ae6c6727b545 387 /* prepare fill in of fractional part */
abci5961 0:ae6c6727b545 388 len = strlen(str);
abci5961 0:ae6c6727b545 389 ptr = &str[len];
abci5961 0:ae6c6727b545 390
abci5961 0:ae6c6727b545 391 /* fill in leading fractional zeros */
abci5961 0:ae6c6727b545 392 for (i/=10;i>1; i/=10, ptr++) {
abci5961 0:ae6c6727b545 393 if (fractPart >= i) {
abci5961 0:ae6c6727b545 394 break;
abci5961 0:ae6c6727b545 395 }
abci5961 0:ae6c6727b545 396 *ptr = '0';
abci5961 0:ae6c6727b545 397 }
abci5961 0:ae6c6727b545 398
abci5961 0:ae6c6727b545 399 /* fill in (rest of) fractional part */
abci5961 0:ae6c6727b545 400 sprintf(ptr, "%i", fractPart);
abci5961 0:ae6c6727b545 401
abci5961 0:ae6c6727b545 402 return str;
abci5961 0:ae6c6727b545 403 }
abci5961 0:ae6c6727b545 404
abci5961 0:ae6c6727b545 405
abci5961 0:ae6c6727b545 406 //for testing sensor board ...
abci5961 0:ae6c6727b545 407 void test_sens(void)
abci5961 0:ae6c6727b545 408 {
abci5961 0:ae6c6727b545 409 while(1)
abci5961 0:ae6c6727b545 410 {
MCUTechMktr 3:04dbacb98e86 411
abci5961 0:ae6c6727b545 412 float value1, value2;
abci5961 0:ae6c6727b545 413 char buffer1[32], buffer2[32];
abci5961 0:ae6c6727b545 414 printf("\r\n");
abci5961 0:ae6c6727b545 415
abci5961 0:ae6c6727b545 416 hum_temp->get_temperature(&value1);
abci5961 0:ae6c6727b545 417 hum_temp->get_humidity(&value2);
abci5961 0:ae6c6727b545 418 printf("HTS221: [temp] %7s C, [hum] %s%%\r\n", print_double(buffer1, value1), print_double(buffer2, value2));
abci5961 0:ae6c6727b545 419
abci5961 0:ae6c6727b545 420 press_temp->get_temperature(&value1);
abci5961 0:ae6c6727b545 421 press_temp->get_pressure(&value2);
abci5961 0:ae6c6727b545 422 printf("LPS22HB: [temp] %7s C, [press] %s mbar\r\n", print_double(buffer1, value1), print_double(buffer2, value2));
abci5961 0:ae6c6727b545 423
abci5961 0:ae6c6727b545 424 wait(2);
abci5961 0:ae6c6727b545 425 }
abci5961 0:ae6c6727b545 426 }