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:
Fri Jul 18 09:33:01 2014 +0000
Revision:
3:69ef39823eef
Parent:
2:d8fddda78c38
Child:
4:77fd4b6ceecb
Remove LCD printf message that isn't required

Who changed what in which revision?

UserRevisionLine numberNew contents of line
samdanbury 0:cae064bcbe5e 1 /*******************************************************************************
samdanbury 0:cae064bcbe5e 2 * Copyright (c) 2014 IBM Corporation and other Contributors.
samdanbury 0:cae064bcbe5e 3 *
samdanbury 0:cae064bcbe5e 4 * All rights reserved. This program and the accompanying materials
samdanbury 0:cae064bcbe5e 5 * are made available under the terms of the Eclipse Public License v1.0
samdanbury 0:cae064bcbe5e 6 * which accompanies this distribution, and is available at
samdanbury 0:cae064bcbe5e 7 * http://www.eclipse.org/legal/epl-v10.html
samdanbury 0:cae064bcbe5e 8 *
samdanbury 0:cae064bcbe5e 9 * Contributors: Sam Danbury
samdanbury 0:cae064bcbe5e 10 * IBM - Initial Contribution
samdanbury 0:cae064bcbe5e 11 *******************************************************************************/
samdanbury 0:cae064bcbe5e 12
samdanbury 0:cae064bcbe5e 13 #include "stdio.h"
samdanbury 0:cae064bcbe5e 14 #include "mbed.h"
samdanbury 0:cae064bcbe5e 15 #include "rtos.h"
samdanbury 0:cae064bcbe5e 16 #include "C12832.h"
samdanbury 0:cae064bcbe5e 17 #include "LM75B.h"
samdanbury 0:cae064bcbe5e 18 #include "MMA7660.h"
samdanbury 2:d8fddda78c38 19 #include "EthernetInterface.h"
samdanbury 2:d8fddda78c38 20 #include "MQTTSocket.h"
samdanbury 0:cae064bcbe5e 21 #include "MQTTClient.h"
samdanbury 0:cae064bcbe5e 22 #include "ConfigFile.h"
samdanbury 1:1f187285667c 23 #include "Arial12x12.h"
samdanbury 0:cae064bcbe5e 24
samdanbury 0:cae064bcbe5e 25 #include <string>
samdanbury 0:cae064bcbe5e 26 #include <sstream>
samdanbury 0:cae064bcbe5e 27 #include <algorithm>
samdanbury 0:cae064bcbe5e 28
samdanbury 0:cae064bcbe5e 29 using namespace std;
samdanbury 0:cae064bcbe5e 30
samdanbury 0:cae064bcbe5e 31 #ifdef TARGET_LPC1768
samdanbury 0:cae064bcbe5e 32
samdanbury 0:cae064bcbe5e 33 #warning "Compiling for mbed LPC1768"
samdanbury 0:cae064bcbe5e 34
samdanbury 0:cae064bcbe5e 35 LocalFileSystem local("local");
samdanbury 0:cae064bcbe5e 36 C12832 lcd(p5, p7, p6, p8, p11);
samdanbury 0:cae064bcbe5e 37 DigitalOut led2(LED2);
samdanbury 1:1f187285667c 38 PwmOut r (p23);
samdanbury 1:1f187285667c 39 PwmOut g (p24);
samdanbury 1:1f187285667c 40 PwmOut b (p25);
samdanbury 0:cae064bcbe5e 41 MMA7660 MMA(p28, p27);
samdanbury 0:cae064bcbe5e 42 LM75B sensor(p28, p27);
samdanbury 0:cae064bcbe5e 43 DigitalIn Down(p12);
samdanbury 0:cae064bcbe5e 44 DigitalIn Left(p13);
samdanbury 0:cae064bcbe5e 45 DigitalIn Click(p14);
samdanbury 0:cae064bcbe5e 46 DigitalIn Up(p15);
samdanbury 0:cae064bcbe5e 47 DigitalIn Right(p16);
samdanbury 0:cae064bcbe5e 48 AnalogIn ain1(p19);
samdanbury 0:cae064bcbe5e 49 AnalogIn ain2(p20);
samdanbury 0:cae064bcbe5e 50
samdanbury 0:cae064bcbe5e 51 #elif TARGET_K64F
samdanbury 0:cae064bcbe5e 52
samdanbury 0:cae064bcbe5e 53 #warning "Compiling for mbed K64F"
samdanbury 0:cae064bcbe5e 54
samdanbury 0:cae064bcbe5e 55 //#define ORGANISATION "<org>";
samdanbury 0:cae064bcbe5e 56 //#define TYPE "<type>";
samdanbury 0:cae064bcbe5e 57 //#define ID "<id>";
samdanbury 0:cae064bcbe5e 58 //#define AUTHMETHOD "<auth-method>";
samdanbury 0:cae064bcbe5e 59 //#define AUTHTOKEN "<auth-token>";
samdanbury 0:cae064bcbe5e 60
samdanbury 0:cae064bcbe5e 61 C12832 lcd(D11, D13, D12, D7, D10);
samdanbury 1:1f187285667c 62 PwmOut r (D5);
samdanbury 1:1f187285667c 63 PwmOut g (D8);
samdanbury 1:1f187285667c 64 PwmOut b (D9);
samdanbury 1:1f187285667c 65 DigitalOut led2(LED2);
samdanbury 0:cae064bcbe5e 66 MMA7660 MMA(PTE25, PTE24);
samdanbury 0:cae064bcbe5e 67 LM75B sensor(PTE25, PTE24);
samdanbury 0:cae064bcbe5e 68 DigitalIn Up(A2);
samdanbury 0:cae064bcbe5e 69 DigitalIn Down(A3);
samdanbury 0:cae064bcbe5e 70 DigitalIn Right(A4);
samdanbury 0:cae064bcbe5e 71 DigitalIn Left(A5);
samdanbury 0:cae064bcbe5e 72 DigitalIn Click(D4);
samdanbury 0:cae064bcbe5e 73 AnalogIn ain1(A0);
samdanbury 0:cae064bcbe5e 74 AnalogIn ain2(A1);
samdanbury 0:cae064bcbe5e 75
samdanbury 0:cae064bcbe5e 76 #else
samdanbury 0:cae064bcbe5e 77
samdanbury 0:cae064bcbe5e 78 LocalFileSystem local("local");
samdanbury 0:cae064bcbe5e 79 C12832 lcd(D11, D13, D12, D7, D10);
samdanbury 0:cae064bcbe5e 80 DigitalOut led1(LED1);
samdanbury 0:cae064bcbe5e 81 DigitalOut led2(LED2);
samdanbury 0:cae064bcbe5e 82 DigitalOut led3(LED3);
samdanbury 0:cae064bcbe5e 83 MMA7660 MMA(D14, D15);
samdanbury 0:cae064bcbe5e 84 LM75B sensor(D14,D15);
samdanbury 0:cae064bcbe5e 85 DigitalIn Up(A2);
samdanbury 0:cae064bcbe5e 86 DigitalIn Down(A3);
samdanbury 0:cae064bcbe5e 87 DigitalIn Left(A4);
samdanbury 0:cae064bcbe5e 88 DigitalIn Right(A5);
samdanbury 0:cae064bcbe5e 89 DigitalIn Click(D4);
samdanbury 0:cae064bcbe5e 90 AnalogIn ain1 (A0);
samdanbury 0:cae064bcbe5e 91 AnalogIn ain2 (A1);
samdanbury 0:cae064bcbe5e 92
samdanbury 0:cae064bcbe5e 93 #endif
samdanbury 0:cae064bcbe5e 94
samdanbury 0:cae064bcbe5e 95 //Joystick
samdanbury 0:cae064bcbe5e 96 string joystickPos;
samdanbury 0:cae064bcbe5e 97 void joystickThread(void const *args);
samdanbury 0:cae064bcbe5e 98
samdanbury 0:cae064bcbe5e 99 //Commands
samdanbury 0:cae064bcbe5e 100 enum command {
samdanbury 0:cae064bcbe5e 101 blink
samdanbury 0:cae064bcbe5e 102 };
samdanbury 0:cae064bcbe5e 103 command getCommand (std::string const& command);
samdanbury 0:cae064bcbe5e 104 void messageArrived(MQTT::MessageData& md);
samdanbury 1:1f187285667c 105
samdanbury 1:1f187285667c 106 //MQTT
samdanbury 1:1f187285667c 107 void connect();
samdanbury 1:1f187285667c 108 void attemptConnect();
samdanbury 1:1f187285667c 109 int getConnTimeout(int attemptNumber);
samdanbury 1:1f187285667c 110 void subscribe();
samdanbury 0:cae064bcbe5e 111
samdanbury 0:cae064bcbe5e 112 //Config
samdanbury 0:cae064bcbe5e 113 void parseConfig();
samdanbury 0:cae064bcbe5e 114 bool quickstartMode = true;
samdanbury 0:cae064bcbe5e 115 string org = "";
samdanbury 0:cae064bcbe5e 116 string type = "";
samdanbury 0:cae064bcbe5e 117 string id = "";
samdanbury 0:cae064bcbe5e 118 string auth_method = "";
samdanbury 0:cae064bcbe5e 119 string auth_token = "";
samdanbury 0:cae064bcbe5e 120 string mac = "";
samdanbury 0:cae064bcbe5e 121
samdanbury 1:1f187285667c 122 //LCD menu
samdanbury 1:1f187285667c 123 bool connected = false;
samdanbury 1:1f187285667c 124 bool menuActivated = false;
samdanbury 1:1f187285667c 125 int menu = 0;
samdanbury 1:1f187285667c 126 void printMenu();
samdanbury 1:1f187285667c 127
samdanbury 1:1f187285667c 128 int interval;
samdanbury 1:1f187285667c 129 string getUUID48();
samdanbury 1:1f187285667c 130
samdanbury 1:1f187285667c 131 MQTTSocket ipstack;
samdanbury 1:1f187285667c 132 MQTT::Client<MQTTSocket, Countdown, 250>* client;
samdanbury 0:cae064bcbe5e 133
samdanbury 0:cae064bcbe5e 134 void parseConfig() {
samdanbury 0:cae064bcbe5e 135
samdanbury 0:cae064bcbe5e 136 ConfigFile cfg;
samdanbury 0:cae064bcbe5e 137
samdanbury 0:cae064bcbe5e 138 char value[30];
samdanbury 0:cae064bcbe5e 139 char value1[30];
samdanbury 0:cae064bcbe5e 140 char value2[30];
samdanbury 0:cae064bcbe5e 141 char value3[30];
samdanbury 0:cae064bcbe5e 142
samdanbury 0:cae064bcbe5e 143 if (cfg.read("/local/device.cfg")) {
samdanbury 0:cae064bcbe5e 144 quickstartMode = false;
samdanbury 0:cae064bcbe5e 145
samdanbury 0:cae064bcbe5e 146 if (cfg.getValue("org", value, sizeof(value))) {
samdanbury 0:cae064bcbe5e 147 stringstream ss(value);
samdanbury 0:cae064bcbe5e 148 ss >> org;
samdanbury 0:cae064bcbe5e 149 }
samdanbury 0:cae064bcbe5e 150 if (cfg.getValue("type", value1, sizeof(value1))) {
samdanbury 0:cae064bcbe5e 151 stringstream ss(value1);
samdanbury 0:cae064bcbe5e 152 ss >> type;
samdanbury 1:1f187285667c 153 }
samdanbury 0:cae064bcbe5e 154 if (cfg.getValue("id", value2, sizeof(value2))) {
samdanbury 0:cae064bcbe5e 155 stringstream ss(value2);
samdanbury 0:cae064bcbe5e 156 ss >> id;
samdanbury 0:cae064bcbe5e 157 }
samdanbury 0:cae064bcbe5e 158 if (cfg.getValue("auth-token", value3, sizeof(value3))) {
samdanbury 0:cae064bcbe5e 159 stringstream ss(value3);
samdanbury 0:cae064bcbe5e 160 ss >> auth_token;
samdanbury 0:cae064bcbe5e 161 }
samdanbury 0:cae064bcbe5e 162
samdanbury 0:cae064bcbe5e 163 } else {
samdanbury 0:cae064bcbe5e 164 quickstartMode = true;
samdanbury 0:cae064bcbe5e 165 org = "quickstart";
samdanbury 2:d8fddda78c38 166 #ifdef TARGET_K64F
samdanbury 2:d8fddda78c38 167 type = "iotsample-mbed-k64f";
samdanbury 2:d8fddda78c38 168 #else
samdanbury 2:d8fddda78c38 169 type = "iotsample-mbed-lpc1768";
samdanbury 2:d8fddda78c38 170 #endif
samdanbury 0:cae064bcbe5e 171 id = mac;
samdanbury 0:cae064bcbe5e 172 }
samdanbury 0:cae064bcbe5e 173
samdanbury 0:cae064bcbe5e 174 #ifdef TARGET_K64F
samdanbury 0:cae064bcbe5e 175 #ifdef ORGANISATION
samdanbury 0:cae064bcbe5e 176 quickstartMode = false;
samdanbury 0:cae064bcbe5e 177 org = ORGANISATION;
samdanbury 0:cae064bcbe5e 178
samdanbury 0:cae064bcbe5e 179 #ifdef TYPE
samdanbury 0:cae064bcbe5e 180 type = TYPE;
samdanbury 0:cae064bcbe5e 181 #else
samdanbury 0:cae064bcbe5e 182 lcd.printf("Type is not defined");
samdanbury 0:cae064bcbe5e 183 #endif
samdanbury 0:cae064bcbe5e 184
samdanbury 0:cae064bcbe5e 185 #ifdef ID
samdanbury 0:cae064bcbe5e 186 id = ID;
samdanbury 0:cae064bcbe5e 187 #else
samdanbury 0:cae064bcbe5e 188 lcd.printf("ID is not defined");
samdanbury 0:cae064bcbe5e 189 #endif
samdanbury 0:cae064bcbe5e 190
samdanbury 0:cae064bcbe5e 191 #ifdef AUTHMETHOD
samdanbury 0:cae064bcbe5e 192 auth_method = AUTHMETHOD;
samdanbury 0:cae064bcbe5e 193 #else
samdanbury 0:cae064bcbe5e 194 lcd.printf("Auth method is not defined");
samdanbury 0:cae064bcbe5e 195 #endif
samdanbury 0:cae064bcbe5e 196
samdanbury 0:cae064bcbe5e 197 #ifdef AUTHTOKEN
samdanbury 0:cae064bcbe5e 198 auth_token = AUTHTOKEN;
samdanbury 0:cae064bcbe5e 199 #else
samdanbury 0:cae064bcbe5e 200 lcd.printf("Auth token is not defined");
samdanbury 0:cae064bcbe5e 201 #endif
samdanbury 0:cae064bcbe5e 202 #endif
samdanbury 0:cae064bcbe5e 203 #endif
samdanbury 0:cae064bcbe5e 204 }
samdanbury 0:cae064bcbe5e 205
samdanbury 0:cae064bcbe5e 206 int main()
samdanbury 0:cae064bcbe5e 207 {
samdanbury 1:1f187285667c 208 //RGB: yellow
samdanbury 1:1f187285667c 209 r = 0;
samdanbury 1:1f187285667c 210 g = 0;
samdanbury 1:1f187285667c 211 b = 1;
samdanbury 1:1f187285667c 212
samdanbury 1:1f187285667c 213 lcd.cls();
samdanbury 1:1f187285667c 214 lcd.set_font((unsigned char*) Arial12x12);
samdanbury 1:1f187285667c 215 lcd.locate(0,0);
samdanbury 1:1f187285667c 216 lcd.printf("IBM IoT Cloud");
samdanbury 1:1f187285667c 217 lcd.locate(0,16);
samdanbury 1:1f187285667c 218 lcd.printf("Connecting");
samdanbury 0:cae064bcbe5e 219
samdanbury 0:cae064bcbe5e 220 //Connect to network
samdanbury 1:1f187285667c 221 EthernetInterface eth;
samdanbury 1:1f187285667c 222 eth.init();
samdanbury 1:1f187285667c 223 eth.connect();
samdanbury 0:cae064bcbe5e 224
samdanbury 0:cae064bcbe5e 225 //Obtain mac address of mbed
samdanbury 0:cae064bcbe5e 226 #ifdef TARGET_K64F
samdanbury 0:cae064bcbe5e 227 mac = getUUID48();
samdanbury 0:cae064bcbe5e 228 #else
samdanbury 1:1f187285667c 229 mac = eth.getMACAddress();
samdanbury 0:cae064bcbe5e 230
samdanbury 0:cae064bcbe5e 231 //Remove colons from mac address
samdanbury 0:cae064bcbe5e 232 mac.erase(remove(mac.begin(), mac.end(), ':'), mac.end());
samdanbury 0:cae064bcbe5e 233 #endif
samdanbury 0:cae064bcbe5e 234
samdanbury 0:cae064bcbe5e 235 //Parse config file if present
samdanbury 0:cae064bcbe5e 236 parseConfig();
samdanbury 0:cae064bcbe5e 237
samdanbury 1:1f187285667c 238 attemptConnect();
samdanbury 0:cae064bcbe5e 239
samdanbury 0:cae064bcbe5e 240 if (!quickstartMode) {
samdanbury 1:1f187285667c 241 subscribe();
samdanbury 0:cae064bcbe5e 242 }
samdanbury 0:cae064bcbe5e 243
samdanbury 0:cae064bcbe5e 244 //Start thread to read data from joystick
samdanbury 0:cae064bcbe5e 245 joystickPos = "CENTRE";
samdanbury 0:cae064bcbe5e 246 Thread jThd(joystickThread);
samdanbury 0:cae064bcbe5e 247
samdanbury 0:cae064bcbe5e 248 interval = 0;
samdanbury 0:cae064bcbe5e 249 int i = 0;
samdanbury 0:cae064bcbe5e 250
samdanbury 0:cae064bcbe5e 251 while(1)
samdanbury 0:cae064bcbe5e 252 {
samdanbury 0:cae064bcbe5e 253 //Message published every second
samdanbury 0:cae064bcbe5e 254 if (i == 100) {
samdanbury 0:cae064bcbe5e 255 //MQTT Publish
samdanbury 0:cae064bcbe5e 256 MQTT::Message message;
samdanbury 0:cae064bcbe5e 257 char* pubTopic = "iot-2/evt/status/fmt/json";
samdanbury 0:cae064bcbe5e 258
samdanbury 0:cae064bcbe5e 259 char buf[250];
samdanbury 0:cae064bcbe5e 260 sprintf(buf,
samdanbury 0:cae064bcbe5e 261 "{\"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 0:cae064bcbe5e 262 MMA.x(), MMA.y(), MMA.z(),
samdanbury 0:cae064bcbe5e 263 sensor.temp(),
samdanbury 0:cae064bcbe5e 264 joystickPos,
samdanbury 0:cae064bcbe5e 265 ain1.read(),
samdanbury 0:cae064bcbe5e 266 ain2.read());
samdanbury 0:cae064bcbe5e 267 message.qos = MQTT::QOS0;
samdanbury 0:cae064bcbe5e 268 message.retained = false;
samdanbury 0:cae064bcbe5e 269 message.dup = false;
samdanbury 0:cae064bcbe5e 270 message.payload = (void*)buf;
samdanbury 0:cae064bcbe5e 271 message.payloadlen = strlen(buf);
samdanbury 0:cae064bcbe5e 272
samdanbury 1:1f187285667c 273 int rc = 0;
samdanbury 1:1f187285667c 274 if ((rc = client->publish(pubTopic, &message)) != 0) {
samdanbury 1:1f187285667c 275 connected = false;
samdanbury 1:1f187285667c 276 attemptConnect();
samdanbury 1:1f187285667c 277 }
samdanbury 0:cae064bcbe5e 278
samdanbury 0:cae064bcbe5e 279 i = 0;
samdanbury 0:cae064bcbe5e 280 }
samdanbury 0:cae064bcbe5e 281
samdanbury 0:cae064bcbe5e 282 if (interval == 0) {
samdanbury 1:1f187285667c 283 //led2 = 0;
samdanbury 0:cae064bcbe5e 284 } else {
samdanbury 0:cae064bcbe5e 285 if (i%(interval)==0) {
samdanbury 1:1f187285667c 286 //led2 = !led2;
samdanbury 0:cae064bcbe5e 287 }
samdanbury 0:cae064bcbe5e 288 }
samdanbury 0:cae064bcbe5e 289
samdanbury 0:cae064bcbe5e 290 wait(0.01);
samdanbury 0:cae064bcbe5e 291 i++;
samdanbury 1:1f187285667c 292 client->yield(1);
samdanbury 1:1f187285667c 293 }
samdanbury 1:1f187285667c 294 }
samdanbury 1:1f187285667c 295
samdanbury 1:1f187285667c 296 void attemptConnect() {
samdanbury 1:1f187285667c 297 int retryAttempt = 0;
samdanbury 1:1f187285667c 298 menuActivated = false;
samdanbury 1:1f187285667c 299
samdanbury 1:1f187285667c 300 //RGB: yellow
samdanbury 1:1f187285667c 301 r = 0;
samdanbury 1:1f187285667c 302 g = 0;
samdanbury 1:1f187285667c 303 b = 1;
samdanbury 1:1f187285667c 304
samdanbury 1:1f187285667c 305 lcd.cls();
samdanbury 1:1f187285667c 306 lcd.locate(0,0);
samdanbury 1:1f187285667c 307 lcd.printf("IBM IoT Cloud");
samdanbury 1:1f187285667c 308 lcd.locate(0,16);
samdanbury 1:1f187285667c 309 lcd.printf("Connecting");
samdanbury 1:1f187285667c 310
samdanbury 1:1f187285667c 311 while (!connected) {
samdanbury 1:1f187285667c 312
samdanbury 1:1f187285667c 313 int connTimeout = getConnTimeout(++retryAttempt);
samdanbury 1:1f187285667c 314
samdanbury 1:1f187285667c 315 connect();
samdanbury 1:1f187285667c 316
samdanbury 1:1f187285667c 317 if (!connected) {
samdanbury 1:1f187285667c 318 wait(connTimeout);
samdanbury 1:1f187285667c 319 } else {
samdanbury 1:1f187285667c 320 break;
samdanbury 1:1f187285667c 321 }
samdanbury 1:1f187285667c 322 }
samdanbury 1:1f187285667c 323 }
samdanbury 1:1f187285667c 324
samdanbury 1:1f187285667c 325 int getConnTimeout(int attemptNumber) {
samdanbury 1:1f187285667c 326 if (attemptNumber < 10) {
samdanbury 1:1f187285667c 327 return 3; //First 10 attempts try within 3 seconds
samdanbury 1:1f187285667c 328 } else if (attemptNumber < 20) {
samdanbury 1:1f187285667c 329 return 60; //Next 10 attempts retry after every 1 minute
samdanbury 1:1f187285667c 330 } else {
samdanbury 1:1f187285667c 331 return 600; //After 20 attempts, retry every 10 minutes
samdanbury 0:cae064bcbe5e 332 }
samdanbury 0:cae064bcbe5e 333 }
samdanbury 0:cae064bcbe5e 334
samdanbury 1:1f187285667c 335 void connect() {
samdanbury 1:1f187285667c 336 ipstack = MQTTSocket();
samdanbury 1:1f187285667c 337 client = new MQTT::Client<MQTTSocket, Countdown, 250>(ipstack);
samdanbury 1:1f187285667c 338
samdanbury 1:1f187285667c 339 //TCP Connect
samdanbury 1:1f187285667c 340 string ip = org + ".messaging.internetofthings.ibmcloud.com";
samdanbury 1:1f187285667c 341
samdanbury 1:1f187285667c 342 char* hostname = new char[ip.length() + 1];
samdanbury 1:1f187285667c 343 strcpy(hostname, ip.c_str());
samdanbury 1:1f187285667c 344
samdanbury 1:1f187285667c 345 int port = 1883;
samdanbury 1:1f187285667c 346 int rc = ipstack.connect(hostname, port);
samdanbury 1:1f187285667c 347 if (rc != 0) {
samdanbury 1:1f187285667c 348 lcd.printf("TCP connect failed");
samdanbury 1:1f187285667c 349 }
samdanbury 1:1f187285667c 350
samdanbury 1:1f187285667c 351 //Construct clientId based on config
samdanbury 1:1f187285667c 352 string str = string("d:") + org + ":" + type + ":" + id;
samdanbury 1:1f187285667c 353 char clientId[str.size()];
samdanbury 1:1f187285667c 354 memcpy(clientId, str.c_str(), str.size() + 1);
samdanbury 1:1f187285667c 355
samdanbury 1:1f187285667c 356 //MQTT Connect
samdanbury 1:1f187285667c 357 MQTTPacket_connectData data = MQTTPacket_connectData_initializer;
samdanbury 1:1f187285667c 358 data.MQTTVersion = 3;
samdanbury 1:1f187285667c 359 data.clientID.cstring = clientId;
samdanbury 1:1f187285667c 360
samdanbury 1:1f187285667c 361 if (!quickstartMode) {
samdanbury 1:1f187285667c 362 char* password = new char[auth_token.length() + 1];
samdanbury 1:1f187285667c 363 strcpy(password, auth_token.c_str());
samdanbury 1:1f187285667c 364
samdanbury 1:1f187285667c 365 data.username.cstring = "use-token-auth";
samdanbury 1:1f187285667c 366 data.password.cstring = password;
samdanbury 1:1f187285667c 367 }
samdanbury 1:1f187285667c 368
samdanbury 3:69ef39823eef 369 if ((rc = client->connect(&data)) == 0) {
samdanbury 1:1f187285667c 370 connected = true;
samdanbury 1:1f187285667c 371
samdanbury 1:1f187285667c 372 //RGB: green
samdanbury 1:1f187285667c 373 r = 1;
samdanbury 1:1f187285667c 374 g = 0;
samdanbury 1:1f187285667c 375 b = 1;
samdanbury 1:1f187285667c 376
samdanbury 1:1f187285667c 377 lcd.locate(0,0);
samdanbury 1:1f187285667c 378 lcd.printf("IBM IoT Cloud");
samdanbury 1:1f187285667c 379 lcd.locate(0,16);
samdanbury 1:1f187285667c 380 lcd.printf("Connected");
samdanbury 1:1f187285667c 381
samdanbury 1:1f187285667c 382 wait(2);
samdanbury 1:1f187285667c 383
samdanbury 1:1f187285667c 384 lcd.locate(0,0);
samdanbury 1:1f187285667c 385 lcd.printf("IBM IoT Cloud");
samdanbury 1:1f187285667c 386 lcd.locate(0,16);
samdanbury 1:1f187285667c 387 lcd.printf("Scroll with joystick");
samdanbury 1:1f187285667c 388
samdanbury 1:1f187285667c 389 menuActivated = true;
samdanbury 1:1f187285667c 390 }
samdanbury 1:1f187285667c 391 }
samdanbury 1:1f187285667c 392
samdanbury 1:1f187285667c 393 void subscribe() {
samdanbury 1:1f187285667c 394 char* subTopic = "iot-2/cmd/+/fmt/json";
samdanbury 1:1f187285667c 395 int rc = 0;
samdanbury 1:1f187285667c 396 if ((rc = client->subscribe(subTopic, MQTT::QOS1, messageArrived)) != 0)
samdanbury 1:1f187285667c 397 lcd.printf("rc from MQTT subscribe is %d\n", rc);
samdanbury 1:1f187285667c 398 }
samdanbury 1:1f187285667c 399
samdanbury 0:cae064bcbe5e 400 void messageArrived(MQTT::MessageData& md) {
samdanbury 0:cae064bcbe5e 401 MQTT::Message &message = md.message;
samdanbury 0:cae064bcbe5e 402
samdanbury 0:cae064bcbe5e 403 char* topic = new char[md.topicName.lenstring.len + 1];
samdanbury 0:cae064bcbe5e 404 sprintf(topic, "%.*s", md.topicName.lenstring.len, md.topicName.lenstring.data);
samdanbury 0:cae064bcbe5e 405
samdanbury 0:cae064bcbe5e 406 char* payload = new char[message.payloadlen + 1];
samdanbury 0:cae064bcbe5e 407 sprintf(payload, "%.*s", message.payloadlen, (char*)message.payload);
samdanbury 0:cae064bcbe5e 408
samdanbury 0:cae064bcbe5e 409 string topicStr = topic;
samdanbury 0:cae064bcbe5e 410 string payloadStr = payload;
samdanbury 0:cae064bcbe5e 411
samdanbury 0:cae064bcbe5e 412 //Command topic: iot-2/cmd/blink/fmt/json
samdanbury 0:cae064bcbe5e 413 string cmd = topicStr.substr(10, topicStr.find("/fmt/") - 10);
samdanbury 0:cae064bcbe5e 414
samdanbury 0:cae064bcbe5e 415 switch(getCommand(cmd)) {
samdanbury 0:cae064bcbe5e 416 case blink: {
samdanbury 0:cae064bcbe5e 417 string str = payloadStr.substr(8, payloadStr.find("}") - 8);
samdanbury 0:cae064bcbe5e 418 int rate = atoi(str.c_str());
samdanbury 0:cae064bcbe5e 419
samdanbury 0:cae064bcbe5e 420 if (rate == 0) {
samdanbury 0:cae064bcbe5e 421 interval = 0;
samdanbury 0:cae064bcbe5e 422 } else if (rate > 50) {
samdanbury 0:cae064bcbe5e 423 interval = 1;
samdanbury 0:cae064bcbe5e 424 } else if (rate > 0) {
samdanbury 0:cae064bcbe5e 425 interval = 50/rate;
samdanbury 0:cae064bcbe5e 426 }
samdanbury 0:cae064bcbe5e 427
samdanbury 0:cae064bcbe5e 428 break;
samdanbury 0:cae064bcbe5e 429 }
samdanbury 0:cae064bcbe5e 430 default:
samdanbury 0:cae064bcbe5e 431 lcd.printf("Unsupported command: %s\n", cmd);
samdanbury 0:cae064bcbe5e 432 }
samdanbury 0:cae064bcbe5e 433
samdanbury 0:cae064bcbe5e 434 if (topic) {
samdanbury 0:cae064bcbe5e 435 delete[] topic;
samdanbury 0:cae064bcbe5e 436 }
samdanbury 0:cae064bcbe5e 437 if (payload) {
samdanbury 0:cae064bcbe5e 438 delete[] payload;
samdanbury 0:cae064bcbe5e 439 }
samdanbury 0:cae064bcbe5e 440
samdanbury 0:cae064bcbe5e 441 }
samdanbury 0:cae064bcbe5e 442
samdanbury 0:cae064bcbe5e 443 command getCommand (string const& command) {
samdanbury 0:cae064bcbe5e 444 if (command == "blink")
samdanbury 0:cae064bcbe5e 445 return blink;
samdanbury 0:cae064bcbe5e 446 }
samdanbury 0:cae064bcbe5e 447
samdanbury 0:cae064bcbe5e 448 void joystickThread(void const *args) {
samdanbury 0:cae064bcbe5e 449 while (true) {
samdanbury 1:1f187285667c 450
samdanbury 1:1f187285667c 451 if (!menuActivated) {
samdanbury 1:1f187285667c 452 menu = 0;
samdanbury 1:1f187285667c 453 }
samdanbury 1:1f187285667c 454
samdanbury 1:1f187285667c 455 if (Down) {
samdanbury 0:cae064bcbe5e 456 joystickPos = "DOWN";
samdanbury 1:1f187285667c 457 if (menu >= 0 && menu < 3) {
samdanbury 1:1f187285667c 458 menu++;
samdanbury 1:1f187285667c 459 printMenu();
samdanbury 1:1f187285667c 460 }
samdanbury 1:1f187285667c 461 } else if (Left) {
samdanbury 0:cae064bcbe5e 462 joystickPos = "LEFT";
samdanbury 1:1f187285667c 463 } else if (Click) {
samdanbury 0:cae064bcbe5e 464 joystickPos = "CLICK";
samdanbury 1:1f187285667c 465 } else if (Up) {
samdanbury 0:cae064bcbe5e 466 joystickPos = "UP";
samdanbury 1:1f187285667c 467 if (menu <= 3 && menu > 0) {
samdanbury 1:1f187285667c 468 menu--;
samdanbury 1:1f187285667c 469 printMenu();
samdanbury 1:1f187285667c 470 }
samdanbury 1:1f187285667c 471 } else if (Right) {
samdanbury 0:cae064bcbe5e 472 joystickPos = "RIGHT";
samdanbury 1:1f187285667c 473 } else {
samdanbury 0:cae064bcbe5e 474 joystickPos = "CENTRE";
samdanbury 1:1f187285667c 475 }
samdanbury 1:1f187285667c 476 wait(0.2);
samdanbury 1:1f187285667c 477 }
samdanbury 1:1f187285667c 478 }
samdanbury 1:1f187285667c 479
samdanbury 1:1f187285667c 480 void printMenu() {
samdanbury 1:1f187285667c 481 if (menuActivated) {
samdanbury 1:1f187285667c 482 lcd.cls();
samdanbury 1:1f187285667c 483 lcd.locate(0,0);
samdanbury 1:1f187285667c 484
samdanbury 1:1f187285667c 485 switch(menu) {
samdanbury 1:1f187285667c 486 case 0:
samdanbury 1:1f187285667c 487 lcd.printf("IBM IoT Cloud");
samdanbury 1:1f187285667c 488 lcd.locate(0,16);
samdanbury 1:1f187285667c 489 lcd.printf("Scroll with joystick");
samdanbury 1:1f187285667c 490 break;
samdanbury 1:1f187285667c 491 case 1:
samdanbury 1:1f187285667c 492 lcd.printf("Go to:");
samdanbury 1:1f187285667c 493 lcd.locate(0,16);
samdanbury 1:1f187285667c 494 lcd.printf("http://ibm.biz/iotqstart");
samdanbury 1:1f187285667c 495 break;
samdanbury 1:1f187285667c 496 case 2:
samdanbury 1:1f187285667c 497 lcd.printf("Device Identity:");
samdanbury 1:1f187285667c 498 lcd.locate(0,16);
samdanbury 1:1f187285667c 499 lcd.printf("%s", mac);
samdanbury 1:1f187285667c 500 break;
samdanbury 1:1f187285667c 501 case 3:
samdanbury 1:1f187285667c 502 lcd.printf("Status:");
samdanbury 1:1f187285667c 503 lcd.locate(0,16);
samdanbury 1:1f187285667c 504 lcd.printf("Connected");
samdanbury 1:1f187285667c 505 break;
samdanbury 1:1f187285667c 506 }
samdanbury 1:1f187285667c 507 } else {
samdanbury 1:1f187285667c 508 menu = 0;
samdanbury 0:cae064bcbe5e 509 }
samdanbury 0:cae064bcbe5e 510 }
samdanbury 0:cae064bcbe5e 511
samdanbury 0:cae064bcbe5e 512 string getUUID48 () {
samdanbury 0:cae064bcbe5e 513
samdanbury 0:cae064bcbe5e 514 unsigned int UUID_LOC_WORD0 = 0x40048060;
samdanbury 0:cae064bcbe5e 515 unsigned int UUID_LOC_WORD1 = 0x4004805C;
samdanbury 0:cae064bcbe5e 516
samdanbury 0:cae064bcbe5e 517 // Fetch word 0
samdanbury 0:cae064bcbe5e 518 uint32_t Word0 = *(uint32_t *)UUID_LOC_WORD0;
samdanbury 0:cae064bcbe5e 519
samdanbury 0:cae064bcbe5e 520 // Fetch word 1
samdanbury 0:cae064bcbe5e 521 // we only want bottom 16 bits of word1 (MAC bits 32-47)
samdanbury 0:cae064bcbe5e 522 // and bit 9 forced to 1, bit 8 forced to 0
samdanbury 0:cae064bcbe5e 523 // Locally administered MAC, reduced conflicts
samdanbury 0:cae064bcbe5e 524 // http://en.wikipedia.org/wiki/MAC_address
samdanbury 0:cae064bcbe5e 525 uint32_t Word1 = *(uint32_t *)UUID_LOC_WORD1;
samdanbury 0:cae064bcbe5e 526 Word1 |= 0x00000200;
samdanbury 0:cae064bcbe5e 527 Word1 &= 0x0000FEFF;
samdanbury 0:cae064bcbe5e 528
samdanbury 0:cae064bcbe5e 529 string sd;
samdanbury 0:cae064bcbe5e 530 char stemp[100] = "";
samdanbury 0:cae064bcbe5e 531 snprintf(stemp, 100, "%4X%08X", Word1,Word0); // I use the safer version of sprintf() -- snprintf()
samdanbury 0:cae064bcbe5e 532 sd = stemp; // the contents of sd are now "This is a string!"
samdanbury 0:cae064bcbe5e 533
samdanbury 0:cae064bcbe5e 534 return (sd);
samdanbury 0:cae064bcbe5e 535 }