Simple interface for Mbed Cloud Client

Dependents:  

Committer:
MACRUM
Date:
Mon Jul 02 06:30:39 2018 +0000
Revision:
0:276e7a263c35
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MACRUM 0:276e7a263c35 1 // ----------------------------------------------------------------------------
MACRUM 0:276e7a263c35 2 // Copyright 2016-2017 ARM Ltd.
MACRUM 0:276e7a263c35 3 //
MACRUM 0:276e7a263c35 4 // SPDX-License-Identifier: Apache-2.0
MACRUM 0:276e7a263c35 5 //
MACRUM 0:276e7a263c35 6 // Licensed under the Apache License, Version 2.0 (the "License");
MACRUM 0:276e7a263c35 7 // you may not use this file except in compliance with the License.
MACRUM 0:276e7a263c35 8 // You may obtain a copy of the License at
MACRUM 0:276e7a263c35 9 //
MACRUM 0:276e7a263c35 10 // http://www.apache.org/licenses/LICENSE-2.0
MACRUM 0:276e7a263c35 11 //
MACRUM 0:276e7a263c35 12 // Unless required by applicable law or agreed to in writing, software
MACRUM 0:276e7a263c35 13 // distributed under the License is distributed on an "AS IS" BASIS,
MACRUM 0:276e7a263c35 14 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
MACRUM 0:276e7a263c35 15 // See the License for the specific language governing permissions and
MACRUM 0:276e7a263c35 16 // limitations under the License.
MACRUM 0:276e7a263c35 17 // ----------------------------------------------------------------------------
MACRUM 0:276e7a263c35 18
MACRUM 0:276e7a263c35 19 #include <stdio.h>
MACRUM 0:276e7a263c35 20 #include "simple-mbed-cloud-client.h"
MACRUM 0:276e7a263c35 21 #include "mbed-cloud-client/MbedCloudClient.h"
MACRUM 0:276e7a263c35 22 #include "m2mdevice.h"
MACRUM 0:276e7a263c35 23 #include "m2mresource.h"
MACRUM 0:276e7a263c35 24 #include "mbed-client/m2minterface.h"
MACRUM 0:276e7a263c35 25 #include "key_config_manager.h"
MACRUM 0:276e7a263c35 26 #include "resource.h"
MACRUM 0:276e7a263c35 27 #include "mbed-client/m2mvector.h"
MACRUM 0:276e7a263c35 28 #include "mbed_cloud_client_resource.h"
MACRUM 0:276e7a263c35 29 #include "factory_configurator_client.h"
MACRUM 0:276e7a263c35 30
MACRUM 0:276e7a263c35 31 #ifdef MBED_CLOUD_CLIENT_USER_CONFIG_FILE
MACRUM 0:276e7a263c35 32 #include MBED_CLOUD_CLIENT_USER_CONFIG_FILE
MACRUM 0:276e7a263c35 33 #endif
MACRUM 0:276e7a263c35 34
MACRUM 0:276e7a263c35 35 #ifdef MBED_CLOUD_CLIENT_SUPPORT_UPDATE
MACRUM 0:276e7a263c35 36 #include "update_ui_example.h"
MACRUM 0:276e7a263c35 37 #endif
MACRUM 0:276e7a263c35 38
MACRUM 0:276e7a263c35 39 #ifdef MBED_HEAP_STATS_ENABLED
MACRUM 0:276e7a263c35 40 #include "memory_tests.h"
MACRUM 0:276e7a263c35 41 #endif
MACRUM 0:276e7a263c35 42
MACRUM 0:276e7a263c35 43 #define DEFAULT_FIRMWARE_PATH "/sd/firmware"
MACRUM 0:276e7a263c35 44
MACRUM 0:276e7a263c35 45 SimpleMbedCloudClient::SimpleMbedCloudClient(NetworkInterface *net) :
MACRUM 0:276e7a263c35 46 _registered(false),
MACRUM 0:276e7a263c35 47 _register_called(false),
MACRUM 0:276e7a263c35 48 net(net) {
MACRUM 0:276e7a263c35 49 }
MACRUM 0:276e7a263c35 50
MACRUM 0:276e7a263c35 51 SimpleMbedCloudClient::~SimpleMbedCloudClient() {
MACRUM 0:276e7a263c35 52 for (unsigned int i = 0; _resources.size(); i++) {
MACRUM 0:276e7a263c35 53 delete _resources[i];
MACRUM 0:276e7a263c35 54 }
MACRUM 0:276e7a263c35 55 }
MACRUM 0:276e7a263c35 56
MACRUM 0:276e7a263c35 57 int SimpleMbedCloudClient::init() {
MACRUM 0:276e7a263c35 58 // Initialize the FCC
MACRUM 0:276e7a263c35 59 fcc_status_e fcc_status = fcc_init();
MACRUM 0:276e7a263c35 60 if(fcc_status != FCC_STATUS_SUCCESS) {
MACRUM 0:276e7a263c35 61 printf("fcc_init failed with status %d! - exit\n", fcc_status);
MACRUM 0:276e7a263c35 62 return 1;
MACRUM 0:276e7a263c35 63 }
MACRUM 0:276e7a263c35 64
MACRUM 0:276e7a263c35 65 // Resets storage to an empty state.
MACRUM 0:276e7a263c35 66 // Use this function when you want to clear storage from all the factory-tool generated data and user data.
MACRUM 0:276e7a263c35 67 // After this operation device must be injected again by using factory tool or developer certificate.
MACRUM 0:276e7a263c35 68 #ifdef RESET_STORAGE
MACRUM 0:276e7a263c35 69 printf("Reset storage to an empty state.\n");
MACRUM 0:276e7a263c35 70 fcc_status_e delete_status = fcc_storage_delete();
MACRUM 0:276e7a263c35 71 if (delete_status != FCC_STATUS_SUCCESS) {
MACRUM 0:276e7a263c35 72 printf("Failed to delete storage - %d\n", delete_status);
MACRUM 0:276e7a263c35 73 }
MACRUM 0:276e7a263c35 74 #endif
MACRUM 0:276e7a263c35 75
MACRUM 0:276e7a263c35 76 // Deletes existing firmware images from storage.
MACRUM 0:276e7a263c35 77 // This deletes any existing firmware images during application startup.
MACRUM 0:276e7a263c35 78 // This compilation flag is currently implemented only for mbed OS.
MACRUM 0:276e7a263c35 79 #ifdef RESET_FIRMWARE
MACRUM 0:276e7a263c35 80 palStatus_t status = PAL_SUCCESS;
MACRUM 0:276e7a263c35 81 status = pal_fsRmFiles(DEFAULT_FIRMWARE_PATH);
MACRUM 0:276e7a263c35 82 if(status == PAL_SUCCESS) {
MACRUM 0:276e7a263c35 83 printf("Firmware storage erased.\n");
MACRUM 0:276e7a263c35 84 } else if (status == PAL_ERR_FS_NO_PATH) {
MACRUM 0:276e7a263c35 85 printf("Firmware path not found/does not exist.\n");
MACRUM 0:276e7a263c35 86 } else {
MACRUM 0:276e7a263c35 87 printf("Firmware storage erasing failed with %" PRId32, status);
MACRUM 0:276e7a263c35 88 return 1;
MACRUM 0:276e7a263c35 89 }
MACRUM 0:276e7a263c35 90 #endif
MACRUM 0:276e7a263c35 91
MACRUM 0:276e7a263c35 92 #if MBED_CONF_APP_DEVELOPER_MODE == 1
MACRUM 0:276e7a263c35 93 printf("Start developer flow\n");
MACRUM 0:276e7a263c35 94 fcc_status = fcc_developer_flow();
MACRUM 0:276e7a263c35 95 if (fcc_status == FCC_STATUS_KCM_FILE_EXIST_ERROR) {
MACRUM 0:276e7a263c35 96 printf("Developer credentials already exist\n");
MACRUM 0:276e7a263c35 97 } else if (fcc_status != FCC_STATUS_SUCCESS) {
MACRUM 0:276e7a263c35 98 printf("Failed to load developer credentials - exit\n");
MACRUM 0:276e7a263c35 99 return 1;
MACRUM 0:276e7a263c35 100 }
MACRUM 0:276e7a263c35 101 #endif
MACRUM 0:276e7a263c35 102 fcc_status = fcc_verify_device_configured_4mbed_cloud();
MACRUM 0:276e7a263c35 103 if (fcc_status != FCC_STATUS_SUCCESS) {
MACRUM 0:276e7a263c35 104 printf("Device not configured for mbed Cloud - exit\n");
MACRUM 0:276e7a263c35 105 return 1;
MACRUM 0:276e7a263c35 106 }
MACRUM 0:276e7a263c35 107 }
MACRUM 0:276e7a263c35 108
MACRUM 0:276e7a263c35 109 bool SimpleMbedCloudClient::call_register() {
MACRUM 0:276e7a263c35 110
MACRUM 0:276e7a263c35 111 _cloud_client.on_registered(this, &SimpleMbedCloudClient::client_registered);
MACRUM 0:276e7a263c35 112 _cloud_client.on_unregistered(this, &SimpleMbedCloudClient::client_unregistered);
MACRUM 0:276e7a263c35 113 _cloud_client.on_error(this, &SimpleMbedCloudClient::error);
MACRUM 0:276e7a263c35 114
MACRUM 0:276e7a263c35 115 printf("Connecting...\n");
MACRUM 0:276e7a263c35 116 bool setup = _cloud_client.setup(net);
MACRUM 0:276e7a263c35 117 _register_called = true;
MACRUM 0:276e7a263c35 118 if (!setup) {
MACRUM 0:276e7a263c35 119 printf("Client setup failed\n");
MACRUM 0:276e7a263c35 120 return false;
MACRUM 0:276e7a263c35 121 }
MACRUM 0:276e7a263c35 122
MACRUM 0:276e7a263c35 123 #ifdef MBED_CLOUD_CLIENT_SUPPORT_UPDATE
MACRUM 0:276e7a263c35 124 /* Set callback functions for authorizing updates and monitoring progress.
MACRUM 0:276e7a263c35 125 Code is implemented in update_ui_example.cpp
MACRUM 0:276e7a263c35 126 Both callbacks are completely optional. If no authorization callback
MACRUM 0:276e7a263c35 127 is set, the update process will procede immediately in each step.
MACRUM 0:276e7a263c35 128 */
MACRUM 0:276e7a263c35 129 update_ui_set_cloud_client(&_cloud_client);
MACRUM 0:276e7a263c35 130 _cloud_client.set_update_authorize_handler(update_authorize);
MACRUM 0:276e7a263c35 131 _cloud_client.set_update_progress_handler(update_progress);
MACRUM 0:276e7a263c35 132 #endif
MACRUM 0:276e7a263c35 133 return true;
MACRUM 0:276e7a263c35 134 }
MACRUM 0:276e7a263c35 135
MACRUM 0:276e7a263c35 136 void SimpleMbedCloudClient::close() {
MACRUM 0:276e7a263c35 137 _cloud_client.close();
MACRUM 0:276e7a263c35 138 }
MACRUM 0:276e7a263c35 139
MACRUM 0:276e7a263c35 140 void SimpleMbedCloudClient::register_update() {
MACRUM 0:276e7a263c35 141 _cloud_client.register_update();
MACRUM 0:276e7a263c35 142 }
MACRUM 0:276e7a263c35 143
MACRUM 0:276e7a263c35 144 void SimpleMbedCloudClient::client_registered() {
MACRUM 0:276e7a263c35 145 _registered = true;
MACRUM 0:276e7a263c35 146 printf("\nClient registered\n\n");
MACRUM 0:276e7a263c35 147 static const ConnectorClientEndpointInfo* endpoint = NULL;
MACRUM 0:276e7a263c35 148 if (endpoint == NULL) {
MACRUM 0:276e7a263c35 149 endpoint = _cloud_client.endpoint_info();
MACRUM 0:276e7a263c35 150 if (endpoint) {
MACRUM 0:276e7a263c35 151
MACRUM 0:276e7a263c35 152 #if MBED_CONF_APP_DEVELOPER_MODE == 1
MACRUM 0:276e7a263c35 153 printf("Endpoint Name: %s\r\n", endpoint->internal_endpoint_name.c_str());
MACRUM 0:276e7a263c35 154 #else
MACRUM 0:276e7a263c35 155 printf("Endpoint Name: %s\r\n", endpoint->endpoint_name.c_str());
MACRUM 0:276e7a263c35 156 #endif
MACRUM 0:276e7a263c35 157 printf("Device Id: %s\r\n", endpoint->internal_endpoint_name.c_str());
MACRUM 0:276e7a263c35 158 }
MACRUM 0:276e7a263c35 159 }
MACRUM 0:276e7a263c35 160 #ifdef MBED_HEAP_STATS_ENABLED
MACRUM 0:276e7a263c35 161 heap_stats();
MACRUM 0:276e7a263c35 162 #endif
MACRUM 0:276e7a263c35 163 }
MACRUM 0:276e7a263c35 164
MACRUM 0:276e7a263c35 165 void SimpleMbedCloudClient::client_unregistered() {
MACRUM 0:276e7a263c35 166 _registered = false;
MACRUM 0:276e7a263c35 167 _register_called = false;
MACRUM 0:276e7a263c35 168 printf("\nClient unregistered - Exiting application\n\n");
MACRUM 0:276e7a263c35 169 #ifdef MBED_HEAP_STATS_ENABLED
MACRUM 0:276e7a263c35 170 heap_stats();
MACRUM 0:276e7a263c35 171 #endif
MACRUM 0:276e7a263c35 172 }
MACRUM 0:276e7a263c35 173
MACRUM 0:276e7a263c35 174 void SimpleMbedCloudClient::error(int error_code) {
MACRUM 0:276e7a263c35 175 const char *error;
MACRUM 0:276e7a263c35 176 switch(error_code) {
MACRUM 0:276e7a263c35 177 case MbedCloudClient::ConnectErrorNone:
MACRUM 0:276e7a263c35 178 error = "MbedCloudClient::ConnectErrorNone";
MACRUM 0:276e7a263c35 179 break;
MACRUM 0:276e7a263c35 180 case MbedCloudClient::ConnectAlreadyExists:
MACRUM 0:276e7a263c35 181 error = "MbedCloudClient::ConnectAlreadyExists";
MACRUM 0:276e7a263c35 182 break;
MACRUM 0:276e7a263c35 183 case MbedCloudClient::ConnectBootstrapFailed:
MACRUM 0:276e7a263c35 184 error = "MbedCloudClient::ConnectBootstrapFailed";
MACRUM 0:276e7a263c35 185 break;
MACRUM 0:276e7a263c35 186 case MbedCloudClient::ConnectInvalidParameters:
MACRUM 0:276e7a263c35 187 error = "MbedCloudClient::ConnectInvalidParameters";
MACRUM 0:276e7a263c35 188 break;
MACRUM 0:276e7a263c35 189 case MbedCloudClient::ConnectNotRegistered:
MACRUM 0:276e7a263c35 190 error = "MbedCloudClient::ConnectNotRegistered";
MACRUM 0:276e7a263c35 191 break;
MACRUM 0:276e7a263c35 192 case MbedCloudClient::ConnectTimeout:
MACRUM 0:276e7a263c35 193 error = "MbedCloudClient::ConnectTimeout";
MACRUM 0:276e7a263c35 194 break;
MACRUM 0:276e7a263c35 195 case MbedCloudClient::ConnectNetworkError:
MACRUM 0:276e7a263c35 196 error = "MbedCloudClient::ConnectNetworkError";
MACRUM 0:276e7a263c35 197 break;
MACRUM 0:276e7a263c35 198 case MbedCloudClient::ConnectResponseParseFailed:
MACRUM 0:276e7a263c35 199 error = "MbedCloudClient::ConnectResponseParseFailed";
MACRUM 0:276e7a263c35 200 break;
MACRUM 0:276e7a263c35 201 case MbedCloudClient::ConnectUnknownError:
MACRUM 0:276e7a263c35 202 error = "MbedCloudClient::ConnectUnknownError";
MACRUM 0:276e7a263c35 203 break;
MACRUM 0:276e7a263c35 204 case MbedCloudClient::ConnectMemoryConnectFail:
MACRUM 0:276e7a263c35 205 error = "MbedCloudClient::ConnectMemoryConnectFail";
MACRUM 0:276e7a263c35 206 break;
MACRUM 0:276e7a263c35 207 case MbedCloudClient::ConnectNotAllowed:
MACRUM 0:276e7a263c35 208 error = "MbedCloudClient::ConnectNotAllowed";
MACRUM 0:276e7a263c35 209 break;
MACRUM 0:276e7a263c35 210 case MbedCloudClient::ConnectSecureConnectionFailed:
MACRUM 0:276e7a263c35 211 error = "MbedCloudClient::ConnectSecureConnectionFailed";
MACRUM 0:276e7a263c35 212 break;
MACRUM 0:276e7a263c35 213 case MbedCloudClient::ConnectDnsResolvingFailed:
MACRUM 0:276e7a263c35 214 error = "MbedCloudClient::ConnectDnsResolvingFailed";
MACRUM 0:276e7a263c35 215 break;
MACRUM 0:276e7a263c35 216 #ifdef MBED_CLOUD_CLIENT_SUPPORT_UPDATE
MACRUM 0:276e7a263c35 217 case MbedCloudClient::UpdateWarningCertificateNotFound:
MACRUM 0:276e7a263c35 218 error = "MbedCloudClient::UpdateWarningCertificateNotFound";
MACRUM 0:276e7a263c35 219 break;
MACRUM 0:276e7a263c35 220 case MbedCloudClient::UpdateWarningIdentityNotFound:
MACRUM 0:276e7a263c35 221 error = "MbedCloudClient::UpdateWarningIdentityNotFound";
MACRUM 0:276e7a263c35 222 break;
MACRUM 0:276e7a263c35 223 case MbedCloudClient::UpdateWarningCertificateInvalid:
MACRUM 0:276e7a263c35 224 error = "MbedCloudClient::UpdateWarningCertificateInvalid";
MACRUM 0:276e7a263c35 225 break;
MACRUM 0:276e7a263c35 226 case MbedCloudClient::UpdateWarningSignatureInvalid:
MACRUM 0:276e7a263c35 227 error = "MbedCloudClient::UpdateWarningSignatureInvalid";
MACRUM 0:276e7a263c35 228 break;
MACRUM 0:276e7a263c35 229 case MbedCloudClient::UpdateWarningVendorMismatch:
MACRUM 0:276e7a263c35 230 error = "MbedCloudClient::UpdateWarningVendorMismatch";
MACRUM 0:276e7a263c35 231 break;
MACRUM 0:276e7a263c35 232 case MbedCloudClient::UpdateWarningClassMismatch:
MACRUM 0:276e7a263c35 233 error = "MbedCloudClient::UpdateWarningClassMismatch";
MACRUM 0:276e7a263c35 234 break;
MACRUM 0:276e7a263c35 235 case MbedCloudClient::UpdateWarningDeviceMismatch:
MACRUM 0:276e7a263c35 236 error = "MbedCloudClient::UpdateWarningDeviceMismatch";
MACRUM 0:276e7a263c35 237 break;
MACRUM 0:276e7a263c35 238 case MbedCloudClient::UpdateWarningURINotFound:
MACRUM 0:276e7a263c35 239 error = "MbedCloudClient::UpdateWarningURINotFound";
MACRUM 0:276e7a263c35 240 break;
MACRUM 0:276e7a263c35 241 case MbedCloudClient::UpdateWarningRollbackProtection:
MACRUM 0:276e7a263c35 242 error = "MbedCloudClient::UpdateWarningRollbackProtection";
MACRUM 0:276e7a263c35 243 break;
MACRUM 0:276e7a263c35 244 case MbedCloudClient::UpdateWarningUnknown:
MACRUM 0:276e7a263c35 245 error = "MbedCloudClient::UpdateWarningUnknown";
MACRUM 0:276e7a263c35 246 break;
MACRUM 0:276e7a263c35 247 case MbedCloudClient::UpdateErrorWriteToStorage:
MACRUM 0:276e7a263c35 248 error = "MbedCloudClient::UpdateErrorWriteToStorage";
MACRUM 0:276e7a263c35 249 break;
MACRUM 0:276e7a263c35 250 case MbedCloudClient::UpdateErrorInvalidHash:
MACRUM 0:276e7a263c35 251 error = "MbedCloudClient::UpdateErrorInvalidHash";
MACRUM 0:276e7a263c35 252 break;
MACRUM 0:276e7a263c35 253 #endif
MACRUM 0:276e7a263c35 254 default:
MACRUM 0:276e7a263c35 255 error = "UNKNOWN";
MACRUM 0:276e7a263c35 256 }
MACRUM 0:276e7a263c35 257 printf("\nError occurred : %s\r\n", error);
MACRUM 0:276e7a263c35 258 printf("Error code : %d\r\n\n", error_code);
MACRUM 0:276e7a263c35 259 printf("Error details : %s\r\n\n",_cloud_client.error_description());
MACRUM 0:276e7a263c35 260 }
MACRUM 0:276e7a263c35 261
MACRUM 0:276e7a263c35 262 bool SimpleMbedCloudClient::is_client_registered() {
MACRUM 0:276e7a263c35 263 return _registered;
MACRUM 0:276e7a263c35 264 }
MACRUM 0:276e7a263c35 265
MACRUM 0:276e7a263c35 266 bool SimpleMbedCloudClient::is_register_called() {
MACRUM 0:276e7a263c35 267 return _register_called;
MACRUM 0:276e7a263c35 268 }
MACRUM 0:276e7a263c35 269
MACRUM 0:276e7a263c35 270 void SimpleMbedCloudClient::register_and_connect() {
MACRUM 0:276e7a263c35 271 // TODO this might not work if called more than once...
MACRUM 0:276e7a263c35 272 mcc_resource_def resourceDef;
MACRUM 0:276e7a263c35 273
MACRUM 0:276e7a263c35 274 // TODO clean up
MACRUM 0:276e7a263c35 275 for (unsigned int i = 0; i < _resources.size(); i++) {
MACRUM 0:276e7a263c35 276 _resources[i]->get_data(&resourceDef);
MACRUM 0:276e7a263c35 277 M2MResource *res = add_resource(&_obj_list, resourceDef.object_id, resourceDef.instance_id,
MACRUM 0:276e7a263c35 278 resourceDef.resource_id, resourceDef.name.c_str(), M2MResourceInstance::STRING,
MACRUM 0:276e7a263c35 279 (M2MBase::Operation)resourceDef.method_mask, resourceDef.value.c_str(), resourceDef.observable,
MACRUM 0:276e7a263c35 280 resourceDef.put_callback, resourceDef.post_callback, resourceDef.notification_callback);
MACRUM 0:276e7a263c35 281 _resources[i]->set_resource(res);
MACRUM 0:276e7a263c35 282 }
MACRUM 0:276e7a263c35 283 _cloud_client.add_objects(_obj_list);
MACRUM 0:276e7a263c35 284
MACRUM 0:276e7a263c35 285 // Start registering to the cloud.
MACRUM 0:276e7a263c35 286 call_register();
MACRUM 0:276e7a263c35 287
MACRUM 0:276e7a263c35 288 // Print memory statistics if the MBED_HEAP_STATS_ENABLED is defined.
MACRUM 0:276e7a263c35 289 #ifdef MBED_HEAP_STATS_ENABLED
MACRUM 0:276e7a263c35 290 printf("Register being called\r\n");
MACRUM 0:276e7a263c35 291 heap_stats();
MACRUM 0:276e7a263c35 292 #endif
MACRUM 0:276e7a263c35 293 }
MACRUM 0:276e7a263c35 294
MACRUM 0:276e7a263c35 295 MbedCloudClient& SimpleMbedCloudClient::get_cloud_client() {
MACRUM 0:276e7a263c35 296 return _cloud_client;
MACRUM 0:276e7a263c35 297 }
MACRUM 0:276e7a263c35 298
MACRUM 0:276e7a263c35 299 MbedCloudClientResource* SimpleMbedCloudClient::create_resource(const char *path, const char *name) {
MACRUM 0:276e7a263c35 300 MbedCloudClientResource *resource = new MbedCloudClientResource(this, path, name);
MACRUM 0:276e7a263c35 301 _resources.push_back(resource);
MACRUM 0:276e7a263c35 302 return resource;
MACRUM 0:276e7a263c35 303 }