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 15:36:07 2016 +0000
Revision:
16:233b89a6b72f
Parent:
14:641560b57584
Child:
17:83d0cd810ed3
Code cleanup

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 16:233b89a6b72f 45 // WiFi network credential
mapellil 16:233b89a6b72f 46 #define SSID "crespan" // Network must be visible otherwise it can't connect
mapellil 16:233b89a6b72f 47 #define PASSW ""
mapellil 16:233b89a6b72f 48 #warning "Wifi password empty"
mapellil 14:641560b57584 49
mapellil 14:641560b57584 50 char id[30] = ID; // mac without colons
mapellil 14:641560b57584 51 char org[12] = ORG;
mapellil 14:641560b57584 52 int connack_rc = 0; // MQTT connack return code
mapellil 14:641560b57584 53 const char* ip_addr = "";
mapellil 14:641560b57584 54 char* host_addr = "";
mapellil 14:641560b57584 55 char type[30] = TYPE;
mapellil 14:641560b57584 56 char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode
mapellil 14:641560b57584 57 bool netConnecting = false;
mapellil 14:641560b57584 58 //int connectTimeout = 1000;
mapellil 14:641560b57584 59 int connectTimeout = 10;
mapellil 14:641560b57584 60 bool mqttConnecting = false;
mapellil 14:641560b57584 61 bool netConnected = false;
mapellil 14:641560b57584 62 bool connected = false;
mapellil 14:641560b57584 63 int retryAttempt = 0;
mapellil 14:641560b57584 64
mapellil 14:641560b57584 65 PressureSensor *pressure_sensor;
mapellil 14:641560b57584 66 HumiditySensor *humidity_sensor;
mapellil 14:641560b57584 67 TempSensor *temp_sensor1;
mapellil 14:641560b57584 68
mapellil 14:641560b57584 69
mapellil 14:641560b57584 70 int connect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 14:641560b57584 71 {
mapellil 14:641560b57584 72 const char* iot_ibm = ".messaging.internetofthings.ibmcloud.com";
mapellil 14:641560b57584 73
mapellil 14:641560b57584 74 char hostname[strlen(org) + strlen(iot_ibm) + 1];
mapellil 14:641560b57584 75 sprintf(hostname, "%s%s", org, iot_ibm);
mapellil 14:641560b57584 76 SpwfSAInterface& WiFi = ipstack->getWiFi();
mapellil 14:641560b57584 77 ip_addr = WiFi.get_ip_address();
mapellil 14:641560b57584 78 printf ("ID: %s\n\r",id);
mapellil 14:641560b57584 79 // Construct clientId - d:org:type:id
mapellil 14:641560b57584 80 char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
mapellil 14:641560b57584 81 sprintf(clientId, "d:%s:%s:%s", org, type, id);
mapellil 14:641560b57584 82 // Network debug statements
mapellil 14:641560b57584 83 LOG("=====================================\n\r");
mapellil 14:641560b57584 84 LOG("Connecting WiFi.\n\r");
mapellil 14:641560b57584 85 LOG("IP ADDRESS: %s\n\r", WiFi.get_ip_address());
mapellil 14:641560b57584 86 LOG("MAC ADDRESS: %s\n\r", WiFi.get_mac_address());
mapellil 14:641560b57584 87 LOG("Server Hostname: %s\n\r", hostname);
mapellil 14:641560b57584 88 for(int i = 0; clientId[i]; i++){
mapellil 14:641560b57584 89 clientId[i] = tolower(clientId[i]);
mapellil 14:641560b57584 90 }
mapellil 14:641560b57584 91 LOG("Client ID: %s\n\r", clientId);
mapellil 14:641560b57584 92 LOG("=====================================\n\r");
mapellil 14:641560b57584 93
mapellil 14:641560b57584 94 netConnecting = true;
mapellil 14:641560b57584 95 ipstack->open(&ipstack->getWiFi());
mapellil 14:641560b57584 96 int rc = ipstack->connect(hostname, IBM_IOT_PORT, connectTimeout);
mapellil 14:641560b57584 97 if (rc != 0)
mapellil 14:641560b57584 98 {
mapellil 14:641560b57584 99 WARN("IP Stack connect returned: %d\n", rc);
mapellil 14:641560b57584 100 return rc;
mapellil 14:641560b57584 101 }
mapellil 14:641560b57584 102 netConnected = true;
mapellil 14:641560b57584 103 netConnecting = false;
mapellil 14:641560b57584 104
mapellil 14:641560b57584 105 // MQTT Connect
mapellil 14:641560b57584 106 mqttConnecting = true;
mapellil 14:641560b57584 107 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
mapellil 14:641560b57584 108 data.MQTTVersion = 3;
mapellil 14:641560b57584 109 data.clientID.cstring = clientId;
mapellil 14:641560b57584 110
mapellil 14:641560b57584 111 if (!quickstartMode)
mapellil 14:641560b57584 112 {
mapellil 14:641560b57584 113 data.username.cstring = "use-token-auth";
mapellil 14:641560b57584 114 data.password.cstring = auth_token;
mapellil 14:641560b57584 115 }
mapellil 14:641560b57584 116 if ((rc = client->connect(data)) == 0)
mapellil 14:641560b57584 117 {
mapellil 14:641560b57584 118 connected = true;
mapellil 14:641560b57584 119 printf ("--->Connected\n\r");
mapellil 14:641560b57584 120 }
mapellil 14:641560b57584 121 else {
mapellil 14:641560b57584 122 WARN("MQTT connect returned %d\n", rc);
mapellil 14:641560b57584 123 }
mapellil 14:641560b57584 124 if (rc >= 0)
mapellil 14:641560b57584 125 connack_rc = rc;
mapellil 14:641560b57584 126 mqttConnecting = false;
mapellil 14:641560b57584 127 return rc;
mapellil 14:641560b57584 128 }
mapellil 14:641560b57584 129
mapellil 14:641560b57584 130 int getConnTimeout(int attemptNumber)
mapellil 14:641560b57584 131 { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
mapellil 14:641560b57584 132 // after 20 attempts, retry every 10 minutes
mapellil 14:641560b57584 133 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
mapellil 14:641560b57584 134 }
mapellil 14:641560b57584 135
mapellil 14:641560b57584 136 void attemptConnect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 14:641560b57584 137 {
mapellil 14:641560b57584 138 connected = false;
mapellil 14:641560b57584 139
mapellil 14:641560b57584 140 while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED)
mapellil 14:641560b57584 141 {
mapellil 14:641560b57584 142 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
mapellil 14:641560b57584 143 printf ("File: %s, Line: %d\n\r",__FILE__,__LINE__);
mapellil 14:641560b57584 144 return; // don't reattempt to connect if credentials are wrong
mapellil 14:641560b57584 145 }
mapellil 14:641560b57584 146 int timeout = getConnTimeout(++retryAttempt);
mapellil 14:641560b57584 147 WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
mapellil 14:641560b57584 148
mapellil 14:641560b57584 149 // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
mapellil 14:641560b57584 150 // or maybe just add the proper members to do this disconnect and call attemptConnect(...)
mapellil 14:641560b57584 151
mapellil 14:641560b57584 152 // this works - reset the system when the retry count gets to a threshold
mapellil 14:641560b57584 153 if (retryAttempt == 5)
mapellil 14:641560b57584 154 NVIC_SystemReset();
mapellil 14:641560b57584 155 else
mapellil 14:641560b57584 156 wait(timeout);
mapellil 14:641560b57584 157 }
mapellil 14:641560b57584 158 }
mapellil 14:641560b57584 159
mapellil 14:641560b57584 160 int publish(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 14:641560b57584 161 {
mapellil 14:641560b57584 162 MQTT::Message message;
mapellil 14:641560b57584 163 char* pubTopic = "iot-2/evt/status/fmt/json";
mapellil 14:641560b57584 164
mapellil 14:641560b57584 165 char buf[MQTT_MAX_PAYLOAD_SIZE];
mapellil 14:641560b57584 166 float temp, press, hum;
mapellil 14:641560b57584 167 temp_sensor1->GetTemperature(&temp);
mapellil 14:641560b57584 168 pressure_sensor->GetPressure(&press);
mapellil 14:641560b57584 169 humidity_sensor->GetHumidity(&hum);
mapellil 14:641560b57584 170 sprintf(buf,
mapellil 14:641560b57584 171 "{\"d\":{\"ST\":\"Nucleo-IoT-mbed\",\"Temp\":%0.4f,\"Pressure\":\"%0.4f,\",\"Humidity\":%0.4f}}",
mapellil 14:641560b57584 172 temp, press, hum);
mapellil 14:641560b57584 173 message.qos = MQTT::QOS0;
mapellil 14:641560b57584 174 message.retained = false;
mapellil 14:641560b57584 175 message.dup = false;
mapellil 14:641560b57584 176 message.payload = (void*)buf;
mapellil 14:641560b57584 177 message.payloadlen = strlen(buf);
mapellil 14:641560b57584 178
mapellil 14:641560b57584 179 LOG("Publishing %s\n", buf);
mapellil 14:641560b57584 180 return client->publish(pubTopic, message);
mapellil 14:641560b57584 181 }
mridup 4:1ed7f173eec5 182
fabiombed 13:0b31131bf711 183 int main()
fabiombed 13:0b31131bf711 184 {
mapellil 16:233b89a6b72f 185 const char * ssid = SSID; // Network must be visible otherwise it can't connect
mapellil 16:233b89a6b72f 186 const char * seckey = PASSW;
mapellil 14:641560b57584 187
mapellil 14:641560b57584 188 // Timer tyeld;
mapellil 14:641560b57584 189
mapellil 14:641560b57584 190 DevI2C *i2c = new DevI2C(I2C_SDA, I2C_SCL);
mapellil 14:641560b57584 191 i2c->frequency(400000);
mapellil 14:641560b57584 192
mapellil 14:641560b57584 193 X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(i2c);
mapellil 14:641560b57584 194
mapellil 14:641560b57584 195 pressure_sensor = mems_expansion_board->pt_sensor;
mapellil 14:641560b57584 196 temp_sensor1 = mems_expansion_board->ht_sensor;
mapellil 14:641560b57584 197 humidity_sensor = mems_expansion_board->ht_sensor;
mridup 4:1ed7f173eec5 198
mridup 6:0d838d564181 199 pc.printf("\r\nX-NUCLEO-IDW01M1 mbed Application\r\n");
mapellil 14:641560b57584 200 pc.printf("\r\nconnecting to AP\r\n");
fabiombed 13:0b31131bf711 201
mapellil 16:233b89a6b72f 202 if (strcmp(org, "quickstart") == 0){quickstartMode = true;}
mapellil 16:233b89a6b72f 203 MQTTWiFi ipstack(spwf, ssid, seckey, NSAPI_SECURITY_WPA2);
mapellil 16:233b89a6b72f 204 MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
mapellil 16:233b89a6b72f 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 16:233b89a6b72f 216 }
mapellil 16:233b89a6b72f 217 attemptConnect(&client, &ipstack);
mapellil 16:233b89a6b72f 218 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD)
mapellil 16:233b89a6b72f 219 {
mapellil 16:233b89a6b72f 220 while (true)
mapellil 16:233b89a6b72f 221 wait(1.0); // Permanent failures - don't retry
mapellil 16:233b89a6b72f 222 }
mapellil 16:233b89a6b72f 223 int count = 0;
mapellil 16:233b89a6b72f 224 // tyeld.start();
mapellil 14:641560b57584 225 while (true)
mridup 8:6df01cb43137 226 {
mapellil 14:641560b57584 227 if (++count == /*100*/2)
mapellil 14:641560b57584 228 { // Publish a message every second
mapellil 14:641560b57584 229 if (publish(&client, &ipstack) != 0)
mapellil 14:641560b57584 230 attemptConnect(&client, &ipstack); // if we have lost the connection
mapellil 14:641560b57584 231 count = 0;
mapellil 14:641560b57584 232 }
mapellil 14:641560b57584 233 // int start = tyeld.read_ms();
mapellil 14:641560b57584 234 client.yield(/*10*/1); // allow the MQTT client to receive messages
mapellil 14:641560b57584 235 // printf ("tyeld: %d\n\r",tyeld.read_ms()-start);
mridup 3:dfb8c6c8c31b 236 }
mridup 4:1ed7f173eec5 237 }