Own fork of MbedSmartRestMain
Dependencies: C027_Support C12832 LM75B MMA7660 MbedSmartRest mbed-rtos mbed
Fork of MbedSmartRestMain by
Diff: DeviceBootstrap.cpp
- Revision:
- 41:804f6a0bda26
- Child:
- 42:104746744af8
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/DeviceBootstrap.cpp Tue Jul 15 12:44:34 2014 +0000 @@ -0,0 +1,146 @@ +#include "DeviceBootstrap.h" +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include "rtos.h" +#include "ComposedRecord.h" +#include "CharValue.h" +#include "IntegerValue.h" +#include "ParsedRecord.h" + +DeviceBootstrap::DeviceBootstrap(SmartRest& client, MDMSerial& mdm, DeviceInfo& deviceInfo) : + _client(client), + _mdm(mdm), + _deviceInfo(deviceInfo) +{ + *_username = *_password = '\0'; +} + +bool DeviceBootstrap::setUpCredentials() +{ + if (((*_username == '\0') || (*_password == '\0')) && + (!obtainFromStorage())) { + if (!obtainFromPlatform()) + return false; + if (!writeToStorage()) + puts("Warning: Could not write credentials to file!"); + } + + printf("Credentials: %s : %s\n", _username, _password); + if (_client.setAuthorization(_username, _password) != SMARTREST_SUCCESS) + return false; + return true; +} + +bool DeviceBootstrap::obtainFromStorage() +{ + char buf[DEVICE_BOOTSTRAP_CREDENTIALS_LENGTH*2+2], *ptr; + + int res = _mdm.readFile(CREDENTIALS_FILE, buf, sizeof(buf)); + + if (res < 0) + return false; + + buf[res] = '\0'; + if ((ptr = strchr(buf, '\n')) == NULL) + return false; + *ptr = '\0'; + + ptr = buf; + strcpy(_username, ptr); + ptr += strlen(ptr)+1; + strcpy(_password, ptr); + return true; +} + +bool DeviceBootstrap::obtainFromPlatform() +{ + uint8_t ret; + + printf("Starting device bootstrap with '%s'\n", _deviceInfo.imei()); + + ComposedRecord record; + ParsedRecord recvdRecord; + + IntegerValue msgId(61); + CharValue identifier(_deviceInfo.imei()); + if ((!record.add(msgId)) || (!record.add(identifier))) + return false; + + // set authorization for bootstrap + if (_client.setAuthorization(DEVICE_BOOTSTRAP_USERNAME, DEVICE_BOOTSTRAP_PASSWORD) != SMARTREST_SUCCESS) + return false; + + while (true) { + if (_client.send(record, "") != SMARTREST_SUCCESS) { + puts("Connection unsuccessful. Retrying."); + _client.stop(); + Thread::wait(2000); + continue; + } + + if (_client.receive(recvdRecord) != SMARTREST_SUCCESS) { + puts("Receiving failure."); + _client.stop(); + Thread::wait(2000); + continue; + } + + if ((recvdRecord.values() < 1) || + (recvdRecord.value(0).integerValue() == 50)) { + puts("No credentials available yet. Retrying."); + Thread::wait(2000); + continue; + } + + if ((recvdRecord.value(0).integerValue() != 70) || + (recvdRecord.values() != 6)) { + puts("Bad credentials received."); + return false; + } + + setCredentials(recvdRecord.value(3).characterValue(), + recvdRecord.value(4).characterValue(), + recvdRecord.value(5).characterValue()); + + return true; + } + return false; +} + +bool DeviceBootstrap::writeToStorage() +{ + char buf[DEVICE_BOOTSTRAP_CREDENTIALS_LENGTH*2+2], *ptr; + size_t len; + + ptr = buf; + len = strlen(_username); + strcpy(ptr, _username); + ptr += len; + + *ptr++ = '\n'; + len++; + + len += strlen(_password); + strcpy(ptr, _password); + + _mdm.delFile(CREDENTIALS_FILE); + _mdm.writeFile(CREDENTIALS_FILE, buf, len); + return true; +} + +void DeviceBootstrap::setCredentials(const char *tenant, const char *username, const char *password) +{ + *_username = '\0'; + if (tenant != NULL) { + strncpy(_username, tenant, DEVICE_BOOTSTRAP_CREDENTIALS_LENGTH); + _username[DEVICE_BOOTSTRAP_CREDENTIALS_LENGTH-1] = '\0'; + if (strlen(_username)+1 < DEVICE_BOOTSTRAP_CREDENTIALS_LENGTH) + strcat(_username, "/"); + } + strncat(_username, username, DEVICE_BOOTSTRAP_CREDENTIALS_LENGTH-strlen(_username)); + _username[DEVICE_BOOTSTRAP_CREDENTIALS_LENGTH-1] = '\0'; + + strncpy(_password, password, DEVICE_BOOTSTRAP_CREDENTIALS_LENGTH); + _password[DEVICE_BOOTSTRAP_CREDENTIALS_LENGTH-1] = '\0'; +}