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 Oct 26 15:28:35 2016 +0000
Revision:
23:43f9e34781f2
Parent:
22:d278e4bb5ded
Child:
24:a59eb8bdc431
Added NFC expansion board and brocker subscription support

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"
mapellil 23:43f9e34781f2 24 #include "X_NUCLEO_NFC01A1.h"
mapellil 23:43f9e34781f2 25 #include "NDefLib/NDefNfcTag.h"
mapellil 23:43f9e34781f2 26 #include "NDefLib/RecordType/RecordURI.h"
fabiombed 13:0b31131bf711 27
mridup 0:cbf8bc43bc9e 28 //------------------------------------
mridup 0:cbf8bc43bc9e 29 // Hyperterminal configuration
mridup 0:cbf8bc43bc9e 30 // 9600 bauds, 8-bit data, no parity
mridup 0:cbf8bc43bc9e 31 //------------------------------------
mridup 8:6df01cb43137 32 Serial pc(SERIAL_TX, SERIAL_RX);
mridup 3:dfb8c6c8c31b 33 DigitalOut myled(LED1);
mapellil 14:641560b57584 34 SpwfSAInterface spwf(D8, D2, false);
mapellil 14:641560b57584 35 bool quickstartMode = true;
mapellil 17:83d0cd810ed3 36
mapellil 23:43f9e34781f2 37 #define ORG_QUICKSTART // comment to connect to play.internetofthings.ibmcloud.com
mapellil 23:43f9e34781f2 38 //#define SUBSCRIBE // uncomment to subscribe to broker msgs (not to be used with IBM broker)
mapellil 23:43f9e34781f2 39 #define X_NUCLEO_NFC01A1_PRESENT // uncomment to add NFC support
mapellil 14:641560b57584 40
mapellil 14:641560b57584 41 #define MQTT_MAX_PACKET_SIZE 250
mapellil 14:641560b57584 42 #define MQTT_MAX_PAYLOAD_SIZE 300
mapellil 17:83d0cd810ed3 43
mapellil 14:641560b57584 44 // Configuration values needed to connect to IBM IoT Cloud
mapellil 23:43f9e34781f2 45 #define BROKER_URL ".messaging.internetofthings.ibmcloud.com";
mapellil 17:83d0cd810ed3 46 #ifdef ORG_QUICKSTART
mapellil 17:83d0cd810ed3 47 #define ORG "quickstart" // connect to quickstart.internetofthings.ibmcloud.com/ For a registered connection, replace with your org
mapellil 17:83d0cd810ed3 48 #define ID ""
mapellil 17:83d0cd810ed3 49 #define AUTH_TOKEN ""
mapellil 21:78fac4c1b0fa 50 #define DEFAULT_TYPE_NAME "iotsample-mbed-Nucleo"
mapellil 23:43f9e34781f2 51 #else // not def ORG_QUICKSTART
mapellil 17:83d0cd810ed3 52 #define ORG "play" // connect to play.internetofthings.ibmcloud.com/ For a registered connection, replace with your org
mapellil 23:43f9e34781f2 53 #define ID "" // For a registered connection, replace with your id
mapellil 23:43f9e34781f2 54 #define AUTH_TOKEN ""// For a registered connection, replace with your auth-token
mapellil 17:83d0cd810ed3 55 #define DEFAULT_TYPE_NAME "sensor"
mapellil 17:83d0cd810ed3 56 #endif
mapellil 23:43f9e34781f2 57 #define TOPIC "iot-2/evt/status/fmt/json"
mapellil 17:83d0cd810ed3 58
mapellil 14:641560b57584 59 #define TYPE DEFAULT_TYPE_NAME // For a registered connection, replace with your type
mapellil 14:641560b57584 60 #define MQTT_PORT 1883
mapellil 14:641560b57584 61 #define MQTT_TLS_PORT 8883
mapellil 14:641560b57584 62 #define IBM_IOT_PORT MQTT_PORT
mapellil 16:233b89a6b72f 63 // WiFi network credential
mapellil 22:d278e4bb5ded 64 #define SSID "" // Network must be visible otherwise it can't connect
mapellil 22:d278e4bb5ded 65 #define PASSW ""
nikapov 20:517b559ce91d 66 #warning "Wifi SSID & password empty"
mapellil 14:641560b57584 67
mapellil 14:641560b57584 68 char id[30] = ID; // mac without colons
mapellil 14:641560b57584 69 char org[12] = ORG;
mapellil 14:641560b57584 70 int connack_rc = 0; // MQTT connack return code
mapellil 14:641560b57584 71 const char* ip_addr = "";
mapellil 14:641560b57584 72 char* host_addr = "";
mapellil 14:641560b57584 73 char type[30] = TYPE;
mapellil 14:641560b57584 74 char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode
mapellil 14:641560b57584 75 bool netConnecting = false;
mapellil 23:43f9e34781f2 76 int connectTimeout = 1000;
mapellil 14:641560b57584 77 bool mqttConnecting = false;
mapellil 14:641560b57584 78 bool netConnected = false;
mapellil 14:641560b57584 79 bool connected = false;
mapellil 14:641560b57584 80 int retryAttempt = 0;
mapellil 23:43f9e34781f2 81 char subscription_url[MQTT_MAX_PAYLOAD_SIZE];
mapellil 14:641560b57584 82
mapellil 14:641560b57584 83 PressureSensor *pressure_sensor;
mapellil 14:641560b57584 84 HumiditySensor *humidity_sensor;
mapellil 14:641560b57584 85 TempSensor *temp_sensor1;
mapellil 14:641560b57584 86
mapellil 23:43f9e34781f2 87 MQTT::Message message;
mapellil 23:43f9e34781f2 88 MQTTString TopicName={TOPIC};
mapellil 23:43f9e34781f2 89 MQTT::MessageData MsgData(TopicName, message);
mapellil 23:43f9e34781f2 90
mapellil 23:43f9e34781f2 91 void subscribe_cb(MQTT::MessageData & msgMQTT) {
mapellil 23:43f9e34781f2 92 char msg[MQTT_MAX_PAYLOAD_SIZE];
mapellil 23:43f9e34781f2 93 msg[0]='\0';
mapellil 23:43f9e34781f2 94 strncat (msg, (char*)msgMQTT.message.payload, msgMQTT.message.payloadlen);
mapellil 23:43f9e34781f2 95 printf ("--->>> subscribe_cb msg: %s\n\r", msg);
mapellil 23:43f9e34781f2 96 }
mapellil 23:43f9e34781f2 97
mapellil 23:43f9e34781f2 98 int subscribe(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 23:43f9e34781f2 99 {
mapellil 23:43f9e34781f2 100 char* pubTopic = TOPIC;
mapellil 23:43f9e34781f2 101 return client->subscribe(pubTopic, MQTT::QOS1, subscribe_cb);
mapellil 23:43f9e34781f2 102 }
mapellil 14:641560b57584 103
mapellil 14:641560b57584 104 int connect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 23:43f9e34781f2 105 {
mapellil 23:43f9e34781f2 106 const char* iot_ibm = BROKER_URL;
mapellil 23:43f9e34781f2 107
mapellil 14:641560b57584 108
mapellil 14:641560b57584 109 char hostname[strlen(org) + strlen(iot_ibm) + 1];
mapellil 14:641560b57584 110 sprintf(hostname, "%s%s", org, iot_ibm);
mapellil 14:641560b57584 111 SpwfSAInterface& WiFi = ipstack->getWiFi();
mapellil 14:641560b57584 112 ip_addr = WiFi.get_ip_address();
mapellil 14:641560b57584 113 // Construct clientId - d:org:type:id
mapellil 23:43f9e34781f2 114 char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
mapellil 23:43f9e34781f2 115 sprintf(clientId, "d:%s:%s:%s", org, type, id);
mapellil 23:43f9e34781f2 116 sprintf(subscription_url, "%s.%s/#/device/%s/sensor/", org, "internetofthings.ibmcloud.com",id);
mapellil 23:43f9e34781f2 117
mapellil 14:641560b57584 118 // Network debug statements
mapellil 14:641560b57584 119 LOG("=====================================\n\r");
mapellil 14:641560b57584 120 LOG("Connecting WiFi.\n\r");
mapellil 23:43f9e34781f2 121 LOG("Nucleo IP ADDRESS: %s\n\r", WiFi.get_ip_address());
mapellil 23:43f9e34781f2 122 LOG("Nucleo MAC ADDRESS: %s\n\r", WiFi.get_mac_address());
mapellil 23:43f9e34781f2 123 LOG("Server Hostname: %s port: %d\n\r", hostname, IBM_IOT_PORT);
mapellil 17:83d0cd810ed3 124 // for(int i = 0; clientId[i]; i++){
mapellil 17:83d0cd810ed3 125 // clientId[i] = tolower(clientId[i]);
mapellil 17:83d0cd810ed3 126 // }
mapellil 23:43f9e34781f2 127 LOG("Client ID: %s id: %s\n\r", clientId, id);
mapellil 23:43f9e34781f2 128 LOG("Topic: %s\n\r",TOPIC);
mapellil 23:43f9e34781f2 129 LOG("Subscription URL: %s\n\r", subscription_url);
mapellil 14:641560b57584 130 LOG("=====================================\n\r");
mapellil 14:641560b57584 131
mapellil 14:641560b57584 132 netConnecting = true;
mapellil 14:641560b57584 133 ipstack->open(&ipstack->getWiFi());
mapellil 23:43f9e34781f2 134 int rc = ipstack->connect(hostname, IBM_IOT_PORT, connectTimeout);
mapellil 14:641560b57584 135 if (rc != 0)
mapellil 14:641560b57584 136 {
mapellil 14:641560b57584 137 WARN("IP Stack connect returned: %d\n", rc);
mapellil 14:641560b57584 138 return rc;
mapellil 14:641560b57584 139 }
mapellil 23:43f9e34781f2 140 printf ("--->TCP Connected\n\r");
mapellil 14:641560b57584 141 netConnected = true;
mapellil 14:641560b57584 142 netConnecting = false;
mapellil 14:641560b57584 143
mapellil 14:641560b57584 144 // MQTT Connect
mapellil 14:641560b57584 145 mqttConnecting = true;
mapellil 14:641560b57584 146 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
mapellil 17:83d0cd810ed3 147 data.MQTTVersion = 4;
mapellil 17:83d0cd810ed3 148 data.struct_version=0;
mapellil 14:641560b57584 149 data.clientID.cstring = clientId;
mapellil 14:641560b57584 150
mapellil 14:641560b57584 151 if (!quickstartMode)
mapellil 14:641560b57584 152 {
mapellil 14:641560b57584 153 data.username.cstring = "use-token-auth";
mapellil 14:641560b57584 154 data.password.cstring = auth_token;
mapellil 23:43f9e34781f2 155 }
mapellil 14:641560b57584 156 if ((rc = client->connect(data)) == 0)
mapellil 14:641560b57584 157 {
mapellil 14:641560b57584 158 connected = true;
mapellil 23:43f9e34781f2 159 printf ("--->MQTT Connected\n\r");
mapellil 23:43f9e34781f2 160 #ifdef SUBSCRIBE
mapellil 23:43f9e34781f2 161 if (!subscribe(client, ipstack)) printf ("--->>>MQTT subscribed to: %s\n\r",TOPIC);
mapellil 23:43f9e34781f2 162 #endif
mapellil 14:641560b57584 163 }
mapellil 14:641560b57584 164 else {
mapellil 14:641560b57584 165 WARN("MQTT connect returned %d\n", rc);
mapellil 14:641560b57584 166 }
mapellil 14:641560b57584 167 if (rc >= 0)
mapellil 14:641560b57584 168 connack_rc = rc;
mapellil 14:641560b57584 169 mqttConnecting = false;
mapellil 14:641560b57584 170 return rc;
mapellil 14:641560b57584 171 }
mapellil 14:641560b57584 172
mapellil 14:641560b57584 173 int getConnTimeout(int attemptNumber)
mapellil 14:641560b57584 174 { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
mapellil 14:641560b57584 175 // after 20 attempts, retry every 10 minutes
mapellil 14:641560b57584 176 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
mapellil 14:641560b57584 177 }
mapellil 14:641560b57584 178
mapellil 14:641560b57584 179 void attemptConnect(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 14:641560b57584 180 {
mapellil 14:641560b57584 181 connected = false;
mapellil 14:641560b57584 182
mapellil 14:641560b57584 183 while (connect(client, ipstack) != MQTT_CONNECTION_ACCEPTED)
mapellil 14:641560b57584 184 {
mapellil 14:641560b57584 185 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD) {
mapellil 23:43f9e34781f2 186 printf ("File: %s, Line: %d Error: %d\n\r",__FILE__,__LINE__, connack_rc);
mapellil 14:641560b57584 187 return; // don't reattempt to connect if credentials are wrong
mapellil 23:43f9e34781f2 188 }
mapellil 14:641560b57584 189 int timeout = getConnTimeout(++retryAttempt);
mapellil 14:641560b57584 190 WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
mapellil 14:641560b57584 191
mapellil 14:641560b57584 192 // if ipstack and client were on the heap we could deconstruct and goto a label where they are constructed
mapellil 23:43f9e34781f2 193 // or maybe just add the proper members to do this disconnect and call attemptConnect(...)
mapellil 14:641560b57584 194 // this works - reset the system when the retry count gets to a threshold
mapellil 14:641560b57584 195 if (retryAttempt == 5)
mapellil 14:641560b57584 196 NVIC_SystemReset();
mapellil 14:641560b57584 197 else
mapellil 14:641560b57584 198 wait(timeout);
mapellil 14:641560b57584 199 }
mapellil 14:641560b57584 200 }
mapellil 14:641560b57584 201
mapellil 14:641560b57584 202 int publish(MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTWiFi* ipstack)
mapellil 14:641560b57584 203 {
mapellil 14:641560b57584 204 MQTT::Message message;
mapellil 23:43f9e34781f2 205 char* pubTopic = TOPIC;
mapellil 14:641560b57584 206
mapellil 14:641560b57584 207 char buf[MQTT_MAX_PAYLOAD_SIZE];
mapellil 14:641560b57584 208 float temp, press, hum;
mapellil 14:641560b57584 209 temp_sensor1->GetTemperature(&temp);
mapellil 14:641560b57584 210 pressure_sensor->GetPressure(&press);
mapellil 14:641560b57584 211 humidity_sensor->GetHumidity(&hum);
mapellil 14:641560b57584 212 sprintf(buf,
mapellil 21:78fac4c1b0fa 213 "{\"d\":{\"ST\":\"Nucleo-IoT-mbed\",\"Temp\":%0.4f,\"Pressure\":%0.4f,\"Humidity\":%0.4f}}",
mapellil 14:641560b57584 214 temp, press, hum);
mapellil 14:641560b57584 215 message.qos = MQTT::QOS0;
mapellil 14:641560b57584 216 message.retained = false;
mapellil 14:641560b57584 217 message.dup = false;
mapellil 14:641560b57584 218 message.payload = (void*)buf;
mapellil 14:641560b57584 219 message.payloadlen = strlen(buf);
mapellil 14:641560b57584 220
mapellil 23:43f9e34781f2 221 LOG("Publishing %s\n\r", buf);
mapellil 14:641560b57584 222 return client->publish(pubTopic, message);
mapellil 14:641560b57584 223 }
mridup 4:1ed7f173eec5 224
fabiombed 13:0b31131bf711 225 int main()
fabiombed 13:0b31131bf711 226 {
mapellil 16:233b89a6b72f 227 const char * ssid = SSID; // Network must be visible otherwise it can't connect
mapellil 16:233b89a6b72f 228 const char * seckey = PASSW;
mapellil 14:641560b57584 229
mapellil 14:641560b57584 230 // Timer tyeld;
mapellil 14:641560b57584 231
mapellil 14:641560b57584 232 DevI2C *i2c = new DevI2C(I2C_SDA, I2C_SCL);
mapellil 14:641560b57584 233 i2c->frequency(400000);
mapellil 14:641560b57584 234
mapellil 23:43f9e34781f2 235 X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(i2c);
mapellil 14:641560b57584 236 pressure_sensor = mems_expansion_board->pt_sensor;
mapellil 14:641560b57584 237 temp_sensor1 = mems_expansion_board->ht_sensor;
mapellil 14:641560b57584 238 humidity_sensor = mems_expansion_board->ht_sensor;
mridup 4:1ed7f173eec5 239
mridup 6:0d838d564181 240 pc.printf("\r\nX-NUCLEO-IDW01M1 mbed Application\r\n");
mapellil 14:641560b57584 241 pc.printf("\r\nconnecting to AP\r\n");
fabiombed 13:0b31131bf711 242
mapellil 17:83d0cd810ed3 243 quickstartMode=false;
mapellil 16:233b89a6b72f 244 if (strcmp(org, "quickstart") == 0){quickstartMode = true;}
mapellil 16:233b89a6b72f 245 MQTTWiFi ipstack(spwf, ssid, seckey, NSAPI_SECURITY_WPA2);
mapellil 16:233b89a6b72f 246 MQTT::Client<MQTTWiFi, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
mapellil 16:233b89a6b72f 247 if (quickstartMode){
mapellil 14:641560b57584 248 char mac[50];
mapellil 17:83d0cd810ed3 249 char *digit=NULL;
mapellil 17:83d0cd810ed3 250 sprintf (id,"%s", "");
mapellil 14:641560b57584 251 sprintf (mac,"%s",ipstack.getWiFi().get_mac_address());
mapellil 14:641560b57584 252 strcpy (mac, ipstack.getWiFi().get_mac_address());
mapellil 14:641560b57584 253 digit = strtok (mac,":");
mapellil 14:641560b57584 254 while (digit != NULL)
mapellil 14:641560b57584 255 {
mapellil 14:641560b57584 256 strcat (id, digit);
mapellil 14:641560b57584 257 digit = strtok (NULL, ":");
mapellil 17:83d0cd810ed3 258 }
mapellil 16:233b89a6b72f 259 }
mapellil 16:233b89a6b72f 260 attemptConnect(&client, &ipstack);
mapellil 16:233b89a6b72f 261 if (connack_rc == MQTT_NOT_AUTHORIZED || connack_rc == MQTT_BAD_USERNAME_OR_PASSWORD)
mapellil 16:233b89a6b72f 262 {
mapellil 16:233b89a6b72f 263 while (true)
mapellil 16:233b89a6b72f 264 wait(1.0); // Permanent failures - don't retry
mapellil 16:233b89a6b72f 265 }
mapellil 23:43f9e34781f2 266 #ifdef X_NUCLEO_NFC01A1_PRESENT
mapellil 23:43f9e34781f2 267 // program NFC with broker URL
mapellil 23:43f9e34781f2 268 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);
mapellil 23:43f9e34781f2 269 NDefLib::NDefNfcTag& tag = nfcNucleo->getM24SR().getNDefTag();
mapellil 23:43f9e34781f2 270 printf("NFC Init done: !\r\n");
mapellil 23:43f9e34781f2 271 //open the i2c session with the nfc chip
mapellil 23:43f9e34781f2 272 if(tag.openSession()){
mapellil 23:43f9e34781f2 273 //create the NDef message and record
mapellil 23:43f9e34781f2 274 NDefLib::Message msg;
mapellil 23:43f9e34781f2 275 NDefLib::RecordURI rUri(NDefLib::RecordURI::HTTPS, subscription_url);
mapellil 23:43f9e34781f2 276 msg.addRecord(&rUri);
mapellil 23:43f9e34781f2 277 //write the tag
mapellil 23:43f9e34781f2 278 if(tag.write(msg)){
mapellil 23:43f9e34781f2 279 printf("Tag writed \r\n");
mapellil 23:43f9e34781f2 280 }
mapellil 23:43f9e34781f2 281 //close the i2c session
mapellil 23:43f9e34781f2 282 if(!tag.closeSession()){
mapellil 23:43f9e34781f2 283 printf("Error Closing the session\r\n");
mapellil 23:43f9e34781f2 284 }
mapellil 23:43f9e34781f2 285 }else printf("Error open Session\r\n");
mapellil 23:43f9e34781f2 286 #endif
mapellil 16:233b89a6b72f 287 int count = 0;
mapellil 16:233b89a6b72f 288 // tyeld.start();
mapellil 14:641560b57584 289 while (true)
mridup 8:6df01cb43137 290 {
mapellil 14:641560b57584 291 if (++count == /*100*/2)
mapellil 14:641560b57584 292 { // Publish a message every second
mapellil 23:43f9e34781f2 293 if (publish(&client, &ipstack) != 0) {
mapellil 23:43f9e34781f2 294 attemptConnect(&client, &ipstack); // if we have lost the connection
mapellil 23:43f9e34781f2 295 }
mapellil 14:641560b57584 296 count = 0;
mapellil 14:641560b57584 297 }
mapellil 14:641560b57584 298 // int start = tyeld.read_ms();
mapellil 14:641560b57584 299 client.yield(/*10*/1); // allow the MQTT client to receive messages
mapellil 14:641560b57584 300 // printf ("tyeld: %d\n\r",tyeld.read_ms()-start);
mridup 3:dfb8c6c8c31b 301 }
mridup 4:1ed7f173eec5 302 }