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 Vincent Wochnik

Committer:
xinlei
Date:
Mon Apr 20 15:04:23 2015 +0000
Revision:
94:61d44636f020
Parent:
93:0acd11870c6a
Child:
100:47ea098f8a47
Integration of new device push code base.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xinlei 93:0acd11870c6a 1 #include <stdio.h>
Cumulocity 41:804f6a0bda26 2 #include "DeviceIntegration.h"
Cumulocity 41:804f6a0bda26 3 #include "ComposedRecord.h"
Cumulocity 41:804f6a0bda26 4 #include "CharValue.h"
Cumulocity 41:804f6a0bda26 5 #include "IntegerValue.h"
xinlei 72:c5709ae7b193 6 #include "logging.h"
Cumulocity 41:804f6a0bda26 7
xinlei 92:48069375dffa 8 DeviceIntegration::DeviceIntegration(AbstractSmartRest& client, SmartRestTemplate& tpl,
xinlei 92:48069375dffa 9 long& deviceId, DeviceInfo& deviceInfo) :
xinlei 92:48069375dffa 10 _deviceId(deviceId),
xinlei 92:48069375dffa 11 _tpl(tpl),
Cumulocity 41:804f6a0bda26 12 _client(client),
Cumulocity 41:804f6a0bda26 13 _deviceInfo(deviceInfo)
Cumulocity 41:804f6a0bda26 14 {
Cumulocity 41:804f6a0bda26 15 _init = false;
Cumulocity 41:804f6a0bda26 16 }
Cumulocity 41:804f6a0bda26 17
Cumulocity 41:804f6a0bda26 18 bool DeviceIntegration::init()
Cumulocity 41:804f6a0bda26 19 {
Cumulocity 41:804f6a0bda26 20 if (_init)
Cumulocity 41:804f6a0bda26 21 return false;
Cumulocity 41:804f6a0bda26 22
Cumulocity 41:804f6a0bda26 23 // get device by identity
Cumulocity 41:804f6a0bda26 24 // Usage: 100,<SERIAL/NR>
Cumulocity 41:804f6a0bda26 25 if (!_tpl.add("10,100,GET,/identity/externalIds/c8y_Serial/%%,,application/vnd.com.nsn.cumulocity.externalId+json,%%,STRING,\r\n"))
Cumulocity 41:804f6a0bda26 26 return false;
Cumulocity 41:804f6a0bda26 27
Cumulocity 41:804f6a0bda26 28 // get device id from identity
Cumulocity 41:804f6a0bda26 29 // Response: 200,<DEVICE/ID>
Cumulocity 41:804f6a0bda26 30 if (!_tpl.add("11,200,\"$.managedObject\",,\"$.id\"\r\n"))
Cumulocity 41:804f6a0bda26 31 return false;
Cumulocity 41:804f6a0bda26 32
Cumulocity 41:804f6a0bda26 33 // Create device
Cumulocity 41:804f6a0bda26 34 // Usage: 101,<SERIAL/NR>
vwochnik 69:237c01eb36c2 35 if (!_tpl.add("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_SupportedOperations\"\":[\"\"c8y_Relay\"\",\"\"c8y_Configuration\"\",\"\"c8y_Message\"\"],\"\"c8y_IsDevice\"\":{},\"\"com_cumulocity_model_Agent\"\":{}}\"\r\n"))
Cumulocity 41:804f6a0bda26 36 return false;
Cumulocity 41:804f6a0bda26 37
Cumulocity 41:804f6a0bda26 38 // Get device id
Cumulocity 41:804f6a0bda26 39 // Response: 201,<DEVICE/ID>
Cumulocity 41:804f6a0bda26 40 if (!_tpl.add("11,201,,\"$.c8y_IsDevice\",\"$.id\"\r\n"))
Cumulocity 41:804f6a0bda26 41 return false;
Cumulocity 41:804f6a0bda26 42
Cumulocity 41:804f6a0bda26 43 // Insert global ID
Cumulocity 41:804f6a0bda26 44 // Usage: 102,<DEVICE/ID>,<SERIAL/NR>
Cumulocity 41:804f6a0bda26 45 if (!_tpl.add("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"))
Cumulocity 41:804f6a0bda26 46 return false;
Cumulocity 41:804f6a0bda26 47
Cumulocity 41:804f6a0bda26 48 // Update IMEI, CellId and iccid
Cumulocity 41:804f6a0bda26 49 // Usage: 103,<DEVICE/ID>,<IMEI>,<CELL/ID>,<ICCID>
Cumulocity 41:804f6a0bda26 50 if (!_tpl.add("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"))
Cumulocity 41:804f6a0bda26 51 return false;
Cumulocity 41:804f6a0bda26 52
Cumulocity 41:804f6a0bda26 53 _init = true;
Cumulocity 41:804f6a0bda26 54 _deviceId = 0;
Cumulocity 41:804f6a0bda26 55 return true;
Cumulocity 41:804f6a0bda26 56 }
Cumulocity 41:804f6a0bda26 57
Cumulocity 41:804f6a0bda26 58 bool DeviceIntegration::integrate()
Cumulocity 41:804f6a0bda26 59 {
Cumulocity 41:804f6a0bda26 60 if (_deviceId != 0)
Cumulocity 41:804f6a0bda26 61 return false;
Cumulocity 41:804f6a0bda26 62
Cumulocity 41:804f6a0bda26 63 // template bootstrapping process
Cumulocity 41:804f6a0bda26 64 if (_client.bootstrap(_tpl) != SMARTREST_SUCCESS) {
xinlei 72:c5709ae7b193 65 aError("Template bootstrap failed.\r\n");
Cumulocity 49:ac0ba9d54ebc 66 return false;
Cumulocity 41:804f6a0bda26 67 }
Cumulocity 41:804f6a0bda26 68
vwochnik 52:8f1370084268 69 if ((!deviceExisting()) && ((!createDevice()) || (!addGlobalIdentifier())))
vwochnik 52:8f1370084268 70 return false;
Cumulocity 41:804f6a0bda26 71
vwochnik 52:8f1370084268 72 if (!updateDevice())
Cumulocity 41:804f6a0bda26 73 return false;
Cumulocity 41:804f6a0bda26 74
Cumulocity 41:804f6a0bda26 75 return true;
Cumulocity 41:804f6a0bda26 76 }
Cumulocity 41:804f6a0bda26 77
Cumulocity 41:804f6a0bda26 78 bool DeviceIntegration::deviceExisting()
Cumulocity 41:804f6a0bda26 79 {
Cumulocity 41:804f6a0bda26 80 ComposedRecord record;
Cumulocity 41:804f6a0bda26 81 ParsedRecord received;
Cumulocity 41:804f6a0bda26 82
Cumulocity 41:804f6a0bda26 83 IntegerValue msgId(100);
Cumulocity 41:804f6a0bda26 84 CharValue imei(_deviceInfo.imei());
Cumulocity 41:804f6a0bda26 85 if ((!record.add(msgId)) || (!record.add(imei)))
Cumulocity 41:804f6a0bda26 86 return false;
Cumulocity 41:804f6a0bda26 87
Cumulocity 41:804f6a0bda26 88 if (_client.send(record) != SMARTREST_SUCCESS) {
xinlei 77:f6717e4eccc4 89 aWarning("Send failed.\r\n");
Cumulocity 41:804f6a0bda26 90 _client.stop();
Cumulocity 41:804f6a0bda26 91 return false;
Cumulocity 41:804f6a0bda26 92 }
Cumulocity 41:804f6a0bda26 93
Cumulocity 41:804f6a0bda26 94 if (_client.receive(received) != SMARTREST_SUCCESS) {
xinlei 93:0acd11870c6a 95 aError("No device found.\n");
Cumulocity 41:804f6a0bda26 96 _client.stop();
Cumulocity 41:804f6a0bda26 97 return false;
Cumulocity 41:804f6a0bda26 98 }
Cumulocity 41:804f6a0bda26 99 _client.stop();
Cumulocity 41:804f6a0bda26 100
Cumulocity 41:804f6a0bda26 101 if (received.values() == 0) {
Cumulocity 41:804f6a0bda26 102 return false;
Cumulocity 41:804f6a0bda26 103 }
Cumulocity 41:804f6a0bda26 104
Cumulocity 41:804f6a0bda26 105 if (received.value(0).integerValue() == 50) {
Cumulocity 41:804f6a0bda26 106 return false;
Cumulocity 41:804f6a0bda26 107 }
Cumulocity 41:804f6a0bda26 108
Cumulocity 41:804f6a0bda26 109 if (received.value(0).integerValue() != 200) {
xinlei 93:0acd11870c6a 110 aError("Unknown message ID: %d.\n", received.value(0).integerValue());
Cumulocity 41:804f6a0bda26 111 return false;
Cumulocity 41:804f6a0bda26 112 }
Cumulocity 41:804f6a0bda26 113 _deviceId = received.value(2).integerValue();
Cumulocity 41:804f6a0bda26 114
Cumulocity 41:804f6a0bda26 115 return true;
Cumulocity 41:804f6a0bda26 116 }
Cumulocity 41:804f6a0bda26 117
Cumulocity 41:804f6a0bda26 118 bool DeviceIntegration::createDevice()
Cumulocity 41:804f6a0bda26 119 {
Cumulocity 41:804f6a0bda26 120 ComposedRecord record;
Cumulocity 41:804f6a0bda26 121 ParsedRecord received;
Cumulocity 41:804f6a0bda26 122
xinlei 93:0acd11870c6a 123 aInfo("Create device...\n");
Cumulocity 41:804f6a0bda26 124
Cumulocity 41:804f6a0bda26 125 IntegerValue msgId(101);
Cumulocity 41:804f6a0bda26 126 CharValue imei(_deviceInfo.imei());
Cumulocity 41:804f6a0bda26 127 if ((!record.add(msgId)) || (!record.add(imei)))
Cumulocity 41:804f6a0bda26 128 return false;
Cumulocity 41:804f6a0bda26 129
Cumulocity 41:804f6a0bda26 130 if (_client.send(record) != SMARTREST_SUCCESS) {
Cumulocity 41:804f6a0bda26 131 _client.stop();
Cumulocity 41:804f6a0bda26 132 return 0;
Cumulocity 41:804f6a0bda26 133 }
Cumulocity 41:804f6a0bda26 134
Cumulocity 41:804f6a0bda26 135 if (_client.receive(received) != SMARTREST_SUCCESS) {
xinlei 93:0acd11870c6a 136 aError("No device found.\n");
Cumulocity 41:804f6a0bda26 137 _client.stop();
Cumulocity 41:804f6a0bda26 138 return false;
Cumulocity 41:804f6a0bda26 139 }
Cumulocity 41:804f6a0bda26 140 _client.stop();
Cumulocity 41:804f6a0bda26 141
Cumulocity 41:804f6a0bda26 142 if (received.values() != 3) {
xinlei 93:0acd11870c6a 143 aError("createDevice: Incomplete response.\n");
Cumulocity 41:804f6a0bda26 144 return false;
Cumulocity 41:804f6a0bda26 145 }
Cumulocity 41:804f6a0bda26 146
Cumulocity 41:804f6a0bda26 147 if (received.value(0).integerValue() != 201) {
xinlei 93:0acd11870c6a 148 aError("createDevice: Unknown message ID: %d.\n", received.value(0).integerValue());
Cumulocity 41:804f6a0bda26 149 return false;
Cumulocity 41:804f6a0bda26 150 }
Cumulocity 41:804f6a0bda26 151
Cumulocity 41:804f6a0bda26 152 _deviceId = received.value(2).integerValue();
Cumulocity 41:804f6a0bda26 153 return true;
Cumulocity 41:804f6a0bda26 154 }
Cumulocity 41:804f6a0bda26 155
Cumulocity 41:804f6a0bda26 156 bool DeviceIntegration::addGlobalIdentifier()
Cumulocity 41:804f6a0bda26 157 {
Cumulocity 41:804f6a0bda26 158 ComposedRecord record;
Cumulocity 41:804f6a0bda26 159 ParsedRecord received;
Cumulocity 41:804f6a0bda26 160
xinlei 93:0acd11870c6a 161 aInfo("Add global identifier.\n");
Cumulocity 41:804f6a0bda26 162
Cumulocity 41:804f6a0bda26 163 IntegerValue msgId(102);
Cumulocity 41:804f6a0bda26 164 IntegerValue deviceId(_deviceId);
Cumulocity 41:804f6a0bda26 165 CharValue imei(_deviceInfo.imei());
Cumulocity 41:804f6a0bda26 166 if ((!record.add(msgId)) || (!record.add(deviceId)) || (!record.add(imei)))
Cumulocity 41:804f6a0bda26 167 return false;
Cumulocity 41:804f6a0bda26 168
Cumulocity 41:804f6a0bda26 169 if (_client.send(record) != SMARTREST_SUCCESS) {
xinlei 77:f6717e4eccc4 170 aWarning("Adding global identifier failed.\r\n");
Cumulocity 41:804f6a0bda26 171 _client.stop();
Cumulocity 41:804f6a0bda26 172 return false;
Cumulocity 41:804f6a0bda26 173 }
Cumulocity 41:804f6a0bda26 174
Cumulocity 41:804f6a0bda26 175 if (_client.receive(received) != SMARTREST_SUCCESS) {
xinlei 93:0acd11870c6a 176 aError("Receive identifier failed.\n");
Cumulocity 41:804f6a0bda26 177 _client.stop();
Cumulocity 41:804f6a0bda26 178 return false;
Cumulocity 41:804f6a0bda26 179 }
Cumulocity 41:804f6a0bda26 180 _client.stop();
Cumulocity 41:804f6a0bda26 181
Cumulocity 41:804f6a0bda26 182 if (received.values() != 3) {
xinlei 93:0acd11870c6a 183 aError("%d (3) values received.\n", received.values());
Cumulocity 41:804f6a0bda26 184 return false;
Cumulocity 41:804f6a0bda26 185 }
Cumulocity 41:804f6a0bda26 186
Cumulocity 41:804f6a0bda26 187 if (received.value(0).integerValue() != 200) {
xinlei 93:0acd11870c6a 188 aError("Unknown message ID: %d\n", received.value(0).integerValue());
Cumulocity 41:804f6a0bda26 189 return false;
Cumulocity 41:804f6a0bda26 190 }
Cumulocity 41:804f6a0bda26 191
Cumulocity 41:804f6a0bda26 192 return true;
Cumulocity 41:804f6a0bda26 193 }
Cumulocity 41:804f6a0bda26 194
Cumulocity 41:804f6a0bda26 195 bool DeviceIntegration::updateDevice()
Cumulocity 41:804f6a0bda26 196 {
Cumulocity 41:804f6a0bda26 197 ComposedRecord record;
Cumulocity 41:804f6a0bda26 198 ParsedRecord received;
Cumulocity 41:804f6a0bda26 199
Cumulocity 41:804f6a0bda26 200 IntegerValue msgId(103);
Cumulocity 41:804f6a0bda26 201 IntegerValue deviceId(_deviceId);
Cumulocity 41:804f6a0bda26 202 CharValue imei(_deviceInfo.imei());
Cumulocity 41:804f6a0bda26 203 CharValue cellId(_deviceInfo.cellId());
Cumulocity 41:804f6a0bda26 204 CharValue iccid(_deviceInfo.iccid());
xinlei 94:61d44636f020 205 aInfo("Update Device.\n");
Cumulocity 41:804f6a0bda26 206 if ((!record.add(msgId)) || (!record.add(deviceId)) || (!record.add(imei)) || (!record.add(cellId)) || (!record.add(iccid)))
Cumulocity 41:804f6a0bda26 207 return false;
Cumulocity 41:804f6a0bda26 208
Cumulocity 41:804f6a0bda26 209 if (_client.send(record) != SMARTREST_SUCCESS) {
xinlei 93:0acd11870c6a 210 aError("Send.\n");
Cumulocity 41:804f6a0bda26 211 _client.stop();
Cumulocity 41:804f6a0bda26 212 return false;
Cumulocity 41:804f6a0bda26 213 }
Cumulocity 41:804f6a0bda26 214
Cumulocity 41:804f6a0bda26 215 if (_client.receive(received) != SMARTREST_SUCCESS) {
xinlei 93:0acd11870c6a 216 aError("Receive.\n");
Cumulocity 41:804f6a0bda26 217 _client.stop();
Cumulocity 41:804f6a0bda26 218 return false;
Cumulocity 41:804f6a0bda26 219 }
Cumulocity 41:804f6a0bda26 220 _client.stop();
Cumulocity 41:804f6a0bda26 221
Cumulocity 41:804f6a0bda26 222 if (received.values() != 3) {
xinlei 93:0acd11870c6a 223 aError("%d (3) values received.\n", received.values());
Cumulocity 41:804f6a0bda26 224 return false;
Cumulocity 41:804f6a0bda26 225 }
Cumulocity 41:804f6a0bda26 226
Cumulocity 41:804f6a0bda26 227 if (received.value(0).integerValue() != 201) {
xinlei 93:0acd11870c6a 228 aError("Unknown message ID: %d\n", received.value(0).integerValue());
Cumulocity 41:804f6a0bda26 229 return false;
Cumulocity 41:804f6a0bda26 230 }
Cumulocity 41:804f6a0bda26 231
Cumulocity 41:804f6a0bda26 232 return true;
Cumulocity 41:804f6a0bda26 233 }