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:
icraggs
Date:
Wed Oct 01 13:27:35 2014 +0000
Revision:
8:80d49dd91542
Parent:
7:63a7aa4deaf8
Child:
9:58eb378727d9
Remove conditional compilation for IBM IoT settings

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