Official reference client implementation for Cumulocity SmartREST on u-blox C027.

Dependencies:   C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed

Fork of MbedSmartRestMain by Vincent Wochnik

Committer:
Cumulocity
Date:
Mon Jul 07 14:20:42 2014 +0000
Revision:
36:2f6a023f0504
Parent:
34:8a0556f39161
Child:
37:4a7f58dd03d2
fix device bootstrap

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vwochnik 6:642e7c233e83 1 #include "common.h"
vwochnik 12:beb64aa0da86 2 #include "io.h"
vwochnik 6:642e7c233e83 3 #include "StaticData.h"
vwochnik 6:642e7c233e83 4 #include "ComposedRecord.h"
vwochnik 6:642e7c233e83 5 #include "CharValue.h"
vwochnik 6:642e7c233e83 6 #include "IntegerValue.h"
vwochnik 6:642e7c233e83 7 #include "FloatValue.h"
vwochnik 13:4045b6ac448d 8 #include "Aggregator.h"
vwochnik 6:642e7c233e83 9
vwochnik 33:b7d7e6fc421e 10 /************* CONFIGURATION *************/
vwochnik 33:b7d7e6fc421e 11
vwochnik 33:b7d7e6fc421e 12 /* Credentials for device bootstrap authentification.
vwochnik 33:b7d7e6fc421e 13 * Contact cumulocity to get credentials. */
vwochnik 33:b7d7e6fc421e 14 #define DEVICEBOOTSTRAP_USERNAME ""
vwochnik 33:b7d7e6fc421e 15 #define DEVICEBOOTSTRAP_PASSWORD ""
vwochnik 33:b7d7e6fc421e 16
vwochnik 33:b7d7e6fc421e 17 /* Uncomment and fill in credentials to turn off device bootstrapping. */
vwochnik 33:b7d7e6fc421e 18 //#define CREDENTIALS_USERNAME ""
vwochnik 33:b7d7e6fc421e 19 //#define CREDENTIALS_PASSWORD ""
vwochnik 33:b7d7e6fc421e 20
vwochnik 33:b7d7e6fc421e 21 /* Template device identifier */
vwochnik 33:b7d7e6fc421e 22 #define TEMPLATE_DEVICE_IDENTIFIER "com_u-blox_C027_REV-A_0.10_Test1233123"
vwochnik 33:b7d7e6fc421e 23
vwochnik 33:b7d7e6fc421e 24 /*****************************************/
vwochnik 33:b7d7e6fc421e 25
vwochnik 33:b7d7e6fc421e 26 bool deviceBootstrap();
vwochnik 8:940c782eec5e 27 long existing();
vwochnik 8:940c782eec5e 28 long create();
vwochnik 8:940c782eec5e 29 bool identify(long deviceId);
vwochnik 8:940c782eec5e 30 bool update(long deviceId);
vwochnik 8:940c782eec5e 31 void loop(long deviceId);
vwochnik 13:4045b6ac448d 32 void signalMeasurement(long deviceId, Aggregator& aggr);
vwochnik 13:4045b6ac448d 33 void temperatureMeasurement(long deviceId, Aggregator& aggr);
vwochnik 19:7bee744fe527 34 void analogMeasurement(long deviceId, Aggregator& aggr);
vwochnik 13:4045b6ac448d 35 void motionMeasurement(long deviceId, Aggregator& aggr);
vwochnik 8:940c782eec5e 36
vwochnik 32:56804dd00193 37 credentials_t credentials = {};
vwochnik 31:912c140ee050 38
vwochnik 6:642e7c233e83 39 StaticData srtpl(
vwochnik 6:642e7c233e83 40 // get device by identity
vwochnik 6:642e7c233e83 41 // Usage: 100,<SERIAL/NR>
vwochnik 6:642e7c233e83 42 "10,100,GET,/identity/externalIds/c8y_Serial/%%,,application/vnd.com.nsn.cumulocity.externalId+json,%%,STRING,\r\n"
vwochnik 6:642e7c233e83 43 // get device id from identity
vwochnik 6:642e7c233e83 44 // Response: 200,<DEVICE/ID>
vwochnik 6:642e7c233e83 45 "11,200,\"$.managedObject\",,\"$.id\"\r\n"
vwochnik 6:642e7c233e83 46 // Create device
vwochnik 6:642e7c233e83 47 // Usage: 101,<SERIAL/NR>
vwochnik 19:7bee744fe527 48 "10,101,POST,/inventory/managedObjects,application/vnd.com.nsn.cumulocity.managedObject+json,application/vnd.com.nsn.cumulocity.managedObject+json,%%,STRING,\"{\"\"name\"\":\"\"Mbed Test Device\"\",\"\"type\"\":\"\"com_ublox_C027_REV-A\"\",\"\"c8y_Hardware\"\":{\"\"revision\"\":\"\"1\"\",\"\"model\"\":\"\"Ublox C027\"\",\"\"serialNumber\"\":\"\"%%\"\"},\"\"c8y_SupportedMeasurements\"\":[\"\"c8y_SignalStrength\"\",\"\"c8y_TemperatureMeasurement\"\",\"\"c8y_AnalogMeasurement\"\",\"\"c8y_MotionMeasurement\"\"],\"\"c8y_RequiredAvailability\"\":{ \"\"responseInterval\"\":15},\"\"c8y_IsDevice\"\":{}}\"\r\n"
vwochnik 6:642e7c233e83 49 // Get device id
vwochnik 6:642e7c233e83 50 // Response: 201,<DEVICE/ID>
vwochnik 6:642e7c233e83 51 "11,201,,\"$.c8y_IsDevice\",\"$.id\"\r\n"
vwochnik 6:642e7c233e83 52 // Insert global ID
vwochnik 6:642e7c233e83 53 // Usage: 102,<DEVICE/ID>,<SERIAL/NR>
vwochnik 6:642e7c233e83 54 "10,102,POST,/identity/globalIds/%%/externalIds,application/vnd.com.nsn.cumulocity.externalId+json,application/vnd.com.nsn.cumulocity.externalId+json,%%,UNSIGNED STRING,\"{\"\"type\"\":\"\"c8y_Serial\"\",\"\"externalId\"\":\"\"%%\"\"}\"\r\n"
vwochnik 7:f77afd49c35d 55 // Update IMEI, CellId and iccid
vwochnik 7:f77afd49c35d 56 // Usage: 103,<DEVICE/ID>,<IMEI>,<CELL/ID>,<ICCID>
vwochnik 7:f77afd49c35d 57 "10,103,PUT,/inventory/managedObjects/%%,application/vnd.com.nsn.cumulocity.managedObject+json,application/vnd.com.nsn.cumulocity.managedObject+json,%%,UNSIGNED STRING STRING STRING,\"{\"\"c8y_Mobile\"\":{\"\"imei\"\":\"\"%%\"\",\"\"cellId\"\":\"\"%%\"\",\"\"iccid\"\":\"\"%%\"\"}}\"\r\n"
vwochnik 6:642e7c233e83 58 // Insert measurement
vwochnik 7:f77afd49c35d 59 // USAGE: 104,<DEVICE/ID>,<RSSI>,<BER>
vwochnik 7:f77afd49c35d 60 "10,104,POST,/measurement/measurements,application/vnd.com.nsn.cumulocity.measurement+json,application/vnd.com.nsn.cumulocity.measurement+json,%%,NOW UNSIGNED NUMBER UNSIGNED,\"{\"\"time\"\":\"\"%%\"\",\"\"source\"\":{\"\"id\"\":\"\"%%\"\"},\"\"type\"\":\"\"c8y_SignalStrength\"\",\"\"c8y_SignalStrength\"\":{\"\"rssi\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"dBm\"\"},\"\"ber\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"%\"\"}}}\"\r\n"
vwochnik 13:4045b6ac448d 61 // Insert measurement
vwochnik 13:4045b6ac448d 62 // USAGE: 105,<DEVICE/ID>,<TEMPERATURE>
vwochnik 13:4045b6ac448d 63 "10,105,POST,/measurement/measurements,application/vnd.com.nsn.cumulocity.measurement+json,application/vnd.com.nsn.cumulocity.measurement+json,%%,NOW UNSIGNED NUMBER,\"{\"\"time\"\":\"\"%%\"\",\"\"source\"\":{\"\"id\"\":\"\"%%\"\"},\"\"type\"\":\"\"c8y_TemperatureMeasurement\"\",\"\"c8y_TemperatureMeasurement\"\":{\"\"T\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"C\"\"}}}\"\r\n"
vwochnik 13:4045b6ac448d 64 // Insert measurement
vwochnik 19:7bee744fe527 65 // USAGE: 105,<DEVICE/ID>,<ANALOG0>,<ANALOG1>
vwochnik 19:7bee744fe527 66 "10,106,POST,/measurement/measurements,application/vnd.com.nsn.cumulocity.measurement+json,application/vnd.com.nsn.cumulocity.measurement+json,%%,NOW UNSIGNED UNSIGNED UNSIGNED,\"{\"\"time\"\":\"\"%%\"\",\"\"source\"\":{\"\"id\"\":\"\"%%\"\"},\"\"type\"\":\"\"c8y_AnalogMeasurement\"\",\"\"c8y_AnalogMeasurement\"\":{\"\"analog0\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"%\"\"},\"\"analog1\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"%\"\"}}}\"\r\n"
vwochnik 13:4045b6ac448d 67 // Insert measurement
vwochnik 13:4045b6ac448d 68 // USAGE: 105,<DEVICE/ID>,<X>,<Y>,<Z>
vwochnik 13:4045b6ac448d 69 "10,107,POST,/measurement/measurements,application/vnd.com.nsn.cumulocity.measurement+json,application/vnd.com.nsn.cumulocity.measurement+json,%%,NOW UNSIGNED NUMBER NUMBER NUMBER,\"{\"\"time\"\":\"\"%%\"\",\"\"source\"\":{\"\"id\"\":\"\"%%\"\"},\"\"type\"\":\"\"c8y_MotionMeasurement\"\",\"\"c8y_MotionMeasurement\"\":{\"\"x\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"m^2/s\"\"},\"\"y\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"m^2/s\"\"},\"\"z\"\":{\"\"value\"\":%%,\"\"unit\"\":\"\"m^2/s\"\"}}}\"\r\n"
vwochnik 6:642e7c233e83 70 );
vwochnik 6:642e7c233e83 71
vwochnik 8:940c782eec5e 72 float interval = 120.0; // send measurements every two minutes
vwochnik 31:912c140ee050 73
Cumulocity 36:2f6a023f0504 74 MbedSmartRest client("developer.cumulocity.com", 80, credentials.username, credentials.password, TEMPLATE_DEVICE_IDENTIFIER);
vwochnik 6:642e7c233e83 75
vwochnik 6:642e7c233e83 76 int program(void)
vwochnik 6:642e7c233e83 77 {
vwochnik 15:0ccf0f530a05 78 long deviceId = 0; Timer timer;
vwochnik 8:940c782eec5e 79
vwochnik 33:b7d7e6fc421e 80 #ifndef CREDENTIALS_USERNAME
vwochnik 33:b7d7e6fc421e 81 // read credentials from modem or make a device bootstrapping
vwochnik 32:56804dd00193 82 if (!credentials_read(&credentials)) {
vwochnik 33:b7d7e6fc421e 83 puts("Could not read credentials. Starting bootstrapping process.");
vwochnik 33:b7d7e6fc421e 84 if (!deviceBootstrap()) {
vwochnik 33:b7d7e6fc421e 85 puts("Device bootstrap failed.");
vwochnik 33:b7d7e6fc421e 86 return 1;
vwochnik 33:b7d7e6fc421e 87 }
vwochnik 32:56804dd00193 88 }
vwochnik 33:b7d7e6fc421e 89 #else
vwochnik 33:b7d7e6fc421e 90 // copy hardcoded credentials
vwochnik 33:b7d7e6fc421e 91 strcpy(credentials.username, CREDENTIALS_USERNAME);
vwochnik 33:b7d7e6fc421e 92 strcpy(credentials.password, CREDENTIALS_PASSWORD);
vwochnik 33:b7d7e6fc421e 93 #endif
vwochnik 33:b7d7e6fc421e 94
vwochnik 32:56804dd00193 95 lcd_tenant(credentials.username);
vwochnik 6:642e7c233e83 96 puts("Hello!");
vwochnik 24:8f9b678a7932 97
vwochnik 6:642e7c233e83 98 puts("Bootstrapping");
vwochnik 20:ef9cc1b42e9d 99 lcd_status("Bootstrapping");
vwochnik 6:642e7c233e83 100 if (client.bootstrap(srtpl) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 101 puts("Bootstrapping failed.");
vwochnik 20:ef9cc1b42e9d 102 lcd_status("Bootstrapping failed.");
vwochnik 6:642e7c233e83 103 return 2;
vwochnik 6:642e7c233e83 104 }
vwochnik 24:8f9b678a7932 105
vwochnik 6:642e7c233e83 106 puts("Starting action...");
vwochnik 6:642e7c233e83 107
vwochnik 6:642e7c233e83 108 if ((deviceId = existing()) == 0) {
vwochnik 20:ef9cc1b42e9d 109 if (((deviceId = create()) == 0) || (!identify(deviceId))) {
vwochnik 20:ef9cc1b42e9d 110 lcd_status("Device creation failed.");
vwochnik 7:f77afd49c35d 111 return 1;
vwochnik 20:ef9cc1b42e9d 112 }
vwochnik 6:642e7c233e83 113 }
vwochnik 19:7bee744fe527 114 update(deviceId);
vwochnik 6:642e7c233e83 115 printf("Device ID: %ld\r\n", deviceId);
vwochnik 8:940c782eec5e 116
vwochnik 8:940c782eec5e 117 timer.start();
vwochnik 7:f77afd49c35d 118 while (true) {
vwochnik 8:940c782eec5e 119 timer.reset();
vwochnik 8:940c782eec5e 120 loop(deviceId);
vwochnik 8:940c782eec5e 121
vwochnik 20:ef9cc1b42e9d 122 lcd_status("Sleeping...");
vwochnik 8:940c782eec5e 123 // block remaining number of seconds
vwochnik 16:94d6eae3195a 124 while (timer.read() < interval) {
vwochnik 16:94d6eae3195a 125 Thread::yield();
vwochnik 16:94d6eae3195a 126 }
vwochnik 6:642e7c233e83 127 }
vwochnik 6:642e7c233e83 128 }
vwochnik 6:642e7c233e83 129
vwochnik 33:b7d7e6fc421e 130 bool deviceBootstrap()
vwochnik 33:b7d7e6fc421e 131 {
vwochnik 33:b7d7e6fc421e 132 uint8_t ret;
vwochnik 33:b7d7e6fc421e 133
Cumulocity 36:2f6a023f0504 134 ComposedRecord record;
vwochnik 33:b7d7e6fc421e 135 ParsedRecord received;
Cumulocity 36:2f6a023f0504 136
Cumulocity 36:2f6a023f0504 137 IntegerValue msgId(60);
Cumulocity 36:2f6a023f0504 138 CharValue identifier(imei());
Cumulocity 36:2f6a023f0504 139 if ((!record.add(msgId)) || (!record.add(identifier)))
Cumulocity 36:2f6a023f0504 140 return false;
vwochnik 33:b7d7e6fc421e 141
vwochnik 33:b7d7e6fc421e 142 // copy credentials
vwochnik 33:b7d7e6fc421e 143 strcpy(credentials.username, DEVICEBOOTSTRAP_USERNAME);
vwochnik 33:b7d7e6fc421e 144 strcpy(credentials.password, DEVICEBOOTSTRAP_PASSWORD);
vwochnik 33:b7d7e6fc421e 145
vwochnik 33:b7d7e6fc421e 146 while (true) {
Cumulocity 36:2f6a023f0504 147 if (client.send(record, "") != SMARTREST_SUCCESS) {
vwochnik 33:b7d7e6fc421e 148 puts("Connection unsuccessful. Retrying.");
vwochnik 33:b7d7e6fc421e 149 client.stop();
vwochnik 33:b7d7e6fc421e 150 Thread::wait(2000);
vwochnik 33:b7d7e6fc421e 151 continue;
vwochnik 33:b7d7e6fc421e 152 }
vwochnik 33:b7d7e6fc421e 153
vwochnik 33:b7d7e6fc421e 154 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 33:b7d7e6fc421e 155 puts("Not received anything. Retrying.");
vwochnik 33:b7d7e6fc421e 156 client.stop();
vwochnik 33:b7d7e6fc421e 157 Thread::wait(2000);
vwochnik 33:b7d7e6fc421e 158 continue;
vwochnik 33:b7d7e6fc421e 159 }
vwochnik 33:b7d7e6fc421e 160 client.stop();
vwochnik 33:b7d7e6fc421e 161
vwochnik 33:b7d7e6fc421e 162 if (received.values() < 1) {
vwochnik 33:b7d7e6fc421e 163 puts("Bad received values. Retrying.");
vwochnik 33:b7d7e6fc421e 164 Thread::wait(2000);
vwochnik 33:b7d7e6fc421e 165 continue;
vwochnik 33:b7d7e6fc421e 166 }
vwochnik 33:b7d7e6fc421e 167
vwochnik 33:b7d7e6fc421e 168 if (received.value(0).integerValue() == 50) {
Cumulocity 36:2f6a023f0504 169 puts("No credentials available yet. Retrying.");
vwochnik 33:b7d7e6fc421e 170 Thread::wait(2000);
vwochnik 33:b7d7e6fc421e 171 continue;
vwochnik 33:b7d7e6fc421e 172 }
vwochnik 33:b7d7e6fc421e 173
vwochnik 33:b7d7e6fc421e 174 if (received.value(0).integerValue() != 70) {
vwochnik 33:b7d7e6fc421e 175 puts("Unknown received message identifier.");
vwochnik 33:b7d7e6fc421e 176 return false;
vwochnik 33:b7d7e6fc421e 177 }
vwochnik 33:b7d7e6fc421e 178
vwochnik 33:b7d7e6fc421e 179 if (received.values() != 6) {
vwochnik 33:b7d7e6fc421e 180 puts("Bad credentials received.");
vwochnik 33:b7d7e6fc421e 181 return false;
vwochnik 33:b7d7e6fc421e 182 }
vwochnik 33:b7d7e6fc421e 183
vwochnik 33:b7d7e6fc421e 184 credentials_set(&credentials, received.value(3).characterValue(), received.value(4).characterValue(), received.value(5).characterValue());
vwochnik 33:b7d7e6fc421e 185
vwochnik 33:b7d7e6fc421e 186 printf("Username: %s\nPassword: %s\n", credentials.username, credentials.password);
vwochnik 33:b7d7e6fc421e 187
vwochnik 33:b7d7e6fc421e 188 credentials_write(&credentials);
vwochnik 33:b7d7e6fc421e 189
vwochnik 33:b7d7e6fc421e 190 return true;
vwochnik 33:b7d7e6fc421e 191 }
vwochnik 33:b7d7e6fc421e 192 }
vwochnik 33:b7d7e6fc421e 193
vwochnik 6:642e7c233e83 194 long existing()
vwochnik 6:642e7c233e83 195 {
vwochnik 6:642e7c233e83 196 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 6:642e7c233e83 197 ParsedRecord received;
vwochnik 6:642e7c233e83 198
vwochnik 20:ef9cc1b42e9d 199 lcd_status("Checking device existance...");
vwochnik 6:642e7c233e83 200 puts("Checking for device existance...");
vwochnik 6:642e7c233e83 201
vwochnik 34:8a0556f39161 202 if ((!newMoRec.add(IntegerValue(100))) || (!newMoRec.add(CharValue(imei()))))
vwochnik 34:8a0556f39161 203 return 0;
vwochnik 6:642e7c233e83 204
vwochnik 6:642e7c233e83 205 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 206 puts("Send failed.");
vwochnik 10:d5cd4a7ada7b 207 client.stop();
vwochnik 6:642e7c233e83 208 return 0;
vwochnik 6:642e7c233e83 209 }
vwochnik 6:642e7c233e83 210
vwochnik 6:642e7c233e83 211 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 212 puts("No device found.");
vwochnik 10:d5cd4a7ada7b 213 client.stop();
vwochnik 6:642e7c233e83 214 return 0;
vwochnik 6:642e7c233e83 215 }
vwochnik 6:642e7c233e83 216
vwochnik 6:642e7c233e83 217 if (received.values() == 0) {
vwochnik 6:642e7c233e83 218 puts("Received no values.");
vwochnik 10:d5cd4a7ada7b 219 client.stop();
vwochnik 6:642e7c233e83 220 return 0;
vwochnik 6:642e7c233e83 221 }
vwochnik 10:d5cd4a7ada7b 222
vwochnik 6:642e7c233e83 223 if (received.value(0).integerValue() == 50) {
vwochnik 6:642e7c233e83 224 client.stop();
vwochnik 6:642e7c233e83 225 return 0;
vwochnik 6:642e7c233e83 226 }
vwochnik 6:642e7c233e83 227
vwochnik 6:642e7c233e83 228 if (received.value(0).integerValue() != 200) {
vwochnik 6:642e7c233e83 229 puts("Bad response.");
vwochnik 10:d5cd4a7ada7b 230 client.stop();
vwochnik 6:642e7c233e83 231 return 0;
vwochnik 6:642e7c233e83 232 }
vwochnik 6:642e7c233e83 233
vwochnik 6:642e7c233e83 234 client.stop();
vwochnik 6:642e7c233e83 235 return received.value(2).integerValue();
vwochnik 6:642e7c233e83 236 }
vwochnik 6:642e7c233e83 237
vwochnik 6:642e7c233e83 238 long create()
vwochnik 6:642e7c233e83 239 {
vwochnik 6:642e7c233e83 240 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 6:642e7c233e83 241 ParsedRecord received;
vwochnik 6:642e7c233e83 242
vwochnik 20:ef9cc1b42e9d 243 lcd_status("Creating device...");
vwochnik 6:642e7c233e83 244 puts("Creating device...");
vwochnik 6:642e7c233e83 245
vwochnik 34:8a0556f39161 246 if ((!newMoRec.add(IntegerValue(101))) || (!newMoRec.add(CharValue(imei()))))
vwochnik 34:8a0556f39161 247 return 0;
vwochnik 6:642e7c233e83 248
vwochnik 6:642e7c233e83 249 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 250 puts("Send failed.");
vwochnik 10:d5cd4a7ada7b 251 client.stop();
vwochnik 6:642e7c233e83 252 return 0;
vwochnik 6:642e7c233e83 253 }
vwochnik 6:642e7c233e83 254
vwochnik 6:642e7c233e83 255 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 256 puts("No device found.");
vwochnik 10:d5cd4a7ada7b 257 client.stop();
vwochnik 6:642e7c233e83 258 return 0;
vwochnik 6:642e7c233e83 259 }
vwochnik 6:642e7c233e83 260
vwochnik 6:642e7c233e83 261 if (received.values() != 3) {
vwochnik 6:642e7c233e83 262 puts("Bad received data.");
vwochnik 10:d5cd4a7ada7b 263 client.stop();
vwochnik 6:642e7c233e83 264 return 0;
vwochnik 6:642e7c233e83 265 }
vwochnik 6:642e7c233e83 266
vwochnik 6:642e7c233e83 267 if (received.value(0).integerValue() != 201) {
vwochnik 6:642e7c233e83 268 puts("Bad received data.");
vwochnik 10:d5cd4a7ada7b 269 client.stop();
vwochnik 6:642e7c233e83 270 return 0;
vwochnik 6:642e7c233e83 271 }
vwochnik 6:642e7c233e83 272
vwochnik 6:642e7c233e83 273 client.stop();
vwochnik 6:642e7c233e83 274 return received.value(2).integerValue();
vwochnik 6:642e7c233e83 275 }
vwochnik 6:642e7c233e83 276
vwochnik 6:642e7c233e83 277 bool identify(long deviceId)
vwochnik 6:642e7c233e83 278 {
vwochnik 6:642e7c233e83 279 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 6:642e7c233e83 280 ParsedRecord received;
vwochnik 6:642e7c233e83 281
vwochnik 6:642e7c233e83 282 puts("Adding global identifier...");
vwochnik 6:642e7c233e83 283
vwochnik 34:8a0556f39161 284 if ((!newMoRec.add(IntegerValue(102))) || (!newMoRec.add(IntegerValue(deviceId))) || (!newMoRec.add(CharValue(imei()))))
vwochnik 34:8a0556f39161 285 return 0;
vwochnik 6:642e7c233e83 286
vwochnik 6:642e7c233e83 287 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 288 puts("Sending failed.");
vwochnik 10:d5cd4a7ada7b 289 client.stop();
vwochnik 6:642e7c233e83 290 return false;
vwochnik 6:642e7c233e83 291 }
vwochnik 6:642e7c233e83 292
vwochnik 6:642e7c233e83 293 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 294 puts("Failed.");
vwochnik 10:d5cd4a7ada7b 295 client.stop();
vwochnik 6:642e7c233e83 296 return false;
vwochnik 6:642e7c233e83 297 }
vwochnik 6:642e7c233e83 298
vwochnik 6:642e7c233e83 299 if (received.values() != 3) {
vwochnik 6:642e7c233e83 300 puts("Received bad data.");
vwochnik 10:d5cd4a7ada7b 301 client.stop();
vwochnik 6:642e7c233e83 302 return false;
vwochnik 6:642e7c233e83 303 }
vwochnik 6:642e7c233e83 304
vwochnik 6:642e7c233e83 305 if (received.value(0).integerValue() != 200) {
vwochnik 6:642e7c233e83 306 puts("Received bad data.");
vwochnik 10:d5cd4a7ada7b 307 client.stop();
vwochnik 6:642e7c233e83 308 return false;
vwochnik 6:642e7c233e83 309 }
vwochnik 6:642e7c233e83 310
vwochnik 6:642e7c233e83 311 client.stop();
vwochnik 6:642e7c233e83 312 return true;
vwochnik 6:642e7c233e83 313 }
vwochnik 6:642e7c233e83 314
vwochnik 7:f77afd49c35d 315 bool update(long deviceId)
vwochnik 7:f77afd49c35d 316 {
vwochnik 7:f77afd49c35d 317 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 7:f77afd49c35d 318 ParsedRecord received;
vwochnik 7:f77afd49c35d 319
vwochnik 20:ef9cc1b42e9d 320 lcd_status("Updating device object...");
vwochnik 7:f77afd49c35d 321 puts("Updating device data...");
vwochnik 7:f77afd49c35d 322
vwochnik 34:8a0556f39161 323 if ((!newMoRec.add(IntegerValue(103))) || (!newMoRec.add(IntegerValue(deviceId))) || (!newMoRec.add(CharValue(imei()))) || (!newMoRec.add(CharValue(cellId()))) || (!newMoRec.add(CharValue(iccid()))))
vwochnik 34:8a0556f39161 324 return false;
vwochnik 7:f77afd49c35d 325
vwochnik 7:f77afd49c35d 326 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 7:f77afd49c35d 327 puts("Send failed.");
vwochnik 10:d5cd4a7ada7b 328 client.stop();
vwochnik 7:f77afd49c35d 329 return false;
vwochnik 7:f77afd49c35d 330 }
vwochnik 7:f77afd49c35d 331
vwochnik 7:f77afd49c35d 332 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 7:f77afd49c35d 333 puts("Update failed.");
vwochnik 10:d5cd4a7ada7b 334 client.stop();
vwochnik 7:f77afd49c35d 335 return false;
vwochnik 7:f77afd49c35d 336 }
vwochnik 7:f77afd49c35d 337
vwochnik 7:f77afd49c35d 338 if (received.values() != 3) {
vwochnik 7:f77afd49c35d 339 puts("Bad received data.");
vwochnik 10:d5cd4a7ada7b 340 client.stop();
vwochnik 7:f77afd49c35d 341 return false;
vwochnik 7:f77afd49c35d 342 }
vwochnik 7:f77afd49c35d 343
vwochnik 7:f77afd49c35d 344 if (received.value(0).integerValue() != 201) {
vwochnik 7:f77afd49c35d 345 puts("Bad received data.");
vwochnik 10:d5cd4a7ada7b 346 client.stop();
vwochnik 7:f77afd49c35d 347 return false;
vwochnik 7:f77afd49c35d 348 }
vwochnik 7:f77afd49c35d 349
vwochnik 7:f77afd49c35d 350 client.stop();
vwochnik 7:f77afd49c35d 351
vwochnik 7:f77afd49c35d 352 return true;
vwochnik 7:f77afd49c35d 353 }
vwochnik 7:f77afd49c35d 354
vwochnik 8:940c782eec5e 355 void loop(long deviceId)
vwochnik 8:940c782eec5e 356 {
vwochnik 34:8a0556f39161 357 Aggregator aggr(true);
vwochnik 8:940c782eec5e 358
vwochnik 20:ef9cc1b42e9d 359 lcd_status("Sending measurements...");
vwochnik 26:26e9899e2cbe 360 temperatureMeasurement(deviceId, aggr);
vwochnik 13:4045b6ac448d 361 signalMeasurement(deviceId, aggr);
vwochnik 19:7bee744fe527 362 analogMeasurement(deviceId, aggr);
vwochnik 13:4045b6ac448d 363 motionMeasurement(deviceId, aggr);
vwochnik 6:642e7c233e83 364
vwochnik 13:4045b6ac448d 365 if (client.send(aggr) != SMARTREST_SUCCESS) {
vwochnik 25:8604bef314c1 366 puts("Loop send failed.");
vwochnik 6:642e7c233e83 367 }
vwochnik 6:642e7c233e83 368 client.stop();
vwochnik 13:4045b6ac448d 369 }
vwochnik 13:4045b6ac448d 370
vwochnik 13:4045b6ac448d 371 void signalMeasurement(long deviceId, Aggregator& aggr)
vwochnik 13:4045b6ac448d 372 {
vwochnik 13:4045b6ac448d 373 sigq_t *sq = signalQuality();
vwochnik 13:4045b6ac448d 374
vwochnik 13:4045b6ac448d 375 if ((sq->rssi == 0) || (sq->ber == 0))
vwochnik 13:4045b6ac448d 376 return;
vwochnik 13:4045b6ac448d 377
vwochnik 13:4045b6ac448d 378 ComposedRecord measurement;
vwochnik 13:4045b6ac448d 379 IntegerValue msgId(104);
vwochnik 13:4045b6ac448d 380 IntegerValue devId(deviceId);
vwochnik 13:4045b6ac448d 381 FloatValue rssi(sq->rssi, 0);
vwochnik 13:4045b6ac448d 382 IntegerValue ber(sq->ber);
vwochnik 34:8a0556f39161 383 if ((!measurement.add(msgId)) || (!measurement.add(devId)) || (!measurement.add(rssi)) || (!measurement.add(ber)))
vwochnik 34:8a0556f39161 384 return;
vwochnik 13:4045b6ac448d 385 aggr.add(measurement);
vwochnik 10:d5cd4a7ada7b 386 }
vwochnik 13:4045b6ac448d 387
vwochnik 13:4045b6ac448d 388 void temperatureMeasurement(long deviceId, Aggregator& aggr)
vwochnik 13:4045b6ac448d 389 {
vwochnik 13:4045b6ac448d 390 ComposedRecord measurement;
vwochnik 13:4045b6ac448d 391 IntegerValue msgId(105);
vwochnik 13:4045b6ac448d 392 IntegerValue devId(deviceId);
vwochnik 13:4045b6ac448d 393 FloatValue temp(temperature(), 1);
vwochnik 34:8a0556f39161 394 if ((!measurement.add(msgId)) || (!measurement.add(devId)) || (!measurement.add(temp)))
vwochnik 34:8a0556f39161 395 return;
vwochnik 13:4045b6ac448d 396 aggr.add(measurement);
vwochnik 13:4045b6ac448d 397 }
vwochnik 13:4045b6ac448d 398
vwochnik 19:7bee744fe527 399 void analogMeasurement(long deviceId, Aggregator& aggr)
vwochnik 13:4045b6ac448d 400 {
vwochnik 19:7bee744fe527 401 long analog0 = (long)(potentiometer(0) * 100.0);
vwochnik 19:7bee744fe527 402 long analog1 = (long)(potentiometer(1) * 100.0);
vwochnik 13:4045b6ac448d 403 ComposedRecord measurement;
vwochnik 13:4045b6ac448d 404 IntegerValue msgId(106);
vwochnik 13:4045b6ac448d 405 IntegerValue devId(deviceId);
vwochnik 19:7bee744fe527 406 IntegerValue an0(analog0);
vwochnik 19:7bee744fe527 407 IntegerValue an1(analog1);
vwochnik 34:8a0556f39161 408 if ((!measurement.add(msgId)) || (!measurement.add(devId)) || (!measurement.add(an0)) || (!measurement.add(an1)))
vwochnik 34:8a0556f39161 409 return;
vwochnik 13:4045b6ac448d 410 aggr.add(measurement);
vwochnik 13:4045b6ac448d 411 }
vwochnik 13:4045b6ac448d 412
vwochnik 13:4045b6ac448d 413 void motionMeasurement(long deviceId, Aggregator& aggr)
vwochnik 13:4045b6ac448d 414 {
vwochnik 13:4045b6ac448d 415 acceleration_t acc = acceleration();
vwochnik 13:4045b6ac448d 416 ComposedRecord measurement;
vwochnik 13:4045b6ac448d 417 IntegerValue msgId(107);
vwochnik 13:4045b6ac448d 418 IntegerValue devId(deviceId);
vwochnik 13:4045b6ac448d 419 FloatValue x(acc.x, 2);
vwochnik 13:4045b6ac448d 420 FloatValue y(acc.y, 2);
vwochnik 13:4045b6ac448d 421 FloatValue z(acc.z, 2);
vwochnik 34:8a0556f39161 422 if ((!measurement.add(msgId)) || (!measurement.add(devId)) || (!measurement.add(x)) || (!measurement.add(y)) || (!measurement.add(z)))
vwochnik 34:8a0556f39161 423 return;
vwochnik 13:4045b6ac448d 424 aggr.add(measurement);
vwochnik 13:4045b6ac448d 425 }