IoT based security system that detects suspicious movements through a motion detector and alerts the user on their gmail. In the presence of motion sensed between 7 to 9 times, the Grove PIR sensor sends an input to the board which is connected to internet via Ethernet. The board publishes the sensor data on IBM IoT foundation, which is known as IBM Watson. The data is then sent to IBM Bluemix which provides real time analysis and the remote time data management and monitoring. For more information : https://developer.ibm.com/recipes/tutorials/mbed-c-client-library-for-ibm-iot-foundation/

Dependencies:   C12832 EthernetInterface LM75B MMA7660 MQTT mbed-rtos mbed

Fork of IBMIoTClientEthernetExample by IBM Watson IoT

Committer:
samdanbury
Date:
Wed Aug 20 13:46:35 2014 +0000
Revision:
7:63a7aa4deaf8
Parent:
6:37b6d0d56190
Child:
8:80d49dd91542
Add AUTH_METHOD credential

Who changed what in which revision?

UserRevisionLine numberNew contents of line
samdanbury 6:37b6d0d56190 1 /*******************************************************************************
samdanbury 6:37b6d0d56190 2 * Copyright (c) 2014 IBM Corp.
samdanbury 6:37b6d0d56190 3 *
samdanbury 6:37b6d0d56190 4 * All rights reserved. This program and the accompanying materials
samdanbury 6:37b6d0d56190 5 * are made available under the terms of the Eclipse Public License v1.0
samdanbury 6:37b6d0d56190 6 * and Eclipse Distribution License v1.0 which accompany this distribution.
samdanbury 6:37b6d0d56190 7 *
samdanbury 6:37b6d0d56190 8 * The Eclipse Public License is available at
samdanbury 6:37b6d0d56190 9 * http://www.eclipse.org/legal/epl-v10.html
samdanbury 6:37b6d0d56190 10 * and the Eclipse Distribution License is available at
samdanbury 6:37b6d0d56190 11 * http://www.eclipse.org/org/documents/edl-v10.php.
samdanbury 6:37b6d0d56190 12 *
samdanbury 6:37b6d0d56190 13 * Contributors:
samdanbury 6:37b6d0d56190 14 * Sam Danbury - initial implementation
samdanbury 6:37b6d0d56190 15 * Ian Craggs - refactoring to remove STL and other changes
samdanbury 6:37b6d0d56190 16 *******************************************************************************/
samdanbury 6:37b6d0d56190 17
samdanbury 6:37b6d0d56190 18 #include "LM75B.h"
samdanbury 6:37b6d0d56190 19 #include "MMA7660.h"
samdanbury 6:37b6d0d56190 20 #include "MQTTClient.h"
samdanbury 6:37b6d0d56190 21 #include "MQTTEthernet.h"
samdanbury 6:37b6d0d56190 22 #include "C12832.h"
samdanbury 6:37b6d0d56190 23 #include "Arial12x12.h"
samdanbury 6:37b6d0d56190 24 #include "rtos.h"
samdanbury 6:37b6d0d56190 25
samdanbury 6:37b6d0d56190 26 // Configuration values needed to connect to IBM IoT Cloud
samdanbury 6:37b6d0d56190 27 #define QUICKSTARTMODE 1
samdanbury 6:37b6d0d56190 28 #if (QUICKSTARTMODE)
samdanbury 6:37b6d0d56190 29 #define ORG "quickstart"
samdanbury 6:37b6d0d56190 30 #define ID ""
samdanbury 7:63a7aa4deaf8 31 #define AUTH_METHOD ""
samdanbury 6:37b6d0d56190 32 #define AUTH_TOKEN ""
samdanbury 6:37b6d0d56190 33 #define TYPE DEFAULT_TYPE_NAME
samdanbury 6:37b6d0d56190 34 #else
samdanbury 6:37b6d0d56190 35 #define ORG "Replace with your org"
samdanbury 6:37b6d0d56190 36 #define ID "Replace with your id"
samdanbury 6:37b6d0d56190 37 #define TYPE "Replace with your type"
samdanbury 7:63a7aa4deaf8 38 #define AUTH_METHOD "Replace with your auth-method"
samdanbury 6:37b6d0d56190 39 #define AUTH_TOKEN "Replace with your auth-token"
samdanbury 6:37b6d0d56190 40 #endif
samdanbury 6:37b6d0d56190 41
samdanbury 6:37b6d0d56190 42 #define MQTT_PORT 1883
samdanbury 6:37b6d0d56190 43 #define MQTT_TLS_PORT 8883
samdanbury 6:37b6d0d56190 44 #define IBM_IOT_PORT MQTT_PORT
samdanbury 6:37b6d0d56190 45
samdanbury 6:37b6d0d56190 46 #define MQTT_MAX_PACKET_SIZE 250
samdanbury 6:37b6d0d56190 47
samdanbury 6:37b6d0d56190 48 #if defined(TARGET_LPC1768)
samdanbury 6:37b6d0d56190 49 #warning "Compiling for mbed LPC1768"
samdanbury 6:37b6d0d56190 50 #include "LPC1768.h"
samdanbury 6:37b6d0d56190 51 #elif defined(TARGET_K64F)
samdanbury 6:37b6d0d56190 52 #warning "Compiling for mbed K64F"
samdanbury 6:37b6d0d56190 53 #include "K64F.h"
samdanbury 6:37b6d0d56190 54 #endif
samdanbury 6:37b6d0d56190 55
samdanbury 6:37b6d0d56190 56 bool quickstartMode = (QUICKSTARTMODE) ? true : false;
samdanbury 6:37b6d0d56190 57 char org[11] = ORG;
samdanbury 6:37b6d0d56190 58 char type[30] = TYPE;
samdanbury 6:37b6d0d56190 59 char id[30] = ID; // mac without colons
samdanbury 6:37b6d0d56190 60 char auth_token[30] = AUTH_TOKEN; // Auth_token is only used in non-quickstart mode
samdanbury 6:37b6d0d56190 61
samdanbury 6:37b6d0d56190 62 bool connected = false;
samdanbury 6:37b6d0d56190 63 char* joystickPos = "CENTRE";
samdanbury 6:37b6d0d56190 64 int blink_interval = 0;
samdanbury 6:37b6d0d56190 65
samdanbury 6:37b6d0d56190 66
samdanbury 6:37b6d0d56190 67 void off()
samdanbury 6:37b6d0d56190 68 {
samdanbury 6:37b6d0d56190 69 r = g = b = 1.0; // 1 is off, 0 is full brightness
samdanbury 6:37b6d0d56190 70 }
samdanbury 6:37b6d0d56190 71
samdanbury 6:37b6d0d56190 72 void red()
samdanbury 6:37b6d0d56190 73 {
samdanbury 6:37b6d0d56190 74 r = 0.7; g = 1.0; b = 1.0; // 1 is off, 0 is full brightness
samdanbury 6:37b6d0d56190 75 }
samdanbury 6:37b6d0d56190 76
samdanbury 6:37b6d0d56190 77 void yellow()
samdanbury 6:37b6d0d56190 78 {
samdanbury 6:37b6d0d56190 79 r = 0.7; g = 0.7; b = 1.0; // 1 is off, 0 is full brightness
samdanbury 6:37b6d0d56190 80 }
samdanbury 6:37b6d0d56190 81
samdanbury 6:37b6d0d56190 82 void green()
samdanbury 6:37b6d0d56190 83 {
samdanbury 6:37b6d0d56190 84 r = 1.0; g = 0.7; b = 1.0; // 1 is off, 0 is full brightness
samdanbury 6:37b6d0d56190 85 }
samdanbury 6:37b6d0d56190 86
samdanbury 6:37b6d0d56190 87
samdanbury 6:37b6d0d56190 88 void flashing_yellow(void const *args)
samdanbury 6:37b6d0d56190 89 {
samdanbury 6:37b6d0d56190 90 bool on = false;
samdanbury 6:37b6d0d56190 91 while (!connected) // flashing yellow only while connecting
samdanbury 6:37b6d0d56190 92 {
samdanbury 6:37b6d0d56190 93 on = !on;
samdanbury 6:37b6d0d56190 94 if (on)
samdanbury 6:37b6d0d56190 95 yellow();
samdanbury 6:37b6d0d56190 96 else
samdanbury 6:37b6d0d56190 97 off();
samdanbury 6:37b6d0d56190 98 wait(0.5);
samdanbury 6:37b6d0d56190 99 }
samdanbury 6:37b6d0d56190 100 }
samdanbury 6:37b6d0d56190 101
samdanbury 6:37b6d0d56190 102
samdanbury 6:37b6d0d56190 103 void flashing_red(void const *args) // to be used when the connection is lost
samdanbury 6:37b6d0d56190 104 {
samdanbury 6:37b6d0d56190 105 bool on = false;
samdanbury 6:37b6d0d56190 106 while (!connected)
samdanbury 6:37b6d0d56190 107 {
samdanbury 6:37b6d0d56190 108 on = !on;
samdanbury 6:37b6d0d56190 109 if (on)
samdanbury 6:37b6d0d56190 110 red();
samdanbury 6:37b6d0d56190 111 else
samdanbury 6:37b6d0d56190 112 off();
samdanbury 6:37b6d0d56190 113 wait(2.0);
samdanbury 6:37b6d0d56190 114 }
samdanbury 6:37b6d0d56190 115 }
samdanbury 6:37b6d0d56190 116
samdanbury 6:37b6d0d56190 117
samdanbury 6:37b6d0d56190 118 void printMenu(int menuItem)
samdanbury 6:37b6d0d56190 119 {
samdanbury 6:37b6d0d56190 120 lcd.cls();
samdanbury 6:37b6d0d56190 121 lcd.locate(0,0);
samdanbury 6:37b6d0d56190 122 switch (menuItem)
samdanbury 6:37b6d0d56190 123 {
samdanbury 6:37b6d0d56190 124 case 0:
samdanbury 6:37b6d0d56190 125 lcd.printf("IBM IoT Cloud");
samdanbury 6:37b6d0d56190 126 lcd.locate(0,16);
samdanbury 6:37b6d0d56190 127 lcd.printf("Scroll with joystick");
samdanbury 6:37b6d0d56190 128 break;
samdanbury 6:37b6d0d56190 129 case 1:
samdanbury 6:37b6d0d56190 130 lcd.printf("Go to:");
samdanbury 6:37b6d0d56190 131 lcd.locate(0,16);
samdanbury 6:37b6d0d56190 132 lcd.printf("http://ibm.biz/iotqstart");
samdanbury 6:37b6d0d56190 133 break;
samdanbury 6:37b6d0d56190 134 case 2:
samdanbury 6:37b6d0d56190 135 lcd.printf("Device Identity:");
samdanbury 6:37b6d0d56190 136 lcd.locate(0,16);
samdanbury 6:37b6d0d56190 137 lcd.printf("%s", id);
samdanbury 6:37b6d0d56190 138 break;
samdanbury 6:37b6d0d56190 139 case 3:
samdanbury 6:37b6d0d56190 140 lcd.printf("Status:");
samdanbury 6:37b6d0d56190 141 lcd.locate(0,16);
samdanbury 6:37b6d0d56190 142 lcd.printf(connected ? "Connected" : "Disconnected");
samdanbury 6:37b6d0d56190 143 break;
samdanbury 6:37b6d0d56190 144 }
samdanbury 6:37b6d0d56190 145 }
samdanbury 6:37b6d0d56190 146
samdanbury 6:37b6d0d56190 147
samdanbury 6:37b6d0d56190 148 void setMenu()
samdanbury 6:37b6d0d56190 149 {
samdanbury 6:37b6d0d56190 150 static int menuItem = 0;
samdanbury 6:37b6d0d56190 151 if (Down)
samdanbury 6:37b6d0d56190 152 {
samdanbury 6:37b6d0d56190 153 joystickPos = "DOWN";
samdanbury 6:37b6d0d56190 154 if (menuItem >= 0 && menuItem < 3)
samdanbury 6:37b6d0d56190 155 printMenu(++menuItem);
samdanbury 6:37b6d0d56190 156 }
samdanbury 6:37b6d0d56190 157 else if (Left)
samdanbury 6:37b6d0d56190 158 joystickPos = "LEFT";
samdanbury 6:37b6d0d56190 159 else if (Click)
samdanbury 6:37b6d0d56190 160 joystickPos = "CLICK";
samdanbury 6:37b6d0d56190 161 else if (Up)
samdanbury 6:37b6d0d56190 162 {
samdanbury 6:37b6d0d56190 163 joystickPos = "UP";
samdanbury 6:37b6d0d56190 164 if (menuItem <= 3 && menuItem > 0)
samdanbury 6:37b6d0d56190 165 printMenu(--menuItem);
samdanbury 6:37b6d0d56190 166 }
samdanbury 6:37b6d0d56190 167 else if (Right)
samdanbury 6:37b6d0d56190 168 joystickPos = "RIGHT";
samdanbury 6:37b6d0d56190 169 else
samdanbury 6:37b6d0d56190 170 joystickPos = "CENTRE";
samdanbury 6:37b6d0d56190 171 }
samdanbury 6:37b6d0d56190 172
samdanbury 6:37b6d0d56190 173
samdanbury 6:37b6d0d56190 174 /**
samdanbury 6:37b6d0d56190 175 * Display a message on the LCD screen prefixed with IBM IoT Cloud
samdanbury 6:37b6d0d56190 176 */
samdanbury 6:37b6d0d56190 177 void displayMessage(char* message)
samdanbury 6:37b6d0d56190 178 {
samdanbury 6:37b6d0d56190 179 lcd.cls();
samdanbury 6:37b6d0d56190 180 lcd.locate(0,0);
samdanbury 6:37b6d0d56190 181 lcd.printf("IBM IoT Cloud");
samdanbury 6:37b6d0d56190 182 lcd.locate(0,16);
samdanbury 6:37b6d0d56190 183 lcd.printf(message);
samdanbury 6:37b6d0d56190 184 }
samdanbury 6:37b6d0d56190 185
samdanbury 6:37b6d0d56190 186
samdanbury 6:37b6d0d56190 187 int connect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack)
samdanbury 6:37b6d0d56190 188 {
samdanbury 6:37b6d0d56190 189 const char* iot_ibm = ".messaging.internetofthings.ibmcloud.com";
samdanbury 6:37b6d0d56190 190
samdanbury 6:37b6d0d56190 191 char hostname[strlen(org) + strlen(iot_ibm) + 1];
samdanbury 6:37b6d0d56190 192 sprintf(hostname, "%s%s", org, iot_ibm);
samdanbury 6:37b6d0d56190 193 int rc = ipstack->connect(hostname, IBM_IOT_PORT);
samdanbury 6:37b6d0d56190 194 if (rc != 0)
samdanbury 6:37b6d0d56190 195 return rc;
samdanbury 6:37b6d0d56190 196
samdanbury 6:37b6d0d56190 197 // Construct clientId - d:org:type:id
samdanbury 6:37b6d0d56190 198 char clientId[strlen(org) + strlen(type) + strlen(id) + 5];
samdanbury 6:37b6d0d56190 199 sprintf(clientId, "d:%s:%s:%s", org, type, id);
samdanbury 6:37b6d0d56190 200 DEBUG("clientid is %s\n", clientId);
samdanbury 6:37b6d0d56190 201
samdanbury 6:37b6d0d56190 202 // MQTT Connect
samdanbury 6:37b6d0d56190 203 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
samdanbury 6:37b6d0d56190 204 data.MQTTVersion = 3;
samdanbury 6:37b6d0d56190 205 data.clientID.cstring = clientId;
samdanbury 6:37b6d0d56190 206
samdanbury 6:37b6d0d56190 207 if (!quickstartMode)
samdanbury 6:37b6d0d56190 208 {
samdanbury 6:37b6d0d56190 209 data.username.cstring = "use-token-auth";
samdanbury 6:37b6d0d56190 210 data.password.cstring = auth_token;
samdanbury 6:37b6d0d56190 211 }
samdanbury 6:37b6d0d56190 212
samdanbury 6:37b6d0d56190 213 if ((rc = client->connect(&data)) == 0)
samdanbury 6:37b6d0d56190 214 {
samdanbury 6:37b6d0d56190 215 connected = true;
samdanbury 6:37b6d0d56190 216 green();
samdanbury 6:37b6d0d56190 217 displayMessage("Connected");
samdanbury 6:37b6d0d56190 218 wait(2);
samdanbury 6:37b6d0d56190 219 displayMessage("Scroll with joystick");
samdanbury 6:37b6d0d56190 220 }
samdanbury 6:37b6d0d56190 221 return rc;
samdanbury 6:37b6d0d56190 222 }
samdanbury 6:37b6d0d56190 223
samdanbury 6:37b6d0d56190 224
samdanbury 6:37b6d0d56190 225 int getConnTimeout(int attemptNumber)
samdanbury 6:37b6d0d56190 226 { // First 10 attempts try within 3 seconds, next 10 attempts retry after every 1 minute
samdanbury 6:37b6d0d56190 227 // after 20 attempts, retry every 10 minutes
samdanbury 6:37b6d0d56190 228 return (attemptNumber < 10) ? 3 : (attemptNumber < 20) ? 60 : 600;
samdanbury 6:37b6d0d56190 229 }
samdanbury 6:37b6d0d56190 230
samdanbury 6:37b6d0d56190 231
samdanbury 6:37b6d0d56190 232 void attemptConnect(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack)
samdanbury 6:37b6d0d56190 233 {
samdanbury 6:37b6d0d56190 234 int retryAttempt = 0;
samdanbury 6:37b6d0d56190 235 connected = false;
samdanbury 6:37b6d0d56190 236
samdanbury 6:37b6d0d56190 237 while (connect(client, ipstack) != 0)
samdanbury 6:37b6d0d56190 238 {
samdanbury 6:37b6d0d56190 239 #if defined(TARGET_K64F)
samdanbury 6:37b6d0d56190 240 red();
samdanbury 6:37b6d0d56190 241 #else
samdanbury 6:37b6d0d56190 242 Thread red_thread(flashing_red);
samdanbury 6:37b6d0d56190 243 #endif
samdanbury 6:37b6d0d56190 244 int timeout = getConnTimeout(++retryAttempt);
samdanbury 6:37b6d0d56190 245 WARN("Retry attempt number %d waiting %d\n", retryAttempt, timeout);
samdanbury 6:37b6d0d56190 246 wait(timeout);
samdanbury 6:37b6d0d56190 247 }
samdanbury 6:37b6d0d56190 248 }
samdanbury 6:37b6d0d56190 249
samdanbury 6:37b6d0d56190 250
samdanbury 6:37b6d0d56190 251 int publish(MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE>* client, MQTTEthernet* ipstack)
samdanbury 6:37b6d0d56190 252 {
samdanbury 6:37b6d0d56190 253 MQTT::Message message;
samdanbury 6:37b6d0d56190 254 char* pubTopic = "iot-2/evt/status/fmt/json";
samdanbury 6:37b6d0d56190 255
samdanbury 6:37b6d0d56190 256 char buf[250];
samdanbury 6:37b6d0d56190 257 sprintf(buf,
samdanbury 6:37b6d0d56190 258 "{\"d\":{\"myName\":\"IoT mbed\",\"accelX\":%0.4f,\"accelY\":%0.4f,\"accelZ\":%0.4f,\"temp\":%0.4f,\"joystick\":\"%s\",\"potentiometer1\":%0.4f,\"potentiometer2\":%0.4f}}",
samdanbury 6:37b6d0d56190 259 MMA.x(), MMA.y(), MMA.z(), sensor.temp(), joystickPos, ain1.read(), ain2.read());
samdanbury 6:37b6d0d56190 260 message.qos = MQTT::QOS0;
samdanbury 6:37b6d0d56190 261 message.retained = false;
samdanbury 6:37b6d0d56190 262 message.dup = false;
samdanbury 6:37b6d0d56190 263 message.payload = (void*)buf;
samdanbury 6:37b6d0d56190 264 message.payloadlen = strlen(buf);
samdanbury 6:37b6d0d56190 265
samdanbury 6:37b6d0d56190 266 LOG("Publishing %s\n", buf);
samdanbury 6:37b6d0d56190 267 return client->publish(pubTopic, &message);
samdanbury 6:37b6d0d56190 268 }
samdanbury 6:37b6d0d56190 269
samdanbury 6:37b6d0d56190 270
samdanbury 6:37b6d0d56190 271 #if defined(TARGET_K64F)
samdanbury 6:37b6d0d56190 272 int getUUID48(char* buf, int buflen)
samdanbury 6:37b6d0d56190 273 {
samdanbury 6:37b6d0d56190 274 unsigned int UUID_LOC_WORD0 = 0x40048060;
samdanbury 6:37b6d0d56190 275 unsigned int UUID_LOC_WORD1 = 0x4004805C;
samdanbury 6:37b6d0d56190 276
samdanbury 6:37b6d0d56190 277 // Fetch word 0
samdanbury 6:37b6d0d56190 278 uint32_t word0 = *(uint32_t *)UUID_LOC_WORD0;
samdanbury 6:37b6d0d56190 279
samdanbury 6:37b6d0d56190 280 // Fetch word 1
samdanbury 6:37b6d0d56190 281 // we only want bottom 16 bits of word1 (MAC bits 32-47)
samdanbury 6:37b6d0d56190 282 // and bit 9 forced to 1, bit 8 forced to 0
samdanbury 6:37b6d0d56190 283 // Locally administered MAC, reduced conflicts
samdanbury 6:37b6d0d56190 284 // http://en.wikipedia.org/wiki/MAC_address
samdanbury 6:37b6d0d56190 285 uint32_t word1 = *(uint32_t *)UUID_LOC_WORD1;
samdanbury 6:37b6d0d56190 286 word1 |= 0x00000200;
samdanbury 6:37b6d0d56190 287 word1 &= 0x0000FEFF;
samdanbury 6:37b6d0d56190 288
samdanbury 6:37b6d0d56190 289 int rc = snprintf(buf, buflen, "%4X%08X", word1, word0);
samdanbury 6:37b6d0d56190 290
samdanbury 6:37b6d0d56190 291 return rc;
samdanbury 6:37b6d0d56190 292 }
samdanbury 6:37b6d0d56190 293 #else
samdanbury 6:37b6d0d56190 294 char* getMac(EthernetInterface& eth, char* buf, int buflen) // Obtain MAC address
samdanbury 6:37b6d0d56190 295 {
samdanbury 6:37b6d0d56190 296 strncpy(buf, eth.getMACAddress(), buflen);
samdanbury 6:37b6d0d56190 297
samdanbury 6:37b6d0d56190 298 char* pos; // Remove colons from mac address
samdanbury 6:37b6d0d56190 299 while ((pos = strchr(buf, ':')) != NULL)
samdanbury 6:37b6d0d56190 300 memmove(pos, pos + 1, strlen(pos) + 1);
samdanbury 6:37b6d0d56190 301 return buf;
samdanbury 6:37b6d0d56190 302 }
samdanbury 6:37b6d0d56190 303 #endif
samdanbury 6:37b6d0d56190 304
samdanbury 6:37b6d0d56190 305
samdanbury 6:37b6d0d56190 306 void messageArrived(MQTT::MessageData& md)
samdanbury 6:37b6d0d56190 307 {
samdanbury 6:37b6d0d56190 308 MQTT::Message &message = md.message;
samdanbury 6:37b6d0d56190 309 char topic[md.topicName.lenstring.len + 1];
samdanbury 6:37b6d0d56190 310
samdanbury 6:37b6d0d56190 311 sprintf(topic, "%.*s", md.topicName.lenstring.len, md.topicName.lenstring.data);
samdanbury 6:37b6d0d56190 312
samdanbury 6:37b6d0d56190 313 LOG("Message arrived on topic %s: %.*s\n", topic, message.payloadlen, message.payload);
samdanbury 6:37b6d0d56190 314
samdanbury 6:37b6d0d56190 315 // Command topic: iot-2/cmd/blink/fmt/json - cmd is the string between cmd/ and /fmt/
samdanbury 6:37b6d0d56190 316 char* start = strstr(topic, "/cmd/") + 5;
samdanbury 6:37b6d0d56190 317 int len = strstr(topic, "/fmt/") - start;
samdanbury 6:37b6d0d56190 318
samdanbury 6:37b6d0d56190 319 if (memcmp(start, "blink", len) == 0)
samdanbury 6:37b6d0d56190 320 {
samdanbury 6:37b6d0d56190 321 char payload[message.payloadlen + 1];
samdanbury 6:37b6d0d56190 322 sprintf(payload, "%.*s", message.payloadlen, (char*)message.payload);
samdanbury 6:37b6d0d56190 323
samdanbury 6:37b6d0d56190 324 char* pos = strchr(payload, '}');
samdanbury 6:37b6d0d56190 325 if (pos != NULL)
samdanbury 6:37b6d0d56190 326 {
samdanbury 6:37b6d0d56190 327 *pos = '\0';
samdanbury 6:37b6d0d56190 328 if ((pos = strchr(payload, ':')) != NULL)
samdanbury 6:37b6d0d56190 329 {
samdanbury 6:37b6d0d56190 330 int blink_rate = atoi(pos + 1);
samdanbury 6:37b6d0d56190 331 blink_interval = (blink_rate <= 0) ? 0 : (blink_rate > 50 ? 1 : 50/blink_rate);
samdanbury 6:37b6d0d56190 332 }
samdanbury 6:37b6d0d56190 333 }
samdanbury 6:37b6d0d56190 334 }
samdanbury 6:37b6d0d56190 335 else
samdanbury 6:37b6d0d56190 336 WARN("Unsupported command: %.*s\n", len, start);
samdanbury 6:37b6d0d56190 337 }
samdanbury 6:37b6d0d56190 338
samdanbury 6:37b6d0d56190 339
samdanbury 6:37b6d0d56190 340 int main()
samdanbury 6:37b6d0d56190 341 {
samdanbury 6:37b6d0d56190 342 lcd.set_font((unsigned char*) Arial12x12); // Set a nice font for the LCD screen
samdanbury 6:37b6d0d56190 343
samdanbury 6:37b6d0d56190 344 led2 = LED2_OFF; // K64F: turn off the main board LED
samdanbury 6:37b6d0d56190 345
samdanbury 6:37b6d0d56190 346 displayMessage("Connecting");
samdanbury 6:37b6d0d56190 347 #if defined(TARGET_K64F)
samdanbury 6:37b6d0d56190 348 yellow(); // Don't flash on the K64F, because starting a thread causes the EthernetInterface init call to hang
samdanbury 6:37b6d0d56190 349 #else
samdanbury 6:37b6d0d56190 350 Thread yellow_thread(flashing_yellow);
samdanbury 6:37b6d0d56190 351 #endif
samdanbury 6:37b6d0d56190 352
samdanbury 6:37b6d0d56190 353 MQTTEthernet ipstack;
samdanbury 6:37b6d0d56190 354 MQTT::Client<MQTTEthernet, Countdown, MQTT_MAX_PACKET_SIZE> client(ipstack);
samdanbury 6:37b6d0d56190 355
samdanbury 6:37b6d0d56190 356 if (quickstartMode)
samdanbury 6:37b6d0d56190 357 {
samdanbury 6:37b6d0d56190 358 #if defined(TARGET_K64F)
samdanbury 6:37b6d0d56190 359 getUUID48(id, sizeof(id)); // getMac doesn't work on the K64F
samdanbury 6:37b6d0d56190 360 #else
samdanbury 6:37b6d0d56190 361 getMac(ipstack.getEth(), id, sizeof(id));
samdanbury 6:37b6d0d56190 362 #endif
samdanbury 6:37b6d0d56190 363 }
samdanbury 6:37b6d0d56190 364
samdanbury 6:37b6d0d56190 365 attemptConnect(&client, &ipstack);
samdanbury 6:37b6d0d56190 366
samdanbury 6:37b6d0d56190 367 if (!quickstartMode)
samdanbury 6:37b6d0d56190 368 {
samdanbury 6:37b6d0d56190 369 int rc = 0;
samdanbury 6:37b6d0d56190 370 if ((rc = client.subscribe("iot-2/cmd/+/fmt/json", MQTT::QOS1, messageArrived)) != 0)
samdanbury 6:37b6d0d56190 371 WARN("rc from MQTT subscribe is %d\n", rc);
samdanbury 6:37b6d0d56190 372 }
samdanbury 6:37b6d0d56190 373
samdanbury 6:37b6d0d56190 374 blink_interval = 0;
samdanbury 6:37b6d0d56190 375 int count = 0;
samdanbury 6:37b6d0d56190 376 while (true)
samdanbury 6:37b6d0d56190 377 {
samdanbury 6:37b6d0d56190 378 if (++count == 100)
samdanbury 6:37b6d0d56190 379 { // Publish a message every second
samdanbury 6:37b6d0d56190 380 if (publish(&client, &ipstack) != 0)
samdanbury 6:37b6d0d56190 381 attemptConnect(&client, &ipstack); // if we have lost the connection
samdanbury 6:37b6d0d56190 382 count = 0;
samdanbury 6:37b6d0d56190 383 }
samdanbury 6:37b6d0d56190 384
samdanbury 6:37b6d0d56190 385 if (blink_interval == 0)
samdanbury 6:37b6d0d56190 386 led2 = LED2_OFF;
samdanbury 6:37b6d0d56190 387 else if (count % blink_interval == 0)
samdanbury 6:37b6d0d56190 388 led2 = !led2;
samdanbury 6:37b6d0d56190 389 if (count % 20 == 0)
samdanbury 6:37b6d0d56190 390 setMenu();
samdanbury 6:37b6d0d56190 391 client.yield(10); // allow the MQTT client to receive messages
samdanbury 6:37b6d0d56190 392 }
samdanbury 6:37b6d0d56190 393 }