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
program.cpp@10:d5cd4a7ada7b, 2014-02-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |