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:
Wed Feb 12 12:52:48 2014 +0000
Revision:
10:d5cd4a7ada7b
Parent:
9:5e182f6e5e9b
Child:
11:6f8f70a6dd46
fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vwochnik 6:642e7c233e83 1 #include "common.h"
vwochnik 6:642e7c233e83 2 #include "StaticData.h"
vwochnik 6:642e7c233e83 3 #include "ComposedRecord.h"
vwochnik 6:642e7c233e83 4 #include "CharValue.h"
vwochnik 6:642e7c233e83 5 #include "IntegerValue.h"
vwochnik 6:642e7c233e83 6 #include "FloatValue.h"
vwochnik 6:642e7c233e83 7
vwochnik 8:940c782eec5e 8 long existing();
vwochnik 8:940c782eec5e 9 long create();
vwochnik 8:940c782eec5e 10 bool identify(long deviceId);
vwochnik 8:940c782eec5e 11 bool update(long deviceId);
vwochnik 8:940c782eec5e 12 void loop(long deviceId);
vwochnik 8:940c782eec5e 13 bool measurement(long deviceId, double rssi, int ber);
vwochnik 8:940c782eec5e 14
vwochnik 6:642e7c233e83 15 StaticData srtpl(
vwochnik 6:642e7c233e83 16 // get device by identity
vwochnik 6:642e7c233e83 17 // Usage: 100,<SERIAL/NR>
vwochnik 6:642e7c233e83 18 "10,100,GET,/identity/externalIds/c8y_Serial/%%,,application/vnd.com.nsn.cumulocity.externalId+json,%%,STRING,\r\n"
vwochnik 6:642e7c233e83 19 // get device id from identity
vwochnik 6:642e7c233e83 20 // Response: 200,<DEVICE/ID>
vwochnik 6:642e7c233e83 21 "11,200,\"$.managedObject\",,\"$.id\"\r\n"
vwochnik 6:642e7c233e83 22 // Create device
vwochnik 6:642e7c233e83 23 // Usage: 101,<SERIAL/NR>
vwochnik 9:5e182f6e5e9b 24 "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_RequiredAvailability\"\":{ \"\"responseInterval\"\":15},\"\"c8y_IsDevice\"\":{}}\"\r\n"
vwochnik 6:642e7c233e83 25 // Get device id
vwochnik 6:642e7c233e83 26 // Response: 201,<DEVICE/ID>
vwochnik 6:642e7c233e83 27 "11,201,,\"$.c8y_IsDevice\",\"$.id\"\r\n"
vwochnik 6:642e7c233e83 28 // Insert global ID
vwochnik 6:642e7c233e83 29 // Usage: 102,<DEVICE/ID>,<SERIAL/NR>
vwochnik 6:642e7c233e83 30 "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 31 // Update IMEI, CellId and iccid
vwochnik 7:f77afd49c35d 32 // Usage: 103,<DEVICE/ID>,<IMEI>,<CELL/ID>,<ICCID>
vwochnik 7:f77afd49c35d 33 "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 34 // Insert measurement
vwochnik 7:f77afd49c35d 35 // USAGE: 104,<DEVICE/ID>,<RSSI>,<BER>
vwochnik 7:f77afd49c35d 36 "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 6:642e7c233e83 37 );
vwochnik 6:642e7c233e83 38
vwochnik 9:5e182f6e5e9b 39 const char * const serialNumber = "ublox-a123bd";
vwochnik 8:940c782eec5e 40 float interval = 120.0; // send measurements every two minutes
vwochnik 9:5e182f6e5e9b 41 MbedSmartRest client("http://developer.cumulocity.com/s", "vaillant/admin", "klanpi", "com_u-blox_C027_REV-A_0.7");
vwochnik 6:642e7c233e83 42 //MbedSmartRest client("http://nocore.info:8888/", "vaillant/admin", "klanpi", "com_cumulocity_MbedTestDevice_2.0");
vwochnik 6:642e7c233e83 43
vwochnik 6:642e7c233e83 44 int program(void)
vwochnik 6:642e7c233e83 45 {
vwochnik 8:940c782eec5e 46 long deviceId; Timer timer;
vwochnik 8:940c782eec5e 47
vwochnik 6:642e7c233e83 48 puts("Hello!");
vwochnik 6:642e7c233e83 49
vwochnik 6:642e7c233e83 50 puts("Bootstrapping");
vwochnik 6:642e7c233e83 51 if (client.bootstrap(srtpl) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 52 puts("Bootstrapping failed.");
vwochnik 6:642e7c233e83 53 return 2;
vwochnik 6:642e7c233e83 54 }
vwochnik 6:642e7c233e83 55
vwochnik 6:642e7c233e83 56 puts("Starting action...");
vwochnik 6:642e7c233e83 57
vwochnik 6:642e7c233e83 58 if ((deviceId = existing()) == 0) {
vwochnik 6:642e7c233e83 59 deviceId = create();
vwochnik 7:f77afd49c35d 60 if (deviceId == 0)
vwochnik 7:f77afd49c35d 61 return 1;
vwochnik 7:f77afd49c35d 62 if (!identify(deviceId))
vwochnik 7:f77afd49c35d 63 return 2;
vwochnik 6:642e7c233e83 64 }
vwochnik 7:f77afd49c35d 65 if (!update(deviceId))
vwochnik 7:f77afd49c35d 66 return 3;
vwochnik 6:642e7c233e83 67
vwochnik 6:642e7c233e83 68 printf("Device ID: %ld\r\n", deviceId);
vwochnik 8:940c782eec5e 69
vwochnik 8:940c782eec5e 70 timer.start();
vwochnik 7:f77afd49c35d 71 while (true) {
vwochnik 8:940c782eec5e 72 timer.reset();
vwochnik 8:940c782eec5e 73 loop(deviceId);
vwochnik 8:940c782eec5e 74
vwochnik 8:940c782eec5e 75 // block remaining number of seconds
vwochnik 8:940c782eec5e 76 while (timer.read() < interval);
vwochnik 6:642e7c233e83 77 }
vwochnik 6:642e7c233e83 78 }
vwochnik 6:642e7c233e83 79
vwochnik 6:642e7c233e83 80 long existing()
vwochnik 6:642e7c233e83 81 {
vwochnik 6:642e7c233e83 82 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 6:642e7c233e83 83 ParsedRecord received;
vwochnik 6:642e7c233e83 84
vwochnik 6:642e7c233e83 85 puts("Checking for device existance...");
vwochnik 6:642e7c233e83 86
vwochnik 6:642e7c233e83 87 newMoRec.add(IntegerValue(100)).add(CharValue(serialNumber));
vwochnik 6:642e7c233e83 88
vwochnik 6:642e7c233e83 89 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 90 puts("Send failed.");
vwochnik 10:d5cd4a7ada7b 91 client.stop();
vwochnik 6:642e7c233e83 92 return 0;
vwochnik 6:642e7c233e83 93 }
vwochnik 6:642e7c233e83 94
vwochnik 6:642e7c233e83 95 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 96 puts("No device found.");
vwochnik 10:d5cd4a7ada7b 97 client.stop();
vwochnik 6:642e7c233e83 98 return 0;
vwochnik 6:642e7c233e83 99 }
vwochnik 6:642e7c233e83 100
vwochnik 6:642e7c233e83 101 if (received.values() == 0) {
vwochnik 6:642e7c233e83 102 puts("Received no values.");
vwochnik 10:d5cd4a7ada7b 103 client.stop();
vwochnik 6:642e7c233e83 104 return 0;
vwochnik 6:642e7c233e83 105 }
vwochnik 10:d5cd4a7ada7b 106
vwochnik 6:642e7c233e83 107 if (received.value(0).integerValue() == 50) {
vwochnik 6:642e7c233e83 108 client.stop();
vwochnik 6:642e7c233e83 109 return 0;
vwochnik 6:642e7c233e83 110 }
vwochnik 6:642e7c233e83 111
vwochnik 6:642e7c233e83 112 if (received.value(0).integerValue() != 200) {
vwochnik 6:642e7c233e83 113 puts("Bad response.");
vwochnik 10:d5cd4a7ada7b 114 client.stop();
vwochnik 6:642e7c233e83 115 return 0;
vwochnik 6:642e7c233e83 116 }
vwochnik 6:642e7c233e83 117
vwochnik 6:642e7c233e83 118 client.stop();
vwochnik 6:642e7c233e83 119 return received.value(2).integerValue();
vwochnik 6:642e7c233e83 120 }
vwochnik 6:642e7c233e83 121
vwochnik 6:642e7c233e83 122 long create()
vwochnik 6:642e7c233e83 123 {
vwochnik 6:642e7c233e83 124 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 6:642e7c233e83 125 ParsedRecord received;
vwochnik 6:642e7c233e83 126
vwochnik 6:642e7c233e83 127 puts("Creating device...");
vwochnik 6:642e7c233e83 128
vwochnik 6:642e7c233e83 129 newMoRec.add(IntegerValue(101)).add(CharValue(serialNumber));
vwochnik 6:642e7c233e83 130
vwochnik 6:642e7c233e83 131 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 132 puts("Send failed.");
vwochnik 10:d5cd4a7ada7b 133 client.stop();
vwochnik 6:642e7c233e83 134 return 0;
vwochnik 6:642e7c233e83 135 }
vwochnik 6:642e7c233e83 136
vwochnik 6:642e7c233e83 137 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 138 puts("No device found.");
vwochnik 10:d5cd4a7ada7b 139 client.stop();
vwochnik 6:642e7c233e83 140 return 0;
vwochnik 6:642e7c233e83 141 }
vwochnik 6:642e7c233e83 142
vwochnik 6:642e7c233e83 143 if (received.values() != 3) {
vwochnik 6:642e7c233e83 144 puts("Bad received data.");
vwochnik 10:d5cd4a7ada7b 145 client.stop();
vwochnik 6:642e7c233e83 146 return 0;
vwochnik 6:642e7c233e83 147 }
vwochnik 6:642e7c233e83 148
vwochnik 6:642e7c233e83 149 if (received.value(0).integerValue() != 201) {
vwochnik 6:642e7c233e83 150 puts("Bad received data.");
vwochnik 10:d5cd4a7ada7b 151 client.stop();
vwochnik 6:642e7c233e83 152 return 0;
vwochnik 6:642e7c233e83 153 }
vwochnik 6:642e7c233e83 154
vwochnik 6:642e7c233e83 155 client.stop();
vwochnik 6:642e7c233e83 156 return received.value(2).integerValue();
vwochnik 6:642e7c233e83 157 }
vwochnik 6:642e7c233e83 158
vwochnik 6:642e7c233e83 159 bool identify(long deviceId)
vwochnik 6:642e7c233e83 160 {
vwochnik 6:642e7c233e83 161 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 6:642e7c233e83 162 ParsedRecord received;
vwochnik 6:642e7c233e83 163
vwochnik 6:642e7c233e83 164 puts("Adding global identifier...");
vwochnik 6:642e7c233e83 165
vwochnik 6:642e7c233e83 166 newMoRec.add(IntegerValue(102)).add(IntegerValue(deviceId)).add(CharValue(serialNumber));
vwochnik 6:642e7c233e83 167
vwochnik 6:642e7c233e83 168 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 169 puts("Sending failed.");
vwochnik 10:d5cd4a7ada7b 170 client.stop();
vwochnik 6:642e7c233e83 171 return false;
vwochnik 6:642e7c233e83 172 }
vwochnik 6:642e7c233e83 173
vwochnik 6:642e7c233e83 174 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 175 puts("Failed.");
vwochnik 10:d5cd4a7ada7b 176 client.stop();
vwochnik 6:642e7c233e83 177 return false;
vwochnik 6:642e7c233e83 178 }
vwochnik 6:642e7c233e83 179
vwochnik 6:642e7c233e83 180 if (received.values() != 3) {
vwochnik 6:642e7c233e83 181 puts("Received bad data.");
vwochnik 10:d5cd4a7ada7b 182 client.stop();
vwochnik 6:642e7c233e83 183 return false;
vwochnik 6:642e7c233e83 184 }
vwochnik 6:642e7c233e83 185
vwochnik 6:642e7c233e83 186 if (received.value(0).integerValue() != 200) {
vwochnik 6:642e7c233e83 187 puts("Received bad data.");
vwochnik 10:d5cd4a7ada7b 188 client.stop();
vwochnik 6:642e7c233e83 189 return false;
vwochnik 6:642e7c233e83 190 }
vwochnik 6:642e7c233e83 191
vwochnik 6:642e7c233e83 192 client.stop();
vwochnik 6:642e7c233e83 193 return true;
vwochnik 6:642e7c233e83 194 }
vwochnik 6:642e7c233e83 195
vwochnik 7:f77afd49c35d 196 bool update(long deviceId)
vwochnik 7:f77afd49c35d 197 {
vwochnik 7:f77afd49c35d 198 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 7:f77afd49c35d 199 ParsedRecord received;
vwochnik 7:f77afd49c35d 200
vwochnik 7:f77afd49c35d 201 puts("Updating device data...");
vwochnik 7:f77afd49c35d 202
vwochnik 7:f77afd49c35d 203 newMoRec.add(IntegerValue(103)).add(IntegerValue(deviceId)).add(CharValue(imei())).add(CharValue(cellId())).add(CharValue(iccid()));
vwochnik 7:f77afd49c35d 204
vwochnik 7:f77afd49c35d 205 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 7:f77afd49c35d 206 puts("Send failed.");
vwochnik 10:d5cd4a7ada7b 207 client.stop();
vwochnik 7:f77afd49c35d 208 return false;
vwochnik 7:f77afd49c35d 209 }
vwochnik 7:f77afd49c35d 210
vwochnik 7:f77afd49c35d 211 if (client.receive(received) != SMARTREST_SUCCESS) {
vwochnik 7:f77afd49c35d 212 puts("Update failed.");
vwochnik 10:d5cd4a7ada7b 213 client.stop();
vwochnik 7:f77afd49c35d 214 return false;
vwochnik 7:f77afd49c35d 215 }
vwochnik 7:f77afd49c35d 216
vwochnik 7:f77afd49c35d 217 if (received.values() != 3) {
vwochnik 7:f77afd49c35d 218 puts("Bad received data.");
vwochnik 10:d5cd4a7ada7b 219 client.stop();
vwochnik 7:f77afd49c35d 220 return false;
vwochnik 7:f77afd49c35d 221 }
vwochnik 7:f77afd49c35d 222
vwochnik 7:f77afd49c35d 223 if (received.value(0).integerValue() != 201) {
vwochnik 7:f77afd49c35d 224 puts("Bad received data.");
vwochnik 10:d5cd4a7ada7b 225 client.stop();
vwochnik 7:f77afd49c35d 226 return false;
vwochnik 7:f77afd49c35d 227 }
vwochnik 7:f77afd49c35d 228
vwochnik 7:f77afd49c35d 229 client.stop();
vwochnik 7:f77afd49c35d 230
vwochnik 7:f77afd49c35d 231 return true;
vwochnik 7:f77afd49c35d 232 }
vwochnik 7:f77afd49c35d 233
vwochnik 8:940c782eec5e 234 void loop(long deviceId)
vwochnik 8:940c782eec5e 235 {
vwochnik 8:940c782eec5e 236 sigq_t *signal = signalQuality();
vwochnik 8:940c782eec5e 237 measurement(deviceId, signal->rssi, signal->ber);
vwochnik 8:940c782eec5e 238 }
vwochnik 8:940c782eec5e 239
vwochnik 6:642e7c233e83 240 bool measurement(long deviceId, double rssi, int ber)
vwochnik 6:642e7c233e83 241 {
vwochnik 6:642e7c233e83 242 ComposedRecord newMoRec(true); // set copy=true b/c tmp objects
vwochnik 6:642e7c233e83 243
vwochnik 6:642e7c233e83 244 puts("Creating measurement...");
vwochnik 6:642e7c233e83 245
vwochnik 7:f77afd49c35d 246 newMoRec.add(IntegerValue(104)).add(IntegerValue(deviceId)).add(FloatValue(rssi, 0)).add(IntegerValue(ber));
vwochnik 6:642e7c233e83 247
vwochnik 6:642e7c233e83 248 if (client.send(newMoRec) != SMARTREST_SUCCESS) {
vwochnik 6:642e7c233e83 249 puts("Send failed.");
vwochnik 10:d5cd4a7ada7b 250 client.stop();
vwochnik 6:642e7c233e83 251 return false;
vwochnik 6:642e7c233e83 252 }
vwochnik 6:642e7c233e83 253
vwochnik 6:642e7c233e83 254 client.stop();
vwochnik 6:642e7c233e83 255 return true;
vwochnik 10:d5cd4a7ada7b 256 }