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

DeviceBootstrap.cpp

Committer:
xinlei
Date:
2015-04-13
Revision:
93:0acd11870c6a
Parent:
92:48069375dffa
Child:
94:61d44636f020

File content as of revision 93:0acd11870c6a:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "DeviceBootstrap.h"
#include "rtos.h"
#include "ComposedRecord.h"
#include "CharValue.h"
#include "IntegerValue.h"
#include "ParsedRecord.h"
#include "SmartRestConf.h"
#include "logging.h"

DeviceBootstrap::DeviceBootstrap(AbstractSmartRest& client, LCDDisplay& lcdDisplay,
    DeviceInfo& deviceInfo, DeviceMemory& deviceMemory) :
    _client(client),
    _deviceInfo(deviceInfo),
    _deviceMemory(deviceMemory),
    _lcdDisplay(lcdDisplay)
{
    *_username = *_password = '\0';
}

bool DeviceBootstrap::setUpCredentials()
{
    if ((*_username == '\0' || *_password == '\0') &&
        (!obtainFromStorage())) {
        if (!obtainFromPlatform())
            return false;
        if (!writeToStorage())
            aWarning("Can not write credentials!\n");
    }

    setAuth(_username, _password);
    return true;
}

const char * DeviceBootstrap::username()
{
    return _username;
}

const char * DeviceBootstrap::password()
{
    return _password;
}

bool DeviceBootstrap::obtainFromStorage()
{
    return _deviceMemory.loadPlatformCredentials(_username, _password, DEVICE_BOOTSTRAP_CREDENTIALS_LENGTH);
}

bool DeviceBootstrap::obtainFromPlatform()
{    
    ComposedRecord record;
    ParsedRecord recvdRecord;

    IntegerValue msgId(61);
    CharValue identifier(_deviceInfo.imei());
    if (!record.add(msgId) || !record.add(identifier))
        return false;

    // set authorization for bootstrap
    setAuth(DEVICE_BOOTSTRAP_USERNAME, DEVICE_BOOTSTRAP_PASSWORD);

    _lcdDisplay.setLines("Bootstrap", _deviceInfo.imei());

    uint8_t tries = 255;
    do {
        if (_client.send(record, "") != SMARTREST_SUCCESS) {
            _client.stop();
            Thread::wait(2000);
            continue;
        }
        if (_client.receive(recvdRecord) != SMARTREST_SUCCESS) {
            _client.stop();
            Thread::wait(2000);
            continue;
        }
        _client.stop();

        if ((recvdRecord.values() < 1) ||
            (recvdRecord.value(0).integerValue() == 50)) {
            Thread::wait(2000);
            continue;
        }
        if ((recvdRecord.value(0).integerValue() != 70) ||
            (recvdRecord.values() != 6)) {
            return false;
        }
        
        setCredentials(recvdRecord.value(3).characterValue(),
                       recvdRecord.value(4).characterValue(),
                       recvdRecord.value(5).characterValue());        
        _lcdDisplay.setLines("Bootstrap Success", _username, _password);
        return true;
    } while (--tries > 0);

    _lcdDisplay.setLines("Bootstrap Failure");
    return false;
}

bool DeviceBootstrap::writeToStorage()
{
    return _deviceMemory.savePlatformCredentials(_username, _password, DEVICE_BOOTSTRAP_CREDENTIALS_LENGTH);
}

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';
}