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@33:b7d7e6fc421e, 2014-06-12 (annotated)
- 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?
User | Revision | Line number | New 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 | } |