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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers DeviceIntegration.cpp Source File

DeviceIntegration.cpp

00001 #include <stdio.h>
00002 #include "DeviceIntegration.h"
00003 #include "ComposedRecord.h"
00004 #include "CharValue.h"
00005 #include "IntegerValue.h"
00006 #include "SmartRestConf.h"
00007 #include "logging.h"
00008 
00009 bool DeviceIntegration::init()
00010 {
00011     if (_init)
00012         return false;
00013     
00014     // get device by identity
00015     // Usage: 100,<SERIAL/NR>
00016     if (!_tpl.add("10,100,GET,/identity/externalIds/c8y_Serial/%%,,application/vnd.com.nsn.cumulocity.externalId+json,%%,STRING,\r\n"))
00017         return false;
00018 
00019     // get device id from identity
00020     // Response: 200,<DEVICE/ID>
00021     if (!_tpl.add("11,200,\"$.managedObject\",,\"$.id\"\r\n"))
00022         return false;
00023 
00024     // Create device
00025     // Usage: 101,<SERIAL/NR>
00026     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"))
00027         return false;
00028 
00029     // Get device id
00030     // Response: 201,<DEVICE/ID>
00031     if (!_tpl.add("11,201,,\"$.c8y_IsDevice\",\"$.id\"\r\n"))
00032         return false;
00033 
00034     // Insert global ID
00035     // Usage: 102,<DEVICE/ID>,<SERIAL/NR>
00036     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"))
00037         return false;
00038 
00039     // Update IMEI, CellId and iccid
00040     // Usage: 103,<DEVICE/ID>,<IMEI>,<CELL/ID>,<ICCID>
00041     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"))
00042         return false;
00043 
00044     _init = true;
00045     return true;
00046 }
00047 
00048 bool DeviceIntegration::integrate()
00049 {
00050     if (deviceID != 0)
00051         return false;
00052 
00053     // template bootstrapping process
00054     if (_client.bootstrap(_tpl) != SMARTREST_SUCCESS) {
00055         aError("Template bootstrap.\n");
00056         return false;
00057     }
00058 
00059     if ((!deviceExisting()) && ((!createDevice()) || (!addGlobalIdentifier())))
00060         return false;
00061 
00062     if (!updateDevice())
00063         return false;
00064 
00065     return true;
00066 }
00067 
00068 bool DeviceIntegration::deviceExisting()
00069 {
00070     ComposedRecord record;
00071     ParsedRecord received;
00072 
00073     IntegerValue msgId(100);
00074     CharValue imei(_deviceInfo.imei());
00075     if ((!record.add(msgId)) || (!record.add(imei)))
00076         return false;
00077 
00078     if (_client.send(record) != SMARTREST_SUCCESS) {
00079         aWarning("Send failed.\r\n");
00080         _client.stop();
00081         return false;
00082     }
00083 
00084     if (_client.receive(received) != SMARTREST_SUCCESS) {
00085         aError("No device found.\n");
00086         _client.stop();
00087         return false;
00088     }
00089     _client.stop();
00090 
00091     if (received.values() == 0) {
00092         return false;
00093     }
00094 
00095     if (received.value(0).integerValue() == 50) {
00096         return false;
00097     }
00098     
00099     if (received.value(0).integerValue() != 200) {
00100         aError("Unknown msg %d.\n", received.value(0).integerValue());
00101         return false;
00102     }
00103     setDeviceID(received.value(2).integerValue());
00104     
00105     return true;
00106 }
00107 
00108 bool DeviceIntegration::createDevice()
00109 {
00110     ComposedRecord record;
00111     ParsedRecord received;
00112 
00113     IntegerValue msgId(101);
00114     CharValue imei(_deviceInfo.imei());
00115     if ((!record.add(msgId)) || (!record.add(imei)))
00116         return false;
00117 
00118     if (_client.send(record) != SMARTREST_SUCCESS) {
00119         _client.stop();
00120         return 0;
00121     }
00122 
00123     if (_client.receive(received) != SMARTREST_SUCCESS) {
00124         aError("Create device.\n");
00125         _client.stop();
00126         return false;
00127     }
00128     _client.stop();
00129 
00130     if (received.values() != 3) {
00131         aError("%d/3 values received.\n", received.values());
00132         return false;
00133     }
00134     
00135     if (received.value(0).integerValue() != 201) {
00136         aError("Unknown msg %d.\n", received.value(0).integerValue());
00137         return false;
00138     }
00139 
00140     setDeviceID(received.value(2).integerValue());
00141     return true;
00142 }
00143 
00144 bool DeviceIntegration::addGlobalIdentifier()
00145 {
00146     ComposedRecord record;
00147     ParsedRecord received;
00148 
00149     IntegerValue msgId(102);
00150     IntegerValue devId(deviceID);
00151     CharValue imei(_deviceInfo.imei());
00152     if ((!record.add(msgId)) || (!record.add(devId)) || (!record.add(imei)))
00153         return false;
00154 
00155     if (_client.send(record) != SMARTREST_SUCCESS) {
00156         aWarning("Add X-ID failed.\n");
00157         _client.stop();
00158         return false;
00159     }
00160 
00161     if (_client.receive(received) != SMARTREST_SUCCESS) {
00162         aError("Receive X-ID failed.\n");
00163         _client.stop();
00164         return false;
00165     }
00166     _client.stop();
00167 
00168     if (received.values() != 3) {
00169         aError("%d/3 values received.\n", received.values());
00170         return false;
00171     }
00172     
00173     if (received.value(0).integerValue() != 200) {
00174         aError("Unknown msg %d\n", received.value(0).integerValue());
00175         return false;
00176     }
00177 
00178     return true;
00179 }
00180 
00181 bool DeviceIntegration::updateDevice()
00182 {
00183     ComposedRecord record;
00184     ParsedRecord received;
00185 
00186     IntegerValue msgId(103);
00187     IntegerValue devId(deviceID);
00188     CharValue imei(_deviceInfo.imei());
00189     CharValue cellId(_deviceInfo.cellId());
00190     CharValue iccid(_deviceInfo.iccid());
00191     if ((!record.add(msgId)) || (!record.add(devId)) || (!record.add(imei)) || (!record.add(cellId)) || (!record.add(iccid)))
00192         return false;
00193 
00194     if (_client.send(record) != SMARTREST_SUCCESS) {
00195         aError("Send.\n");
00196         _client.stop();
00197         return false;
00198     }
00199 
00200     if (_client.receive(received) != SMARTREST_SUCCESS) {
00201         aError("Receive.\n");
00202         _client.stop();
00203         return false;
00204     }
00205     _client.stop();
00206 
00207     if (received.values() != 3) {
00208         aError("%d/3 values received.\n", received.values());
00209         return false;
00210     }
00211 
00212     if (received.value(0).integerValue() != 201) {
00213         aError("Unknown msg %d\n", received.value(0).integerValue());
00214         return false;
00215     }
00216 
00217     return true;
00218 }