SmartREST client reference implementation for the u-blox C027 mbed compatible device.

Dependencies:   C027 C027_Support mbed mbed-rtos MbedSmartRest LM75B MMA7660 C12832

Fork of MbedSmartRestTest by Vincent Wochnik

Committer:
vwochnik
Date:
Thu Jul 03 18:52:04 2014 +0000
Revision:
35:ee1c6289e617
Parent:
34:8a0556f39161
official cumulocity library

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