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:
117:5de54f09f754
Etisalat and Teleena APN.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Cumulocity 41:804f6a0bda26 1 #include <stdlib.h>
Cumulocity 41:804f6a0bda26 2 #include <stdio.h>
Cumulocity 41:804f6a0bda26 3 #include <string.h>
xinlei 93:0acd11870c6a 4 #include "DeviceBootstrap.h"
xinlei 105:fd3571349e5d 5 #include "Storage.h"
xinlei 96:5dfdc8568e9f 6 #include "LCDDisplay.h"
xinlei 93:0acd11870c6a 7 #include "SmartRestConf.h"
xinlei 117:5de54f09f754 8 #include "SmartRestSocket.h"
xinlei 117:5de54f09f754 9 #include "lex.h"
xinlei 72:c5709ae7b193 10 #include "logging.h"
Cumulocity 41:804f6a0bda26 11
xinlei 113:3872569be2af 12 // Device bootstrap tenant, username and password
xinlei 113:3872569be2af 13 #define BOOTSTRAP_TENANT "management"
xinlei 113:3872569be2af 14 #define BOOTSTRAP_USERNAME "devicebootstrap"
xinlei 101:dbcd3bc51758 15 #define BOOTSTRAP_PASSWORD "Fhdt1bb1f"
xinlei 101:dbcd3bc51758 16
xinlei 113:3872569be2af 17 bool DeviceBootstrap::bootstrap()
Cumulocity 41:804f6a0bda26 18 {
xinlei 113:3872569be2af 19 char tenant[CREDENTIAL_LENGTH];
xinlei 113:3872569be2af 20 char username[CREDENTIAL_LENGTH];
xinlei 113:3872569be2af 21 char password[CREDENTIAL_LENGTH];
xinlei 113:3872569be2af 22 if (loadCredential(tenant, username, password, CREDENTIAL_LENGTH)) {
xinlei 113:3872569be2af 23 setAuth(tenant, username, password);
xinlei 113:3872569be2af 24 aInfo("Set auth: %s/%s:%s(%s)\n", srTenant, srUsername, srPassword, srAuthStr);
xinlei 101:dbcd3bc51758 25 return true;
xinlei 101:dbcd3bc51758 26 } else if (obtainFromPlatform()) {
xinlei 113:3872569be2af 27 if (!saveCredential(srTenant, srUsername, srPassword, CREDENTIAL_LENGTH))
xinlei 113:3872569be2af 28 aError("Save credentials!\n");
xinlei 101:dbcd3bc51758 29 return true;
xinlei 101:dbcd3bc51758 30 } else {
xinlei 101:dbcd3bc51758 31 return false;
Cumulocity 41:804f6a0bda26 32 }
Cumulocity 41:804f6a0bda26 33 }
Cumulocity 41:804f6a0bda26 34
Cumulocity 41:804f6a0bda26 35 bool DeviceBootstrap::obtainFromPlatform()
xinlei 101:dbcd3bc51758 36 {
xinlei 117:5de54f09f754 37 char buf[SMARTREST_SIZE];
xinlei 117:5de54f09f754 38 char buf2[SMARTREST_BODY_SIZE];
xinlei 117:5de54f09f754 39 SmartRestSocket sock;
xinlei 117:5de54f09f754 40 int l2 = snprintf(buf2, sizeof(buf2), "61,%s\r\n", deviceInfo.imei());
Cumulocity 41:804f6a0bda26 41
xinlei 117:5de54f09f754 42 // set authorization for bootstrap
xinlei 117:5de54f09f754 43 setAuth(BOOTSTRAP_TENANT, BOOTSTRAP_USERNAME, BOOTSTRAP_PASSWORD);
xinlei 117:5de54f09f754 44 LCDDisplay::inst().setLines("Bootstrap", deviceInfo.imei());
xinlei 117:5de54f09f754 45 for (unsigned short i = 0; i < 255; ++i) {
xinlei 117:5de54f09f754 46 int l = snprintf(buf, sizeof(buf), fmtSmartRest, "/s", l2, buf2);
xinlei 117:5de54f09f754 47 l = sock.sendAndReceive(buf, l, sizeof(buf));
xinlei 117:5de54f09f754 48 if (l <= 0) continue;
xinlei 93:0acd11870c6a 49
xinlei 117:5de54f09f754 50 const char *p = skipHTTPHeader(buf);
xinlei 117:5de54f09f754 51 if (p) {
xinlei 117:5de54f09f754 52 Token tok;
xinlei 117:5de54f09f754 53 p = lex(p, tok);
xinlei 117:5de54f09f754 54 if (tok.len==2 && strncmp(tok.p, "70", tok.len)==0) {
xinlei 117:5de54f09f754 55 for (unsigned short j = 0; *p && j < 3; ++j) {
xinlei 117:5de54f09f754 56 p = lex(p, tok);
xinlei 117:5de54f09f754 57 }
xinlei 117:5de54f09f754 58 if (tok.type == Token::STRING) {
xinlei 117:5de54f09f754 59 char tenant[CREDENTIAL_LENGTH] = {0};
xinlei 117:5de54f09f754 60 char username[CREDENTIAL_LENGTH] = {0};
xinlei 117:5de54f09f754 61 char password[CREDENTIAL_LENGTH] = {0};
xinlei 117:5de54f09f754 62 strncpy(tenant, tok.p, tok.len);
xinlei 117:5de54f09f754 63 p = lex(p, tok);
xinlei 117:5de54f09f754 64 if (tok.type == Token::STRING)
xinlei 117:5de54f09f754 65 strncpy(username, tok.p, tok.len);
xinlei 117:5de54f09f754 66 else
xinlei 117:5de54f09f754 67 return false;
xinlei 117:5de54f09f754 68 p = lex(p, tok);
xinlei 117:5de54f09f754 69 if (tok.type == Token::STRING)
xinlei 117:5de54f09f754 70 strncpy(password, tok.p, tok.len);
xinlei 117:5de54f09f754 71 else
xinlei 117:5de54f09f754 72 return false;
xinlei 117:5de54f09f754 73 setAuth(tenant, username, password);
xinlei 117:5de54f09f754 74 LCDDisplay::inst().setLines("Bootstrap Success", srTenant, srUsername);
xinlei 117:5de54f09f754 75 aInfo("%s/%s:%s\n", srTenant, srUsername, srPassword);
xinlei 117:5de54f09f754 76 return true;
xinlei 117:5de54f09f754 77 } else
xinlei 117:5de54f09f754 78 return false;
xinlei 117:5de54f09f754 79 }
xinlei 117:5de54f09f754 80 }
Cumulocity 41:804f6a0bda26 81 }
xinlei 117:5de54f09f754 82 return false;
xinlei 113:3872569be2af 83 }