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:
Tue Mar 03 14:10:09 2015 +0000
Revision:
77:f6717e4eccc4
Parent:
72:c5709ae7b193
Child:
92:48069375dffa
Working device push, DNS caching, change logging level when running and more.

Who changed what in which revision?

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