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