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 Jun 12 14:33:04 2014 +0000
Revision:
33:b7d7e6fc421e
Parent:
32:56804dd00193
Child:
34:8a0556f39161
device bootstrapping

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 12:beb64aa0da86 227 newMoRec.add(IntegerValue(100)).add(CharValue(imei()));
vwochnik 6:642e7c233e83 228
vwochnik 6:642e7c233e83 229 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 230 puts("Send failed.");
vwochnik 10:d5cd4a7ada7b 231 client.stop();
vwochnik 6:642e7c233e83 232 return 0;
vwochnik 6:642e7c233e83 233 }
vwochnik 6:642e7c233e83 234
vwochnik 6:642e7c233e83 235 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 236 puts("No device found.");
vwochnik 10:d5cd4a7ada7b 237 client.stop();
vwochnik 6:642e7c233e83 238 return 0;
vwochnik 6:642e7c233e83 239 }
vwochnik 6:642e7c233e83 240
vwochnik 6:642e7c233e83 241 if (received.values() == 0) {
vwochnik 6:642e7c233e83 242 puts("Received no values.");
vwochnik 10:d5cd4a7ada7b 243 client.stop();
vwochnik 6:642e7c233e83 244 return 0;
vwochnik 6:642e7c233e83 245 }
vwochnik 10:d5cd4a7ada7b 246
vwochnik 6:642e7c233e83 247 if (received.value(0).integerValue() == 50) {
vwochnik 6:642e7c233e83 248 client.stop();
vwochnik 6:642e7c233e83 249 return 0;
vwochnik 6:642e7c233e83 250 }
vwochnik 6:642e7c233e83 251
vwochnik 6:642e7c233e83 252 if (received.value(0).integerValue() != 200) {
vwochnik 6:642e7c233e83 253 puts("Bad response.");
vwochnik 10:d5cd4a7ada7b 254 client.stop();
vwochnik 6:642e7c233e83 255 return 0;
vwochnik 6:642e7c233e83 256 }
vwochnik 6:642e7c233e83 257
vwochnik 6:642e7c233e83 258 client.stop();
vwochnik 6:642e7c233e83 259 return received.value(2).integerValue();
vwochnik 6:642e7c233e83 260 }
vwochnik 6:642e7c233e83 261
vwochnik 6:642e7c233e83 262 long create()
vwochnik 6:642e7c233e83 263 {
vwochnik 6:642e7c233e83 264 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 6:642e7c233e83 265 ParsedRecord received;
vwochnik 6:642e7c233e83 266
vwochnik 20:ef9cc1b42e9d 267 lcd_status("Creating device...");
vwochnik 6:642e7c233e83 268 puts("Creating device...");
vwochnik 6:642e7c233e83 269
vwochnik 12:beb64aa0da86 270 newMoRec.add(IntegerValue(101)).add(CharValue(imei()));
vwochnik 6:642e7c233e83 271
vwochnik 6:642e7c233e83 272 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 273 puts("Send failed.");
vwochnik 10:d5cd4a7ada7b 274 client.stop();
vwochnik 6:642e7c233e83 275 return 0;
vwochnik 6:642e7c233e83 276 }
vwochnik 6:642e7c233e83 277
vwochnik 6:642e7c233e83 278 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 279 puts("No device found.");
vwochnik 10:d5cd4a7ada7b 280 client.stop();
vwochnik 6:642e7c233e83 281 return 0;
vwochnik 6:642e7c233e83 282 }
vwochnik 6:642e7c233e83 283
vwochnik 6:642e7c233e83 284 if (received.values() != 3) {
vwochnik 6:642e7c233e83 285 puts("Bad received data.");
vwochnik 10:d5cd4a7ada7b 286 client.stop();
vwochnik 6:642e7c233e83 287 return 0;
vwochnik 6:642e7c233e83 288 }
vwochnik 6:642e7c233e83 289
vwochnik 6:642e7c233e83 290 if (received.value(0).integerValue() != 201) {
vwochnik 6:642e7c233e83 291 puts("Bad received data.");
vwochnik 10:d5cd4a7ada7b 292 client.stop();
vwochnik 6:642e7c233e83 293 return 0;
vwochnik 6:642e7c233e83 294 }
vwochnik 6:642e7c233e83 295
vwochnik 6:642e7c233e83 296 client.stop();
vwochnik 6:642e7c233e83 297 return received.value(2).integerValue();
vwochnik 6:642e7c233e83 298 }
vwochnik 6:642e7c233e83 299
vwochnik 6:642e7c233e83 300 bool identify(long deviceId)
vwochnik 6:642e7c233e83 301 {
vwochnik 6:642e7c233e83 302 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 6:642e7c233e83 303 ParsedRecord received;
vwochnik 6:642e7c233e83 304
vwochnik 6:642e7c233e83 305 puts("Adding global identifier...");
vwochnik 6:642e7c233e83 306
vwochnik 12:beb64aa0da86 307 newMoRec.add(IntegerValue(102)).add(IntegerValue(deviceId)).add(CharValue(imei()));
vwochnik 6:642e7c233e83 308
vwochnik 6:642e7c233e83 309 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 310 puts("Sending failed.");
vwochnik 10:d5cd4a7ada7b 311 client.stop();
vwochnik 6:642e7c233e83 312 return false;
vwochnik 6:642e7c233e83 313 }
vwochnik 6:642e7c233e83 314
vwochnik 6:642e7c233e83 315 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 316 puts("Failed.");
vwochnik 10:d5cd4a7ada7b 317 client.stop();
vwochnik 6:642e7c233e83 318 return false;
vwochnik 6:642e7c233e83 319 }
vwochnik 6:642e7c233e83 320
vwochnik 6:642e7c233e83 321 if (received.values() != 3) {
vwochnik 6:642e7c233e83 322 puts("Received bad data.");
vwochnik 10:d5cd4a7ada7b 323 client.stop();
vwochnik 6:642e7c233e83 324 return false;
vwochnik 6:642e7c233e83 325 }
vwochnik 6:642e7c233e83 326
vwochnik 6:642e7c233e83 327 if (received.value(0).integerValue() != 200) {
vwochnik 6:642e7c233e83 328 puts("Received bad data.");
vwochnik 10:d5cd4a7ada7b 329 client.stop();
vwochnik 6:642e7c233e83 330 return false;
vwochnik 6:642e7c233e83 331 }
vwochnik 6:642e7c233e83 332
vwochnik 6:642e7c233e83 333 client.stop();
vwochnik 6:642e7c233e83 334 return true;
vwochnik 6:642e7c233e83 335 }
vwochnik 6:642e7c233e83 336
vwochnik 7:f77afd49c35d 337 bool update(long deviceId)
vwochnik 7:f77afd49c35d 338 {
vwochnik 7:f77afd49c35d 339 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 7:f77afd49c35d 340 ParsedRecord received;
vwochnik 7:f77afd49c35d 341
vwochnik 20:ef9cc1b42e9d 342 lcd_status("Updating device object...");
vwochnik 7:f77afd49c35d 343 puts("Updating device data...");
vwochnik 7:f77afd49c35d 344
vwochnik 7:f77afd49c35d 345 newMoRec.add(IntegerValue(103)).add(IntegerValue(deviceId)).add(CharValue(imei())).add(CharValue(cellId())).add(CharValue(iccid()));
vwochnik 7:f77afd49c35d 346
vwochnik 7:f77afd49c35d 347 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 7:f77afd49c35d 348 puts("Send failed.");
vwochnik 10:d5cd4a7ada7b 349 client.stop();
vwochnik 7:f77afd49c35d 350 return false;
vwochnik 7:f77afd49c35d 351 }
vwochnik 7:f77afd49c35d 352
vwochnik 7:f77afd49c35d 353 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 7:f77afd49c35d 354 puts("Update failed.");
vwochnik 10:d5cd4a7ada7b 355 client.stop();
vwochnik 7:f77afd49c35d 356 return false;
vwochnik 7:f77afd49c35d 357 }
vwochnik 7:f77afd49c35d 358
vwochnik 7:f77afd49c35d 359 if (received.values() != 3) {
vwochnik 7:f77afd49c35d 360 puts("Bad received data.");
vwochnik 10:d5cd4a7ada7b 361 client.stop();
vwochnik 7:f77afd49c35d 362 return false;
vwochnik 7:f77afd49c35d 363 }
vwochnik 7:f77afd49c35d 364
vwochnik 7:f77afd49c35d 365 if (received.value(0).integerValue() != 201) {
vwochnik 7:f77afd49c35d 366 puts("Bad received data.");
vwochnik 10:d5cd4a7ada7b 367 client.stop();
vwochnik 7:f77afd49c35d 368 return false;
vwochnik 7:f77afd49c35d 369 }
vwochnik 7:f77afd49c35d 370
vwochnik 7:f77afd49c35d 371 client.stop();
vwochnik 7:f77afd49c35d 372
vwochnik 7:f77afd49c35d 373 return true;
vwochnik 7:f77afd49c35d 374 }
vwochnik 7:f77afd49c35d 375
vwochnik 8:940c782eec5e 376 void loop(long deviceId)
vwochnik 8:940c782eec5e 377 {
vwochnik 25:8604bef314c1 378 Aggregator aggr(8, false, true);
vwochnik 8:940c782eec5e 379
vwochnik 20:ef9cc1b42e9d 380 lcd_status("Sending measurements...");
vwochnik 26:26e9899e2cbe 381 temperatureMeasurement(deviceId, aggr);
vwochnik 13:4045b6ac448d 382 signalMeasurement(deviceId, aggr);
vwochnik 19:7bee744fe527 383 analogMeasurement(deviceId, aggr);
vwochnik 13:4045b6ac448d 384 motionMeasurement(deviceId, aggr);
vwochnik 6:642e7c233e83 385
vwochnik 13:4045b6ac448d 386 if (client.send(aggr) != SMARTREST_SUCCESS) {
vwochnik 25:8604bef314c1 387 puts("Loop send failed.");
vwochnik 6:642e7c233e83 388 }
vwochnik 6:642e7c233e83 389 client.stop();
vwochnik 13:4045b6ac448d 390 }
vwochnik 13:4045b6ac448d 391
vwochnik 13:4045b6ac448d 392 void signalMeasurement(long deviceId, Aggregator& aggr)
vwochnik 13:4045b6ac448d 393 {
vwochnik 13:4045b6ac448d 394 sigq_t *sq = signalQuality();
vwochnik 13:4045b6ac448d 395
vwochnik 13:4045b6ac448d 396 if ((sq->rssi == 0) || (sq->ber == 0))
vwochnik 13:4045b6ac448d 397 return;
vwochnik 13:4045b6ac448d 398
vwochnik 13:4045b6ac448d 399 ComposedRecord measurement;
vwochnik 13:4045b6ac448d 400 IntegerValue msgId(104);
vwochnik 13:4045b6ac448d 401 IntegerValue devId(deviceId);
vwochnik 13:4045b6ac448d 402 FloatValue rssi(sq->rssi, 0);
vwochnik 13:4045b6ac448d 403 IntegerValue ber(sq->ber);
vwochnik 13:4045b6ac448d 404 measurement.add(msgId).add(devId).add(rssi).add(ber);
vwochnik 13:4045b6ac448d 405 aggr.add(measurement);
vwochnik 10:d5cd4a7ada7b 406 }
vwochnik 13:4045b6ac448d 407
vwochnik 13:4045b6ac448d 408 void temperatureMeasurement(long deviceId, Aggregator& aggr)
vwochnik 13:4045b6ac448d 409 {
vwochnik 13:4045b6ac448d 410 ComposedRecord measurement;
vwochnik 13:4045b6ac448d 411 IntegerValue msgId(105);
vwochnik 13:4045b6ac448d 412 IntegerValue devId(deviceId);
vwochnik 13:4045b6ac448d 413 FloatValue temp(temperature(), 1);
vwochnik 13:4045b6ac448d 414 measurement.add(msgId).add(devId).add(temp);
vwochnik 13:4045b6ac448d 415 aggr.add(measurement);
vwochnik 13:4045b6ac448d 416 }
vwochnik 13:4045b6ac448d 417
vwochnik 19:7bee744fe527 418 void analogMeasurement(long deviceId, Aggregator& aggr)
vwochnik 13:4045b6ac448d 419 {
vwochnik 19:7bee744fe527 420 long analog0 = (long)(potentiometer(0) * 100.0);
vwochnik 19:7bee744fe527 421 long analog1 = (long)(potentiometer(1) * 100.0);
vwochnik 13:4045b6ac448d 422 ComposedRecord measurement;
vwochnik 13:4045b6ac448d 423 IntegerValue msgId(106);
vwochnik 13:4045b6ac448d 424 IntegerValue devId(deviceId);
vwochnik 19:7bee744fe527 425 IntegerValue an0(analog0);
vwochnik 19:7bee744fe527 426 IntegerValue an1(analog1);
vwochnik 19:7bee744fe527 427 measurement.add(msgId).add(devId).add(an0).add(an1);
vwochnik 13:4045b6ac448d 428 aggr.add(measurement);
vwochnik 13:4045b6ac448d 429 }
vwochnik 13:4045b6ac448d 430
vwochnik 13:4045b6ac448d 431 void motionMeasurement(long deviceId, Aggregator& aggr)
vwochnik 13:4045b6ac448d 432 {
vwochnik 13:4045b6ac448d 433 acceleration_t acc = acceleration();
vwochnik 13:4045b6ac448d 434 ComposedRecord measurement;
vwochnik 13:4045b6ac448d 435 IntegerValue msgId(107);
vwochnik 13:4045b6ac448d 436 IntegerValue devId(deviceId);
vwochnik 13:4045b6ac448d 437 FloatValue x(acc.x, 2);
vwochnik 13:4045b6ac448d 438 FloatValue y(acc.y, 2);
vwochnik 13:4045b6ac448d 439 FloatValue z(acc.z, 2);
vwochnik 13:4045b6ac448d 440 measurement.add(msgId).add(devId).add(x).add(y).add(z);
vwochnik 13:4045b6ac448d 441 aggr.add(measurement);
vwochnik 13:4045b6ac448d 442 }