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:
Fri May 08 12:19:57 2015 +0000
Revision:
101:dbcd3bc51758
Parent:
100:47ea098f8a47
Child:
107:fc5f25f0e0d5
v2.1rc3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xinlei 77:f6717e4eccc4 1 #include <string.h>
vwochnik 57:4af5f1bec3a6 2 #include "OperationSupport.h"
xinlei 94:61d44636f020 3 #include "ComposedRecord.h"
xinlei 94:61d44636f020 4 #include "ParsedRecord.h"
xinlei 94:61d44636f020 5 #include "IntegerValue.h"
xinlei 101:dbcd3bc51758 6 #include "SmartRestConf.h"
xinlei 93:0acd11870c6a 7 #include "logging.h"
xinlei 93:0acd11870c6a 8
vwochnik 57:4af5f1bec3a6 9 bool OperationSupport::init()
vwochnik 57:4af5f1bec3a6 10 {
vwochnik 57:4af5f1bec3a6 11 if (_init)
vwochnik 57:4af5f1bec3a6 12 return false;
vwochnik 57:4af5f1bec3a6 13
vwochnik 57:4af5f1bec3a6 14 // Get pending operations
vwochnik 57:4af5f1bec3a6 15 // USAGE: 110,<DEVICE/ID>
vwochnik 57:4af5f1bec3a6 16 if (!_tpl.add("10,110,GET,/devicecontrol/operations?status=PENDING&deviceId=%%&pageSize=100,,application/vnd.com.nsn.cumulocity.operationCollection+json,%%,UNSIGNED,\r\n"))
vwochnik 57:4af5f1bec3a6 17 return false;
vwochnik 57:4af5f1bec3a6 18
vwochnik 57:4af5f1bec3a6 19 // Set operation state
xinlei 93:0acd11870c6a 20 // USAGE: 111,<OPERATION/ID>,<STATE>
vwochnik 58:4cc0ae5a7058 21 if (!_tpl.add("10,111,PUT,/devicecontrol/operations/%%,application/vnd.com.nsn.cumulocity.operation+json,application/vnd.com.nsn.cumulocity.operation+json,%%,UNSIGNED STRING,\"{\"\"status\"\":\"\"%%\"\"}\"\r\n"))
vwochnik 57:4af5f1bec3a6 22 return false;
vwochnik 57:4af5f1bec3a6 23
vwochnik 57:4af5f1bec3a6 24 // Get operations
vwochnik 57:4af5f1bec3a6 25 // Response: 210,<OPERATION/ID>,<STATUS>
vwochnik 57:4af5f1bec3a6 26 if (!_tpl.add("11,210,\"$.operations\",,\"$.id\",\"$.status\"\r\n"))
vwochnik 57:4af5f1bec3a6 27 return false;
vwochnik 57:4af5f1bec3a6 28
vwochnik 57:4af5f1bec3a6 29 // Get operation
vwochnik 57:4af5f1bec3a6 30 // Response: 211,<OPERATION/ID>,<STATUS>
vwochnik 57:4af5f1bec3a6 31 if (!_tpl.add("11,211,,\"$.deviceId\",\"$.id\",\"$.status\"\r\n"))
vwochnik 57:4af5f1bec3a6 32 return false;
vwochnik 63:010bbbb4732a 33
xinlei 94:61d44636f020 34 // Get operation by id
xinlei 94:61d44636f020 35 // USAGE: 112,<OPERATION/ID>
xinlei 94:61d44636f020 36 if (!_tpl.add("10,112,GET,/devicecontrol/operations/%%,,application/vnd.com.nsn.cumulocity.operation+json,%%,UNSIGNED,\r\n"))
xinlei 94:61d44636f020 37 return false;
xinlei 94:61d44636f020 38
xinlei 94:61d44636f020 39 // Relay operation response
xinlei 94:61d44636f020 40 // Response: 220,<OPERATION/ID>,<STATUS>
xinlei 94:61d44636f020 41 if (!_tpl.add("11,220,,\"$.c8y_Relay\",\"$.id\",\"$.c8y_Relay.relayState\"\r\n"))
xinlei 94:61d44636f020 42 return false;
xinlei 94:61d44636f020 43
xinlei 94:61d44636f020 44 // Message operation response
xinlei 94:61d44636f020 45 // Response: 221,<OPERATION/ID>,<MESSAGE>
xinlei 94:61d44636f020 46 if (!_tpl.add("11,221,,\"$.c8y_Message\",\"$.id\",\"$.c8y_Message.text\"\r\n"))
xinlei 94:61d44636f020 47 return false;
xinlei 94:61d44636f020 48
xinlei 94:61d44636f020 49 // Configuration operation response
xinlei 94:61d44636f020 50 // Response: 222,<OPERATION/ID>,<CONFIGURATION/STRING>
xinlei 94:61d44636f020 51 if (!_tpl.add("11,222,,\"$.c8y_Configuration\",\"$.id\",\"$.c8y_Configuration.config\"\r\n"))
vwochnik 63:010bbbb4732a 52 return false;
vwochnik 57:4af5f1bec3a6 53
vwochnik 57:4af5f1bec3a6 54 _init = true;
vwochnik 57:4af5f1bec3a6 55 return true;
vwochnik 57:4af5f1bec3a6 56 }
vwochnik 57:4af5f1bec3a6 57
vwochnik 57:4af5f1bec3a6 58 bool OperationSupport::run()
vwochnik 57:4af5f1bec3a6 59 {
vwochnik 67:c360a2b2c948 60 if (_firstRun) {
vwochnik 67:c360a2b2c948 61 _firstRun = false;
xinlei 93:0acd11870c6a 62 bool b = requestPendingOperations();
xinlei 93:0acd11870c6a 63 return b;
xinlei 93:0acd11870c6a 64 } else {
xinlei 93:0acd11870c6a 65 return true;
xinlei 93:0acd11870c6a 66 }
xinlei 93:0acd11870c6a 67 }
xinlei 93:0acd11870c6a 68
xinlei 93:0acd11870c6a 69 bool OperationSupport::executePendingOperation(Operation& op)
xinlei 93:0acd11870c6a 70 {
xinlei 93:0acd11870c6a 71 ComposedRecord r;
xinlei 93:0acd11870c6a 72 if (!r.add(IntegerValue(112)) || !r.add(IntegerValue(op.identifier))) {
xinlei 93:0acd11870c6a 73 return false;
xinlei 93:0acd11870c6a 74 } else if (_client.send(r) != SMARTREST_SUCCESS) {
xinlei 93:0acd11870c6a 75 _client.stop();
xinlei 93:0acd11870c6a 76 return false;
vwochnik 63:010bbbb4732a 77 }
xinlei 93:0acd11870c6a 78 ParsedRecord p;
xinlei 93:0acd11870c6a 79 bool b = true;
xinlei 93:0acd11870c6a 80 while (_client.receive(p) == SMARTREST_SUCCESS) {
xinlei 93:0acd11870c6a 81 if (p.values() >= 3 &&
xinlei 93:0acd11870c6a 82 p.value(0).integerValue() >= 220 &&
xinlei 93:0acd11870c6a 83 p.value(0).integerValue() <= 222 &&
xinlei 93:0acd11870c6a 84 p.value(2).valueType() == VALUE_INTEGER) {
xinlei 93:0acd11870c6a 85 Operation* op1 = opool.alloc();
xinlei 93:0acd11870c6a 86 op1->identifier = p.value(2).integerValue();
xinlei 94:61d44636f020 87 // bool ret = _executor.executeOperation(p);
xinlei 94:61d44636f020 88 bool ret = true;
xinlei 93:0acd11870c6a 89 op1->state = ret ? OPERATION_SUCCESSFUL : OPERATION_FAILED;
xinlei 93:0acd11870c6a 90 opool.put(op1);
xinlei 93:0acd11870c6a 91 }
xinlei 93:0acd11870c6a 92 }
xinlei 93:0acd11870c6a 93 _client.stop();
xinlei 93:0acd11870c6a 94 return b;
vwochnik 63:010bbbb4732a 95 }
vwochnik 63:010bbbb4732a 96
vwochnik 63:010bbbb4732a 97 bool OperationSupport::requestPendingOperations()
vwochnik 63:010bbbb4732a 98 {
vwochnik 59:f96be79feccd 99 IntegerValue msgId(110);
xinlei 93:0acd11870c6a 100 ComposedRecord record;
xinlei 93:0acd11870c6a 101
xinlei 100:47ea098f8a47 102 if (!record.add(msgId) || !record.add(IntegerValue(deviceID)))
vwochnik 59:f96be79feccd 103 return false;
xinlei 93:0acd11870c6a 104 else if (_client.send(record) != SMARTREST_SUCCESS) {
vwochnik 59:f96be79feccd 105 _client.stop();
vwochnik 59:f96be79feccd 106 return false;
vwochnik 59:f96be79feccd 107 }
xinlei 93:0acd11870c6a 108
xinlei 93:0acd11870c6a 109 uint8_t ret;
xinlei 93:0acd11870c6a 110 ParsedRecord received;
xinlei 93:0acd11870c6a 111 Operation opl[10];
xinlei 93:0acd11870c6a 112 size_t c = 0;
xinlei 93:0acd11870c6a 113 while ((ret=_client.receive(received)) == SMARTREST_SUCCESS) {
xinlei 93:0acd11870c6a 114 if (c < 10 && operationFromRecord(received, opl[c])) {
xinlei 93:0acd11870c6a 115 ++c;
xinlei 93:0acd11870c6a 116 } else {
xinlei 93:0acd11870c6a 117 aWarning("Ignored pending operation after 10.\n");
vwochnik 61:15719dbe8820 118 break;
vwochnik 61:15719dbe8820 119 }
vwochnik 59:f96be79feccd 120 }
vwochnik 59:f96be79feccd 121 _client.stop();
xinlei 93:0acd11870c6a 122
xinlei 93:0acd11870c6a 123 for (size_t i = 0; i < c; ++i) {
xinlei 93:0acd11870c6a 124 Operation* op = opool.alloc();
xinlei 93:0acd11870c6a 125 op->identifier = opl[i].identifier;
xinlei 93:0acd11870c6a 126 op->state = OPERATION_EXECUTING;
xinlei 93:0acd11870c6a 127 opool.put(op);
xinlei 93:0acd11870c6a 128 executePendingOperation(opl[i]);
xinlei 93:0acd11870c6a 129 }
xinlei 93:0acd11870c6a 130 return (ret == SMARTREST_END_OF_RESPONSE || ret == SMARTREST_CONNECTION_CLOSED);
vwochnik 59:f96be79feccd 131 }
vwochnik 59:f96be79feccd 132
xinlei 93:0acd11870c6a 133 bool OperationSupport::operationFromRecord(ParsedRecord& received, Operation& op)
vwochnik 59:f96be79feccd 134 {
xinlei 93:0acd11870c6a 135 if ((received.values() < 4) ||
xinlei 93:0acd11870c6a 136 (received.value(0).valueType() != VALUE_INTEGER) ||
xinlei 93:0acd11870c6a 137 // (received.value(0).integerValue() != 211) ||
xinlei 93:0acd11870c6a 138 (received.value(2).valueType() != VALUE_INTEGER) ||
xinlei 93:0acd11870c6a 139 (received.value(3).valueType() != VALUE_CHARACTER))
xinlei 93:0acd11870c6a 140 return false;
xinlei 93:0acd11870c6a 141
xinlei 93:0acd11870c6a 142 op.identifier = received.value(2).integerValue();
xinlei 93:0acd11870c6a 143 const char *tmp = received.value(3).characterValue();
xinlei 93:0acd11870c6a 144 if (strcmp(tmp, strExecuting) == 0)
xinlei 93:0acd11870c6a 145 op.state = OPERATION_EXECUTING;
xinlei 93:0acd11870c6a 146 else if (strcmp(tmp, strSuccessful) == 0)
xinlei 93:0acd11870c6a 147 op.state = OPERATION_SUCCESSFUL;
xinlei 93:0acd11870c6a 148 else if (strcmp(tmp, strFailed) == 0)
xinlei 93:0acd11870c6a 149 op.state = OPERATION_FAILED;
xinlei 93:0acd11870c6a 150 else if (strcmp(tmp, strPending) == 0)
xinlei 93:0acd11870c6a 151 op.state = OPERATION_PENDING;
xinlei 93:0acd11870c6a 152 else
xinlei 93:0acd11870c6a 153 return false;
xinlei 93:0acd11870c6a 154 return true;
xinlei 94:61d44636f020 155 }