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 Aug 08 11:05:57 2016 +0000
Revision:
139:f8ab852e83e7
Parent:
110:b7a403dbceb6
Etisalat and Teleena APN.

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 107:fc5f25f0e0d5 3 //#include "ComposedRecord.h"
xinlei 107:fc5f25f0e0d5 4 //#include "ParsedRecord.h"
xinlei 107:fc5f25f0e0d5 5 //#include "IntegerValue.h"
xinlei 107:fc5f25f0e0d5 6 #include "SmartRestSocket.h"
xinlei 107:fc5f25f0e0d5 7 #include "ControlParser.h"
xinlei 93:0acd11870c6a 8 #include "logging.h"
xinlei 93:0acd11870c6a 9
vwochnik 57:4af5f1bec3a6 10 bool OperationSupport::init()
vwochnik 57:4af5f1bec3a6 11 {
vwochnik 57:4af5f1bec3a6 12 if (_init)
vwochnik 57:4af5f1bec3a6 13 return false;
vwochnik 57:4af5f1bec3a6 14
vwochnik 57:4af5f1bec3a6 15 // Get pending operations
vwochnik 57:4af5f1bec3a6 16 // USAGE: 110,<DEVICE/ID>
vwochnik 57:4af5f1bec3a6 17 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 18 return false;
vwochnik 57:4af5f1bec3a6 19
vwochnik 57:4af5f1bec3a6 20 // Set operation state
xinlei 93:0acd11870c6a 21 // USAGE: 111,<OPERATION/ID>,<STATE>
vwochnik 58:4cc0ae5a7058 22 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 23 return false;
vwochnik 57:4af5f1bec3a6 24
vwochnik 57:4af5f1bec3a6 25 // Get operations
vwochnik 57:4af5f1bec3a6 26 // Response: 210,<OPERATION/ID>,<STATUS>
vwochnik 57:4af5f1bec3a6 27 if (!_tpl.add("11,210,\"$.operations\",,\"$.id\",\"$.status\"\r\n"))
vwochnik 57:4af5f1bec3a6 28 return false;
vwochnik 57:4af5f1bec3a6 29
vwochnik 57:4af5f1bec3a6 30 // Get operation
vwochnik 57:4af5f1bec3a6 31 // Response: 211,<OPERATION/ID>,<STATUS>
vwochnik 57:4af5f1bec3a6 32 if (!_tpl.add("11,211,,\"$.deviceId\",\"$.id\",\"$.status\"\r\n"))
vwochnik 57:4af5f1bec3a6 33 return false;
vwochnik 63:010bbbb4732a 34
xinlei 94:61d44636f020 35 // Get operation by id
xinlei 94:61d44636f020 36 // USAGE: 112,<OPERATION/ID>
xinlei 94:61d44636f020 37 if (!_tpl.add("10,112,GET,/devicecontrol/operations/%%,,application/vnd.com.nsn.cumulocity.operation+json,%%,UNSIGNED,\r\n"))
xinlei 94:61d44636f020 38 return false;
xinlei 94:61d44636f020 39
xinlei 94:61d44636f020 40 // Relay operation response
xinlei 94:61d44636f020 41 // Response: 220,<OPERATION/ID>,<STATUS>
xinlei 94:61d44636f020 42 if (!_tpl.add("11,220,,\"$.c8y_Relay\",\"$.id\",\"$.c8y_Relay.relayState\"\r\n"))
xinlei 94:61d44636f020 43 return false;
xinlei 94:61d44636f020 44
xinlei 94:61d44636f020 45 // Message operation response
xinlei 94:61d44636f020 46 // Response: 221,<OPERATION/ID>,<MESSAGE>
xinlei 94:61d44636f020 47 if (!_tpl.add("11,221,,\"$.c8y_Message\",\"$.id\",\"$.c8y_Message.text\"\r\n"))
xinlei 94:61d44636f020 48 return false;
xinlei 94:61d44636f020 49
xinlei 94:61d44636f020 50 // Configuration operation response
xinlei 94:61d44636f020 51 // Response: 222,<OPERATION/ID>,<CONFIGURATION/STRING>
xinlei 94:61d44636f020 52 if (!_tpl.add("11,222,,\"$.c8y_Configuration\",\"$.id\",\"$.c8y_Configuration.config\"\r\n"))
vwochnik 63:010bbbb4732a 53 return false;
vwochnik 57:4af5f1bec3a6 54
vwochnik 57:4af5f1bec3a6 55 _init = true;
vwochnik 57:4af5f1bec3a6 56 return true;
vwochnik 57:4af5f1bec3a6 57 }
vwochnik 57:4af5f1bec3a6 58
xinlei 107:fc5f25f0e0d5 59 bool OperationSupport::executePendingOperations()
vwochnik 63:010bbbb4732a 60 {
xinlei 107:fc5f25f0e0d5 61 char buf[SMARTREST_SIZE];
xinlei 107:fc5f25f0e0d5 62 char buf2[SMARTREST_BODY_SIZE];
xinlei 107:fc5f25f0e0d5 63 SmartRestSocket sock;
xinlei 107:fc5f25f0e0d5 64 int l = snprintf(buf2, sizeof(buf2), "110,%ld\r\n", deviceID);
xinlei 107:fc5f25f0e0d5 65 l = snprintf(buf, sizeof(buf), fmtSmartRest, "/s", l, buf2);
xinlei 107:fc5f25f0e0d5 66 l = sock.sendAndReceive(buf, l, sizeof(buf));
xinlei 107:fc5f25f0e0d5 67 if (l < 0) {
xinlei 107:fc5f25f0e0d5 68 aError("Retrieve pending operations\n");
xinlei 107:fc5f25f0e0d5 69 return false;
vwochnik 61:15719dbe8820 70 }
xinlei 107:fc5f25f0e0d5 71 const size_t N = 10;
xinlei 107:fc5f25f0e0d5 72 long opl[N];
xinlei 107:fc5f25f0e0d5 73 size_t i = 0;
xinlei 107:fc5f25f0e0d5 74 for (const char* p = skipHTTPHeader(buf); i<N && *p;) {
xinlei 107:fc5f25f0e0d5 75 long id = 0;
xinlei 107:fc5f25f0e0d5 76 int c = 0;
xinlei 107:fc5f25f0e0d5 77 int n = sscanf(p, "210,1,%ld,PENDING\r\n%n", &id, &c);
xinlei 107:fc5f25f0e0d5 78 if (n == 1) {
xinlei 107:fc5f25f0e0d5 79 opl[i++] = id;
xinlei 107:fc5f25f0e0d5 80 p += c;
xinlei 107:fc5f25f0e0d5 81 } else
xinlei 107:fc5f25f0e0d5 82 break;
xinlei 107:fc5f25f0e0d5 83 }
xinlei 110:b7a403dbceb6 84 if (i == 0)
xinlei 110:b7a403dbceb6 85 return true;
xinlei 110:b7a403dbceb6 86 else if (i >= N)
xinlei 107:fc5f25f0e0d5 87 aWarning("Over %u pending operations.\n", N);
xinlei 108:f1ee3e1eb126 88 ControlParser cp(opool);
xinlei 107:fc5f25f0e0d5 89 bool flag = true;
xinlei 107:fc5f25f0e0d5 90 l = 0;
xinlei 107:fc5f25f0e0d5 91 for (size_t j = 0; j < i; ++j) {
xinlei 107:fc5f25f0e0d5 92 l += snprintf(buf2+l, sizeof(buf2)-l, "112,%ld\r\n", opl[j]);
xinlei 107:fc5f25f0e0d5 93 }
xinlei 107:fc5f25f0e0d5 94 l = snprintf(buf, sizeof(buf), fmtSmartRest, "/s", l, buf2);
xinlei 107:fc5f25f0e0d5 95 l = sock.sendAndReceive(buf, l, sizeof(buf));
xinlei 107:fc5f25f0e0d5 96 if (l >= 0)
xinlei 107:fc5f25f0e0d5 97 cp.parse(buf);
xinlei 107:fc5f25f0e0d5 98 else
xinlei 107:fc5f25f0e0d5 99 flag = false;
xinlei 107:fc5f25f0e0d5 100 return flag;
xinlei 94:61d44636f020 101 }