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