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:
Cumulocity
Date:
2014-07-24
Revision:
43:eff77697d88c
Parent:
42:104746744af8
Child:
46:f6976fd64387

File content as of revision 43:eff77697d88c:

#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;
    const char *id;
    
    id = _deviceInfo.imei();
    printf("Starting device bootstrap with '%s'\n", id);
    
    ComposedRecord record;
    ParsedRecord recvdRecord;

    IntegerValue msgId(61);
    CharValue identifier(id);
    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;
        }
        _client.stop();
        
        for (size_t q = 0; q < recvdRecord.values(); q++)
            puts(recvdRecord.rawValue(q));
            
        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';
}