Connect through Wifi to IBM MQTT cloud https://quickstart.internetofthings.ibmcloud.com

Dependencies:   MQTT NetworkSocketAPI X_NUCLEO_IDW01M1v2 X_NUCLEO_IKS01A1 mbed NDefLib X_NUCLEO_NFC01A1

Fork of IDW01M1_Cloud_IBM by ST Expansion SW Team

To start the demo the following expansion boards are required

X_NUCLEO_IDW01M1v2, X_NUCLEO_IKS01A1, X_NUCLEO_NFC01A1

After having mounted the board stack on the Nucleo board the below steps should be followed:

  • Program in the application source code you local WiFi SSID and password and flash the binary. Make sure the Wifi network has visible SSID.
  • Reset the Nucleo board and after few seconds the Nucleo green led will be on (it means the Nucleo is connected to the local Wifi and to the IBM cloud server)
  • Read the NFC tag with an Android device and the browser will be automatically opened and directed to the specific brocker IBM demo page where the environmental values are displayed in form of a x-y graph. The values are updated every few seconds. On the Hyperterminal is possible to see the values sent to the IBM cloud server and the board mac address to be entered on the IBM quickstart web page if a manual connection is needed (eg. to connect from a PC browser).
Committer:
mapellil
Date:
Wed Sep 28 13:28:44 2016 +0000
Revision:
14:641560b57584
Parent:
13:0b31131bf711
Child:
16:233b89a6b72f
Added Wifi support and read environmental sensors from IKS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mridup 10:c7b62ce013ad 1 /* SpwfInterface NetworkSocketAPI Example Program
mridup 10:c7b62ce013ad 2 * Copyright (c) 2015 ARM Limited
mridup 10:c7b62ce013ad 3 *
mridup 10:c7b62ce013ad 4 * Licensed under the Apache License, Version 2.0 (the "License");
mridup 10:c7b62ce013ad 5 * you may not use this file except in compliance with the License.
mridup 10:c7b62ce013ad 6 * You may obtain a copy of the License at
mridup 10:c7b62ce013ad 7 *
mridup 10:c7b62ce013ad 8 * http://www.apache.org/licenses/LICENSE-2.0
mridup 10:c7b62ce013ad 9 *
mridup 10:c7b62ce013ad 10 * Unless required by applicable law or agreed to in writing, software
mridup 10:c7b62ce013ad 11 * distributed under the License is distributed on an "AS IS" BASIS,
mridup 10:c7b62ce013ad 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mridup 10:c7b62ce013ad 13 * See the License for the specific language governing permissions and
mridup 10:c7b62ce013ad 14 * limitations under the License.
mridup 10:c7b62ce013ad 15 */
mridup 10:c7b62ce013ad 16
mridup 0:cbf8bc43bc9e 17 #include "mbed.h"
mapellil 14:641560b57584 18 #include "SpwfInterface.h"
mridup 4:1ed7f173eec5 19 #include "TCPSocket.h"
fabiombed 13:0b31131bf711 20 #include "MQTTClient.h"
mapellil 14:641560b57584 21 #include "MQTTWiFi.h"
mapellil 14:641560b57584 22 #include <ctype.h>
mapellil 14:641560b57584 23 #include "x_nucleo_iks01a1.h"
fabiombed 13:0b31131bf711 24
mridup 0:cbf8bc43bc9e 25 //------------------------------------
mridup 0:cbf8bc43bc9e 26 // Hyperterminal configuration
mridup 0:cbf8bc43bc9e 27 // 9600 bauds, 8-bit data, no parity
mridup 0:cbf8bc43bc9e 28 //------------------------------------
mridup 8:6df01cb43137 29 Serial pc(SERIAL_TX, SERIAL_RX);
mridup 3:dfb8c6c8c31b 30 DigitalOut myled(LED1);
mapellil 14:641560b57584 31 SpwfSAInterface spwf(D8, D2, false);
mapellil 14:641560b57584 32 bool quickstartMode = true;
mapellil 14:641560b57584 33
mapellil 14:641560b57584 34 #define MQTT_MAX_PACKET_SIZE 250
mapellil 14:641560b57584 35 #define MQTT_MAX_PAYLOAD_SIZE 300
mapellil 14:641560b57584 36 // Configuration values needed to connect to IBM IoT Cloud
mapellil 14:641560b57584 37 #define ORG "quickstart" // For a registered connection, replace with your org
mapellil 14:641560b57584 38 #define ID "" // For a registered connection, replace with your id
mapellil 14:641560b57584 39 #define AUTH_TOKEN "" // For a registered connection, replace with your auth-token
mapellil 14:641560b57584 40 #define DEFAULT_TYPE_NAME "iotsample-mbed-NucleoF401RE"
mapellil 14:641560b57584 41 #define TYPE DEFAULT_TYPE_NAME // For a registered connection, replace with your type
mapellil 14:641560b57584 42 #define MQTT_PORT 1883
mapellil 14:641560b57584 43 #define MQTT_TLS_PORT 8883
mapellil 14:641560b57584 44 #define IBM_IOT_PORT MQTT_PORT
mapellil 14:641560b57584 45
mapellil 14:641560b57584 46 char id[30] = ID; // mac without colons
mapellil 14:641560b57584 47 char org[12] = ORG;
mapellil 14:641560b57584 48 int connack_rc = 0; // MQTT connack return code
mapellil 14:641560b57584 49 const char* ip_addr = "";
mapellil 14:641560b57584 50 char* host_addr = "";
mapellil 14:641560b57584 51 char type[30] = TYPE;
mapellil 14:641560b57584 52 char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode
mapellil 14:641560b57584 53 bool netConnecting = false;
mapellil 14:641560b57584 54 //int connectTimeout = 1000;
mapellil 14:641560b57584 55 int connectTimeout = 10;
mapellil 14:641560b57584 56 bool mqttConnecting = false;
mapellil 14:641560b57584 57 bool netConnected = false;
mapellil 14:641560b57584 58 bool connected = false;
mapellil 14:641560b57584 59 int retryAttempt = 0;
mapellil 14:641560b57584 60
mapellil 14:641560b57584 61 PressureSensor *pressure_sensor;
mapellil 14:641560b57584 62 HumiditySensor *humidity_sensor;
mapellil 14:641560b57584 63 TempSensor *temp_sensor1;
mapellil 14:641560b57584 64
mapellil 14:641560b57584 65
mapellil 14:641560b57584 66 int connect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 14:641560b57584 67 {
mapellil 14:641560b57584 68 const char* iot_ibm = ".messaging.internetofthings.ibmcloud.com";
mapellil 14:641560b57584 69
mapellil 14:641560b57584 70 char hostname[strlen(org) + strlen(iot_ibm) + 1];
mapellil 14:641560b57584 71 sprintf(hostname, "%s%s", org, iot_ibm);
mapellil 14:641560b57584 72 SpwfSAInterface& WiFi = ipstack->getWiFi();
mapellil 14:641560b57584 73 ip_addr = WiFi.get_ip_address();
mapellil 14:641560b57584 74 printf ("ID: %s\n\r",id);
mapellil 14:641560b57584 75 // Construct clientId - d:org:type:id
mapellil 14:641560b57584 76 char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
mapellil 14:641560b57584 77 sprintf(clientId, "d:%s:%s:%s", org, type, id);
mapellil 14:641560b57584 78 // Network debug statements
mapellil 14:641560b57584 79 LOG("=====================================\n\r");
mapellil 14:641560b57584 80 LOG("Connecting WiFi.\n\r");
mapellil 14:641560b57584 81 LOG("IP ADDRESS: %s\n\r", WiFi.get_ip_address());
mapellil 14:641560b57584 82 LOG("MAC ADDRESS: %s\n\r", WiFi.get_mac_address());
mapellil 14:641560b57584 83 LOG("Server Hostname: %s\n\r", hostname);
mapellil 14:641560b57584 84 for(int i = 0; clientId[i]; i++){
mapellil 14:641560b57584 85 clientId[i] = tolower(clientId[i]);
mapellil 14:641560b57584 86 }
mapellil 14:641560b57584 87 LOG("Client ID: %s\n\r", clientId);
mapellil 14:641560b57584 88 LOG("=====================================\n\r");
mapellil 14:641560b57584 89
mapellil 14:641560b57584 90 netConnecting = true;
mapellil 14:641560b57584 91 ipstack->open(&ipstack->getWiFi());
mapellil 14:641560b57584 92 int rc = ipstack->connect(hostname, IBM_IOT_PORT, connectTimeout);
mapellil 14:641560b57584 93 if (rc != 0)
mapellil 14:641560b57584 94 {
mapellil 14:641560b57584 95 WARN("IP Stack connect returned: %d\n", rc);
mapellil 14:641560b57584 96 return rc;
mapellil 14:641560b57584 97 }
mapellil 14:641560b57584 98 netConnected = true;
mapellil 14:641560b57584 99 netConnecting = false;
mapellil 14:641560b57584 100
mapellil 14:641560b57584 101 // MQTT Connect
mapellil 14:641560b57584 102 mqttConnecting = true;
mapellil 14:641560b57584 103 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
mapellil 14:641560b57584 104 data.MQTTVersion = 3;
mapellil 14:641560b57584 105 data.clientID.cstring = clientId;
mapellil 14:641560b57584 106
mapellil 14:641560b57584 107 if (!quickstartMode)
mapellil 14:641560b57584 108 {
mapellil 14:641560b57584 109 data.username.cstring = "use-token-auth";
mapellil 14:641560b57584 110 data.password.cstring = auth_token;
mapellil 14:641560b57584 111 }
mapellil 14:641560b57584 112 if ((rc = client->connect(data)) == 0)
mapellil 14:641560b57584 113 {
mapellil 14:641560b57584 114 connected = true;
mapellil 14:641560b57584 115 printf ("--->Connected\n\r");
mapellil 14:641560b57584 116 }
mapellil 14:641560b57584 117 else {
mapellil 14:641560b57584 118 WARN("MQTT connect returned %d\n", rc);
mapellil 14:641560b57584 119 }
mapellil 14:641560b57584 120 if (rc >= 0)
mapellil 14:641560b57584 121 connack_rc = rc;
mapellil 14:641560b57584 122 mqttConnecting = false;
mapellil 14:641560b57584 123 return rc;
mapellil 14:641560b57584 124 }
mapellil 14:641560b57584 125
mapellil 14:641560b57584 126 int getConnTimeout(int attemptNumber)
mapellil 14:641560b57584 127 { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
mapellil 14:641560b57584 128 // after 20 attempts, retry every 10 minutes
mapellil 14:641560b57584 129 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
mapellil 14:641560b57584 130 }
mapellil 14:641560b57584 131
mapellil 14:641560b57584 132 void attemptConnect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 14:641560b57584 133 {
mapellil 14:641560b57584 134 connected = false;
mapellil 14:641560b57584 135
mapellil 14:641560b57584 136 while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED)
mapellil 14:641560b57584 137 {
mapellil 14:641560b57584 138 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
mapellil 14:641560b57584 139 printf ("File: %s, Line: %d\n\r",__FILE__,__LINE__);
mapellil 14:641560b57584 140 return; // don't reattempt to connect if credentials are wrong
mapellil 14:641560b57584 141 }
mapellil 14:641560b57584 142 int timeout = getConnTimeout(++retryAttempt);
mapellil 14:641560b57584 143 WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
mapellil 14:641560b57584 144
mapellil 14:641560b57584 145 // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
mapellil 14:641560b57584 146 // or maybe just add the proper members to do this disconnect and call attemptConnect(...)
mapellil 14:641560b57584 147
mapellil 14:641560b57584 148 // this works - reset the system when the retry count gets to a threshold
mapellil 14:641560b57584 149 if (retryAttempt == 5)
mapellil 14:641560b57584 150 NVIC_SystemReset();
mapellil 14:641560b57584 151 else
mapellil 14:641560b57584 152 wait(timeout);
mapellil 14:641560b57584 153 }
mapellil 14:641560b57584 154 }
mapellil 14:641560b57584 155
mapellil 14:641560b57584 156 int publish(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 14:641560b57584 157 {
mapellil 14:641560b57584 158 MQTT::Message message;
mapellil 14:641560b57584 159 char* pubTopic = "iot-2/evt/status/fmt/json";
mapellil 14:641560b57584 160
mapellil 14:641560b57584 161 char buf[MQTT_MAX_PAYLOAD_SIZE];
mapellil 14:641560b57584 162 float temp, press, hum;
mapellil 14:641560b57584 163 temp_sensor1->GetTemperature(&temp);
mapellil 14:641560b57584 164 pressure_sensor->GetPressure(&press);
mapellil 14:641560b57584 165 humidity_sensor->GetHumidity(&hum);
mapellil 14:641560b57584 166 sprintf(buf,
mapellil 14:641560b57584 167 "{\"d\":{\"ST\":\"Nucleo-IoT-mbed\",\"Temp\":%0.4f,\"Pressure\":\"%0.4f,\",\"Humidity\":%0.4f}}",
mapellil 14:641560b57584 168 temp, press, hum);
mapellil 14:641560b57584 169 message.qos = MQTT::QOS0;
mapellil 14:641560b57584 170 message.retained = false;
mapellil 14:641560b57584 171 message.dup = false;
mapellil 14:641560b57584 172 message.payload = (void*)buf;
mapellil 14:641560b57584 173 message.payloadlen = strlen(buf);
mapellil 14:641560b57584 174
mapellil 14:641560b57584 175 LOG("Publishing %s\n", buf);
mapellil 14:641560b57584 176 return client->publish(pubTopic, message);
mapellil 14:641560b57584 177 }
mapellil 14:641560b57584 178
mridup 4:1ed7f173eec5 179
fabiombed 13:0b31131bf711 180 int main()
fabiombed 13:0b31131bf711 181 {
mridup 8:6df01cb43137 182 int err;
mapellil 14:641560b57584 183 const char * ssid = "crespan"; // Network must be visible otherwise it can't connect
mapellil 14:641560b57584 184 const char * seckey = "Elfrontal0";
mapellil 14:641560b57584 185
mapellil 14:641560b57584 186 // Timer tyeld;
mapellil 14:641560b57584 187
mapellil 14:641560b57584 188 DevI2C *i2c = new DevI2C(I2C_SDA, I2C_SCL);
mapellil 14:641560b57584 189 i2c->frequency(400000);
mapellil 14:641560b57584 190
mapellil 14:641560b57584 191 X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(i2c);
mapellil 14:641560b57584 192
mapellil 14:641560b57584 193 pressure_sensor = mems_expansion_board->pt_sensor;
mapellil 14:641560b57584 194 temp_sensor1 = mems_expansion_board->ht_sensor;
mapellil 14:641560b57584 195 humidity_sensor = mems_expansion_board->ht_sensor;
mridup 4:1ed7f173eec5 196
mridup 6:0d838d564181 197 pc.printf("\r\nX-NUCLEO-IDW01M1 mbed Application\r\n");
mapellil 14:641560b57584 198 pc.printf("\r\nconnecting to AP\r\n");
mapellil 14:641560b57584 199 //******************************************************************
fabiombed 13:0b31131bf711 200
mapellil 14:641560b57584 201 // quickstartMode = (strcmp(org, "quickstart") == 0);
mapellil 14:641560b57584 202 if (strcmp(org, "quickstart") == 0){quickstartMode = true;}
mapellil 14:641560b57584 203 MQTTWiFi ipstack(spwf, ssid, seckey, NSAPI_SECURITY_WPA2);
mapellil 14:641560b57584 204 MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
mapellil 14:641560b57584 205 if (quickstartMode){
mapellil 14:641560b57584 206 char mac[50];
mapellil 14:641560b57584 207 char *digit=NULL;
mapellil 14:641560b57584 208 sprintf (mac,"%s",ipstack.getWiFi().get_mac_address());
mapellil 14:641560b57584 209 strcpy (mac, ipstack.getWiFi().get_mac_address());
mapellil 14:641560b57584 210 digit = strtok (mac,":");
mapellil 14:641560b57584 211 while (digit != NULL)
mapellil 14:641560b57584 212 {
mapellil 14:641560b57584 213 strcat (id, digit);
mapellil 14:641560b57584 214 digit = strtok (NULL, ":");
mapellil 14:641560b57584 215 }
mapellil 14:641560b57584 216 }
mapellil 14:641560b57584 217 attemptConnect(&client, &ipstack);
mapellil 14:641560b57584 218 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD)
mapellil 14:641560b57584 219 {
mapellil 14:641560b57584 220 while (true)
mapellil 14:641560b57584 221 wait(1.0); // Permanent failures - don't retry
mapellil 14:641560b57584 222 }
mapellil 14:641560b57584 223 int count = 0;
mapellil 14:641560b57584 224 // tyeld.start();
fabiombed 13:0b31131bf711 225
mapellil 14:641560b57584 226 while (true)
mridup 8:6df01cb43137 227 {
mapellil 14:641560b57584 228 if (++count == /*100*/2)
mapellil 14:641560b57584 229 { // Publish a message every second
mapellil 14:641560b57584 230 if (publish(&client, &ipstack) != 0)
mapellil 14:641560b57584 231 attemptConnect(&client, &ipstack); // if we have lost the connection
mapellil 14:641560b57584 232 count = 0;
mapellil 14:641560b57584 233 }
mapellil 14:641560b57584 234 // int start = tyeld.read_ms();
mapellil 14:641560b57584 235 client.yield(/*10*/1); // allow the MQTT client to receive messages
mapellil 14:641560b57584 236 // printf ("tyeld: %d\n\r",tyeld.read_ms()-start);
mridup 3:dfb8c6c8c31b 237 }
mridup 4:1ed7f173eec5 238 }