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:
138:1e37ea2f2357
Etisalat and Teleena APN.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
xinlei 93:0acd11870c6a 1 #include <string.h>
xinlei 94:61d44636f020 2 #include <stdio.h>
xinlei 93:0acd11870c6a 3 #include "b64.h"
xinlei 99:e369fc75c000 4 #include "SmartRestConf.h"
xinlei 93:0acd11870c6a 5
xinlei 113:3872569be2af 6 char srTenant[CREDENTIAL_LENGTH] = {0};
xinlei 113:3872569be2af 7 char srUsername[CREDENTIAL_LENGTH] = {0};
xinlei 113:3872569be2af 8 char srPassword[CREDENTIAL_LENGTH] = {0};
xinlei 99:e369fc75c000 9 char srAuthStr[100] = {0};
xinlei 117:5de54f09f754 10 //const char *srX_ID = "com_cumulocity_MbedAgent_1.5.2";
xinlei 117:5de54f09f754 11 const char *srX_ID = NULL;
xinlei 132:a06da6952339 12 const char *srHost = "developer.cumulocity.com";
xinlei 138:1e37ea2f2357 13 //const char *srHost = "iot.etisalat.eg";
xinlei 138:1e37ea2f2357 14 //const char *srHost = "management.teleena-iot.com";
xinlei 138:1e37ea2f2357 15 //const char *srHost = "post-iot.lu";
xinlei 135:c4009ecaf5c0 16 //const char *srHost = "dev-a.cumulocity.com";
xinlei 135:c4009ecaf5c0 17 //const char *srHost = "dev-c.cumulocity.com";
xinlei 101:dbcd3bc51758 18 //const char *srHost = "management.m2m-devicecloud.com";
xinlei 99:e369fc75c000 19 long deviceID = 0;
xinlei 94:61d44636f020 20 char fmtSmartRest[200] = {0};
xinlei 93:0acd11870c6a 21
xinlei 106:c61f0d62b625 22 static void setAuthStr(const char* p1, const char* p2)
xinlei 93:0acd11870c6a 23 {
xinlei 99:e369fc75c000 24 memset(srAuthStr, 0, sizeof(srAuthStr));
xinlei 93:0acd11870c6a 25 size_t ul = strlen(p1);
xinlei 93:0acd11870c6a 26 size_t pl = strlen(p2);
xinlei 93:0acd11870c6a 27 unsigned char input[3], output[5];
xinlei 93:0acd11870c6a 28 int inputOffset = 0;
xinlei 93:0acd11870c6a 29
xinlei 93:0acd11870c6a 30 for (size_t i = 0; i < (ul+1+pl); i++) {
xinlei 93:0acd11870c6a 31 if (i < ul)
xinlei 93:0acd11870c6a 32 input[inputOffset++] = p1[i];
xinlei 93:0acd11870c6a 33 else if (i == ul)
xinlei 93:0acd11870c6a 34 input[inputOffset++] = ':';
xinlei 93:0acd11870c6a 35 else
xinlei 93:0acd11870c6a 36 input[inputOffset++] = p2[i-(ul+1)];
xinlei 93:0acd11870c6a 37
xinlei 93:0acd11870c6a 38 if ((inputOffset == 3) || (i == ul+pl)) {
xinlei 93:0acd11870c6a 39 b64_encode(input, inputOffset, output, 4);
xinlei 93:0acd11870c6a 40 output[4] = '\0';
xinlei 99:e369fc75c000 41 strcat(srAuthStr, (char*)output);
xinlei 93:0acd11870c6a 42 inputOffset = 0;
xinlei 93:0acd11870c6a 43 }
xinlei 93:0acd11870c6a 44 }
xinlei 93:0acd11870c6a 45 }
xinlei 93:0acd11870c6a 46
xinlei 113:3872569be2af 47 static void setTenant(const char *tenant)
xinlei 93:0acd11870c6a 48 {
xinlei 113:3872569be2af 49 snprintf(srTenant, sizeof(srTenant), "%s", tenant);
xinlei 93:0acd11870c6a 50 }
xinlei 93:0acd11870c6a 51
xinlei 113:3872569be2af 52 static void setUsername(const char *username)
xinlei 93:0acd11870c6a 53 {
xinlei 113:3872569be2af 54 snprintf(srUsername, sizeof(srUsername), "%s", username);
xinlei 113:3872569be2af 55 }
xinlei 113:3872569be2af 56
xinlei 113:3872569be2af 57 static void setPassword(const char *password)
xinlei 113:3872569be2af 58 {
xinlei 113:3872569be2af 59 snprintf(srPassword, sizeof(srPassword), "%s", password);
xinlei 94:61d44636f020 60 }
xinlei 94:61d44636f020 61
xinlei 106:c61f0d62b625 62 static void setSmartRestFmt()
xinlei 94:61d44636f020 63 {
xinlei 117:5de54f09f754 64 if (srX_ID) {
xinlei 117:5de54f09f754 65 const char fmt[] = "POST %%s HTTP/1.0\r\nHost: %s\r\nAuthorization: Basic %s\r\nX-Id: %s\r\nContent-Length: %%d\r\n\r\n%%s";
xinlei 117:5de54f09f754 66 snprintf(fmtSmartRest, sizeof(fmtSmartRest), fmt, srHost, srAuthStr, srX_ID);
xinlei 117:5de54f09f754 67 } else {
xinlei 117:5de54f09f754 68 const char fmt[] = "POST %%s HTTP/1.0\r\nHost: %s\r\nAuthorization: Basic %s\r\nContent-Length: %%d\r\n\r\n%%s";
xinlei 117:5de54f09f754 69 snprintf(fmtSmartRest, sizeof(fmtSmartRest), fmt, srHost, srAuthStr);
xinlei 117:5de54f09f754 70 }
xinlei 94:61d44636f020 71 }
xinlei 94:61d44636f020 72
xinlei 99:e369fc75c000 73 void setX_ID(const char* id)
xinlei 94:61d44636f020 74 {
xinlei 94:61d44636f020 75 if (id) {
xinlei 99:e369fc75c000 76 srX_ID = id;
xinlei 94:61d44636f020 77 setSmartRestFmt();
xinlei 94:61d44636f020 78 }
xinlei 94:61d44636f020 79 }
xinlei 94:61d44636f020 80
xinlei 99:e369fc75c000 81 void setDeviceID(long id)
xinlei 99:e369fc75c000 82 {
xinlei 99:e369fc75c000 83 deviceID = id;
xinlei 99:e369fc75c000 84 }
xinlei 99:e369fc75c000 85
xinlei 113:3872569be2af 86 void setAuth(const char *tenant, const char *username, const char *password)
xinlei 94:61d44636f020 87 {
xinlei 113:3872569be2af 88 if (tenant)
xinlei 113:3872569be2af 89 setTenant(tenant);
xinlei 94:61d44636f020 90 if (username)
xinlei 94:61d44636f020 91 setUsername(username);
xinlei 94:61d44636f020 92 if (password)
xinlei 94:61d44636f020 93 setPassword(password);
xinlei 113:3872569be2af 94 if (tenant || username || password) {
xinlei 113:3872569be2af 95 char s[CREDENTIAL_LENGTH*2];
xinlei 113:3872569be2af 96 snprintf(s, sizeof(s), "%s/%s", tenant, username);
xinlei 113:3872569be2af 97 setAuthStr(s, password);
xinlei 94:61d44636f020 98 setSmartRestFmt();
xinlei 94:61d44636f020 99 }
xinlei 94:61d44636f020 100 }