Sample program showing how to connect GR-PEACH into Watson IoT through mbed Connector and Watson's Connector Bridge

Dependencies:   AsciiFont DisplayApp GR-PEACH_video LCD_shield_config LWIPBP3595Interface_STA_for_mbed-os USBDevice

Overview

This sample program shows how to connect GR-PEACH into Watson IoT through mbed Connector and Watson's Connector Bridge. Note that this program is derived from https://github.com/ARMmbed/mbed-ethernet-sample-techcon2016.

In this program, at first, the barcode data input from camera is decoded on GR-PEACH using ZXing which is an open-source, multi-format 1D/2D barcode image processing library. Then, the decoded string is sent to Watson IoT via mbed Device Connector and Watson's Connector Bridge. At last, the delivered string is confirmed via NodeRED flow.

Required hardware

Application setup

  1. Select the connection type. For details, please refer to the following wiki:
    https://developer.mbed.org/teams/Renesas/code/mbed-os_Watson-IoT_ZXing_sample/wiki/Connection-type.
  2. Set the client credentials. For details, please refer to the following wiki:
    https://developer.mbed.org/teams/Renesas/code/mbed-os_Watson-IoT_ZXing_sample/wiki/Client-credentials.
  3. Change Ethernet settings. For details, please refer to the following wiki:
    https://developer.mbed.org/teams/Renesas/code/mbed-os_Watson-IoT_ZXing_sample/wiki/Ethernet-settings.
  4. Change Wifi settings. For details, please refer to the following wiki:
    https://developer.mbed.org/teams/Renesas/code/mbed-os_Watson-IoT_ZXing_sample/wiki/Wifi-settings.

Building this sample program

  1. Import this sample program onto mbed Compiler.
  2. Configure this sample program in accordance with Application setup.
  3. Compile the example on mbed Compiler and download the resultant binary file.
  4. Plug the Ethernet cable into GR-PEACH if you are using Ethernet mode. /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen7.png
  5. Plug the micro-USB cable into the OpenSDA port with lies on the next to the RESET button.
  6. Copy the binary previously downloaded to your PC to GR-PEACH to flash this sample program. When the copy is successfully completed, the board is ready to work.
  7. Press the RESET button on the board to run this sample program.
  8. For verification, please refer to the following wiki:
    https://developer.mbed.org/teams/Renesas/code/mbed-os_Watson-IoT_ZXing_sample/wiki/Monitoring-the-application.

Application resources

This sample program exposes two resources listed below:

  1. /311/0/5850 : Trigger to toggle LED on GR-PEACH (PUT). When "1" is sent to this resource by PUT method, LED should be turned off. Otherwise, LED should be turned on.
  2. /888/0/7700: Decode result of barcode data input from camera (GET)

Setup of Watson IoT

  1. You should create Watson IoT Instance by the following procedure:
    • Login IBM Bluemix from https://console.ng.bluemix.net/ and login it.
    • Select Services as follows: /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen6.png
    • Select Internet of Things" as follows: /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen7_1.png
    • Press Get Started as follows: /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen8.png
    • Configure Watson IoT Instance
      • Leave unbound /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen9.png
      • Select the Free plan, then click Create /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen10.png

  2. You should create Watson IoT Application Credentials Once you successfully create Watson IoT Instance, you should see the following Watson IoT dashboard: /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen11.png
    • On dashboard, launch the Connect your devices dashboard /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen12.png
    • Click APPS /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen13.png
    • Click Generate API Key /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen14_1.png
    • Record the API Key and Authenticatoin Token. Then click Generate after adding a comment /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen15.png Note that these two values will be needed in the later step.
  3. Watson IoT NodeRED Application should be created in accordance with the following procedure:
    • Go back to your Bluemix Dashboard: https://console.ng.bluemix.net
    • Click Create Application /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen16.png
    • Select Node-RED Starter /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen17.png
    • Enter a unique App name and Click Create /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen18.png
    • Application will Stage after a few minutes
    • Application will report app is running when the staging has completed
  4. Watson NodeRED Application should be binded to Watson IoT instance
    • You can now see the dashboard below: /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen19.png
    • Click Connections. Then, press Connect Existing /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen20.png
    • Click on Watson IoT Instance badge. Then, press Connect /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen21.png
    • NodeRED application will restage. This will take a while. Please wait for Your app is running state /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen22.png /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen23.png
  5. You should acquire mbed Device Connector DOMAIN value
    • Go to the mbed Device Connector Dashboard: https://connector.mbed.com and log in /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen41.png
    • Select Access Key in order to create a new token /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen42.png
    • Click CREATE NEW ACCESS KEY and enter a unique name. Then, push ADD bution /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen43.png
    • an API token is generated. Need to save the generated string for later steps /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen44.png
  1. You should configure Watson IoT ARM mbed Connector Bridge
    • Go back to the Watson IoT Dashboard and select Extensions /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen24.png
    • Press Add Extension /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen25.png
    • Add ARM mbed Connector /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen26_1.png
    • Setup the bridge /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen27.png
    • Enter your Connector API Token to Access Key and MBED_DOMAIN to Domain Id, respectively. Then, click Check Connection /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen28.png
    • If the connection is successfully established, you can see Connection Established. Then, press Done /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen29.png
  2. NodeRED Flow Example should be imported
    • Open NODEFLOW_GR-PEACH.txt
    • Navigate to the URL that you recorded earlier for your Watson IoT NodeRED Application (i.e. http://<app name>.mybluemix.net) and Select Go to your NodeRED flow editor /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen30.png
    • Select menu, Import and Clipboard /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen31.png
    • Paste the entire contents of JSON code described in NODEFLOW_GR-PEACH.txt and click Import /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen32.png
  3. Watson IoT Application Node Flow should be configured
    • Double-click input node and link them to your Watson IoT instance. /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen33.png
    • Click on the edit button /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen34.png
    • First enter arbitrary name. Then, Watson API Key and Watson Auth Token previously acquired. Finally, press Add to save /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen35.png
    • Enter MBED_ENDPOINT_NAME in security.h as Device ID. Then, press Done to save /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen36.png
    • Double-click output node /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen37.png
    • Edit API Key and Device Id in the same manner as that for input node
    • Click LED OFF and LED ON node and replace MBED_ENDPOINT_NAME_GOES_HERE with MBED_ENDPOINT_NAME as shown below: /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen38.png
    • Click Deproy to deploy NodeRED application /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen39.png
  4. Invoke sample program
    • Press the reset button on GR-PEACH
    • The decode result of barcode data should be shown in debug window /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen40_1.png
    • Also, you can toggle LED by clicking Turn LED OFF and Turn LED ON injection node /media/uploads/HinoNaka/mbed-os_watson-iot_zxing_sample_screen40_2.png
Committer:
Osamu Nakamura
Date:
Thu Nov 24 13:59:16 2016 +0900
Revision:
0:ad834d403a8c
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Osamu Nakamura 0:ad834d403a8c 1 /**
Osamu Nakamura 0:ad834d403a8c 2 * @file DeviceManager.cpp
Osamu Nakamura 0:ad834d403a8c 3 * @brief mbed CoAP Endpoint Device Management class
Osamu Nakamura 0:ad834d403a8c 4 * @author Doug Anson
Osamu Nakamura 0:ad834d403a8c 5 * @version 1.0
Osamu Nakamura 0:ad834d403a8c 6 * @see
Osamu Nakamura 0:ad834d403a8c 7 *
Osamu Nakamura 0:ad834d403a8c 8 * Copyright (c) 2016
Osamu Nakamura 0:ad834d403a8c 9 *
Osamu Nakamura 0:ad834d403a8c 10 * Licensed under the Apache License, Version 2.0 (the "License");
Osamu Nakamura 0:ad834d403a8c 11 * you may not use this file except in compliance with the License.
Osamu Nakamura 0:ad834d403a8c 12 * You may obtain a copy of the License at
Osamu Nakamura 0:ad834d403a8c 13 *
Osamu Nakamura 0:ad834d403a8c 14 * http://www.apache.org/licenses/LICENSE-2.0
Osamu Nakamura 0:ad834d403a8c 15 *
Osamu Nakamura 0:ad834d403a8c 16 * Unless required by applicable law or agreed to in writing, software
Osamu Nakamura 0:ad834d403a8c 17 * distributed under the License is distributed on an "AS IS" BASIS,
Osamu Nakamura 0:ad834d403a8c 18 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Osamu Nakamura 0:ad834d403a8c 19 * See the License for the specific language governing permissions and
Osamu Nakamura 0:ad834d403a8c 20 * limitations under the License.
Osamu Nakamura 0:ad834d403a8c 21 */
Osamu Nakamura 0:ad834d403a8c 22
Osamu Nakamura 0:ad834d403a8c 23 // configuration
Osamu Nakamura 0:ad834d403a8c 24 #include "mbed-connector-interface/mbedConnectorInterface.h"
Osamu Nakamura 0:ad834d403a8c 25
Osamu Nakamura 0:ad834d403a8c 26 // BaseClass
Osamu Nakamura 0:ad834d403a8c 27 #include "mbed-connector-interface/DeviceManager.h"
Osamu Nakamura 0:ad834d403a8c 28
Osamu Nakamura 0:ad834d403a8c 29 // Endpoint Class
Osamu Nakamura 0:ad834d403a8c 30 #include "mbed-connector-interface/ConnectorEndpoint.h"
Osamu Nakamura 0:ad834d403a8c 31
Osamu Nakamura 0:ad834d403a8c 32 // Options Builder
Osamu Nakamura 0:ad834d403a8c 33 #include "mbed-connector-interface/OptionsBuilder.h"
Osamu Nakamura 0:ad834d403a8c 34
Osamu Nakamura 0:ad834d403a8c 35 // Device Management Responder
Osamu Nakamura 0:ad834d403a8c 36 #include "mbed-connector-interface/DeviceManagementResponder.h"
Osamu Nakamura 0:ad834d403a8c 37
Osamu Nakamura 0:ad834d403a8c 38 // Constructor
Osamu Nakamura 0:ad834d403a8c 39 DeviceManager::DeviceManager(const Logger *logger,const void *dm_responder,const char *mfg,const char *dev_type,const char *model,const char *serial,const char *fw_vers,const char *hw_vers,const char *sw_vers) {
Osamu Nakamura 0:ad834d403a8c 40 // record the data management responder if we have one
Osamu Nakamura 0:ad834d403a8c 41 this->m_dm_responder = (void *)dm_responder;
Osamu Nakamura 0:ad834d403a8c 42
Osamu Nakamura 0:ad834d403a8c 43 // save off for later
Osamu Nakamura 0:ad834d403a8c 44 this->m_dev_type = (char *)dev_type;
Osamu Nakamura 0:ad834d403a8c 45 this->m_logger = (Logger *)logger;
Osamu Nakamura 0:ad834d403a8c 46 this->m_mfg = (char *)mfg;
Osamu Nakamura 0:ad834d403a8c 47 this->m_model = (char *)model;
Osamu Nakamura 0:ad834d403a8c 48 this->m_serial = (char *)serial;
Osamu Nakamura 0:ad834d403a8c 49 this->m_fw_vers = (char *)fw_vers;
Osamu Nakamura 0:ad834d403a8c 50 this->m_sw_vers = (char *)sw_vers;
Osamu Nakamura 0:ad834d403a8c 51 this->m_hw_vers = (char *)hw_vers;
Osamu Nakamura 0:ad834d403a8c 52
Osamu Nakamura 0:ad834d403a8c 53 // initialize
Osamu Nakamura 0:ad834d403a8c 54 this->m_device = NULL;
Osamu Nakamura 0:ad834d403a8c 55 for(int i=0;i<NUM_DEVICE_RESOURCES;++i) {
Osamu Nakamura 0:ad834d403a8c 56 this->m_dev_res[i] = NULL;
Osamu Nakamura 0:ad834d403a8c 57 }
Osamu Nakamura 0:ad834d403a8c 58 for(int i=0;i<NUM_FIRMWARE_RESOURCES;++i) {
Osamu Nakamura 0:ad834d403a8c 59 this->m_fw_res[i] = NULL;
Osamu Nakamura 0:ad834d403a8c 60 }
Osamu Nakamura 0:ad834d403a8c 61 this->m_deregister_resource = NULL;
Osamu Nakamura 0:ad834d403a8c 62 this->m_endpoint = NULL;
Osamu Nakamura 0:ad834d403a8c 63 this->m_config = NULL;
Osamu Nakamura 0:ad834d403a8c 64 this->m_fw_manifest = NULL;
Osamu Nakamura 0:ad834d403a8c 65 this->m_fw_manifest_length = 0;
Osamu Nakamura 0:ad834d403a8c 66 this->m_fw_image = NULL;
Osamu Nakamura 0:ad834d403a8c 67 this->m_fw_image_length = 0;
Osamu Nakamura 0:ad834d403a8c 68 }
Osamu Nakamura 0:ad834d403a8c 69
Osamu Nakamura 0:ad834d403a8c 70 // Copy constructor
Osamu Nakamura 0:ad834d403a8c 71 DeviceManager::DeviceManager(const DeviceManager &manager) {
Osamu Nakamura 0:ad834d403a8c 72 for(int i=0;i<NUM_DEVICE_RESOURCES;++i) {
Osamu Nakamura 0:ad834d403a8c 73 this->m_dev_res[i] = manager.m_dev_res[i];
Osamu Nakamura 0:ad834d403a8c 74 }
Osamu Nakamura 0:ad834d403a8c 75 for(int i=0;i<NUM_FIRMWARE_RESOURCES;++i) {
Osamu Nakamura 0:ad834d403a8c 76 this->m_fw_res[i] = manager.m_fw_res[i];
Osamu Nakamura 0:ad834d403a8c 77 }
Osamu Nakamura 0:ad834d403a8c 78 this->m_dm_responder = manager.m_dm_responder;
Osamu Nakamura 0:ad834d403a8c 79 this->m_device = manager.m_device;
Osamu Nakamura 0:ad834d403a8c 80 this->m_dev_type = manager.m_dev_type;
Osamu Nakamura 0:ad834d403a8c 81 this->m_logger = manager.m_logger;
Osamu Nakamura 0:ad834d403a8c 82 this->m_endpoint = manager.m_endpoint;
Osamu Nakamura 0:ad834d403a8c 83 this->m_config = manager.m_config;
Osamu Nakamura 0:ad834d403a8c 84 this->m_mfg = manager.m_mfg;
Osamu Nakamura 0:ad834d403a8c 85 this->m_model = manager.m_model;
Osamu Nakamura 0:ad834d403a8c 86 this->m_serial = manager.m_serial;
Osamu Nakamura 0:ad834d403a8c 87 this->m_fw_vers = manager.m_fw_vers;
Osamu Nakamura 0:ad834d403a8c 88 this->m_sw_vers = manager.m_sw_vers;
Osamu Nakamura 0:ad834d403a8c 89 this->m_hw_vers = manager.m_hw_vers;
Osamu Nakamura 0:ad834d403a8c 90 this->m_deregister_resource = manager.m_deregister_resource;
Osamu Nakamura 0:ad834d403a8c 91 this->m_fw_manifest = this->saveManifest((uint8_t *)manager.m_fw_manifest,manager.m_fw_manifest_length);
Osamu Nakamura 0:ad834d403a8c 92 this->m_fw_manifest_length = manager.m_fw_manifest_length;
Osamu Nakamura 0:ad834d403a8c 93 this->m_fw_image = this->saveImage(manager.m_fw_image,manager.m_fw_image_length);
Osamu Nakamura 0:ad834d403a8c 94 this->m_fw_image_length = manager.m_fw_image_length;
Osamu Nakamura 0:ad834d403a8c 95 }
Osamu Nakamura 0:ad834d403a8c 96
Osamu Nakamura 0:ad834d403a8c 97 // Destructor
Osamu Nakamura 0:ad834d403a8c 98 DeviceManager::~DeviceManager() {
Osamu Nakamura 0:ad834d403a8c 99 if (this->m_fw_manifest != NULL) {
Osamu Nakamura 0:ad834d403a8c 100 free(this->m_fw_manifest);
Osamu Nakamura 0:ad834d403a8c 101 }
Osamu Nakamura 0:ad834d403a8c 102 if (this->m_fw_image != NULL) {
Osamu Nakamura 0:ad834d403a8c 103 free(this->m_fw_image);
Osamu Nakamura 0:ad834d403a8c 104 }
Osamu Nakamura 0:ad834d403a8c 105 this->m_fw_manifest = NULL;
Osamu Nakamura 0:ad834d403a8c 106 this->m_fw_manifest_length = 0;
Osamu Nakamura 0:ad834d403a8c 107 this->m_fw_image = NULL;
Osamu Nakamura 0:ad834d403a8c 108 this->m_fw_image_length = 0;
Osamu Nakamura 0:ad834d403a8c 109 }
Osamu Nakamura 0:ad834d403a8c 110
Osamu Nakamura 0:ad834d403a8c 111 // save the fota manifest
Osamu Nakamura 0:ad834d403a8c 112 char *DeviceManager::saveManifest(uint8_t *manifest,uint32_t manifest_length) {
Osamu Nakamura 0:ad834d403a8c 113 if (manifest != NULL && manifest_length > 0) {
Osamu Nakamura 0:ad834d403a8c 114 if (this->m_fw_manifest != NULL) {
Osamu Nakamura 0:ad834d403a8c 115 free(this->m_fw_manifest);
Osamu Nakamura 0:ad834d403a8c 116 }
Osamu Nakamura 0:ad834d403a8c 117 this->m_fw_manifest = (char *)malloc(manifest_length+1);
Osamu Nakamura 0:ad834d403a8c 118 memset(this->m_fw_manifest,0,manifest_length+1);
Osamu Nakamura 0:ad834d403a8c 119 memcpy(this->m_fw_manifest,manifest,manifest_length);
Osamu Nakamura 0:ad834d403a8c 120 this->m_fw_manifest_length = manifest_length;
Osamu Nakamura 0:ad834d403a8c 121 }
Osamu Nakamura 0:ad834d403a8c 122 return this->m_fw_manifest;
Osamu Nakamura 0:ad834d403a8c 123 }
Osamu Nakamura 0:ad834d403a8c 124
Osamu Nakamura 0:ad834d403a8c 125 // save the fota image
Osamu Nakamura 0:ad834d403a8c 126 void *DeviceManager::saveImage(void *image,uint32_t image_length) {
Osamu Nakamura 0:ad834d403a8c 127 if (image != NULL && image_length > 0) {
Osamu Nakamura 0:ad834d403a8c 128 if (this->m_fw_image != NULL) {
Osamu Nakamura 0:ad834d403a8c 129 free(this->m_fw_image);
Osamu Nakamura 0:ad834d403a8c 130 }
Osamu Nakamura 0:ad834d403a8c 131 this->m_fw_image = (char *)malloc(image_length);
Osamu Nakamura 0:ad834d403a8c 132 memset(this->m_fw_image,0,image_length);
Osamu Nakamura 0:ad834d403a8c 133 memcpy(this->m_fw_image,image,image_length);
Osamu Nakamura 0:ad834d403a8c 134 }
Osamu Nakamura 0:ad834d403a8c 135 return this->m_fw_image;
Osamu Nakamura 0:ad834d403a8c 136 }
Osamu Nakamura 0:ad834d403a8c 137
Osamu Nakamura 0:ad834d403a8c 138 // bind the device resources
Osamu Nakamura 0:ad834d403a8c 139 void DeviceManager::bindDeviceResources() {
Osamu Nakamura 0:ad834d403a8c 140 // our Endpoint configuration
Osamu Nakamura 0:ad834d403a8c 141 Connector::OptionsBuilder *cfg = (Connector::OptionsBuilder *)this->m_config;
Osamu Nakamura 0:ad834d403a8c 142
Osamu Nakamura 0:ad834d403a8c 143 // establish the default base LWM2M device info resource values
Osamu Nakamura 0:ad834d403a8c 144 this->m_device = M2MInterfaceFactory::create_device();
Osamu Nakamura 0:ad834d403a8c 145 if (this->m_device != NULL) {
Osamu Nakamura 0:ad834d403a8c 146 this->m_dev_res[0] = this->m_device->create_resource(M2MDevice::Manufacturer,this->m_mfg); // Manufacturer
Osamu Nakamura 0:ad834d403a8c 147 this->m_dev_res[1] = this->m_device->create_resource(M2MDevice::DeviceType,this->m_dev_type); // Device Type
Osamu Nakamura 0:ad834d403a8c 148 this->m_dev_res[2] = this->m_device->create_resource(M2MDevice::ModelNumber,this->m_model); // Device Model
Osamu Nakamura 0:ad834d403a8c 149 this->m_dev_res[3] = this->m_device->create_resource(M2MDevice::SerialNumber,this->m_serial); // Device Serial
Osamu Nakamura 0:ad834d403a8c 150 this->m_dev_res[4] = this->m_device->create_resource(M2MDevice::FirmwareVersion,this->m_fw_vers); // Firmware Version
Osamu Nakamura 0:ad834d403a8c 151 this->m_dev_res[5] = this->m_device->create_resource(M2MDevice::HardwareVersion,this->m_hw_vers); // Hardware Version
Osamu Nakamura 0:ad834d403a8c 152 this->m_dev_res[6] = this->m_device->create_resource(M2MDevice::SoftwareVersion,this->m_sw_vers); // Software Version
Osamu Nakamura 0:ad834d403a8c 153 this->m_dev_res[7] = this->getDeviceRebootResource(); // Reboot
Osamu Nakamura 0:ad834d403a8c 154 this->m_dev_res[8] = this->m_device->create_resource(M2MDevice::FactoryReset); // Reset
Osamu Nakamura 0:ad834d403a8c 155
Osamu Nakamura 0:ad834d403a8c 156 // set the callback functions for Reboot and Reset
Osamu Nakamura 0:ad834d403a8c 157 if (this->m_dev_res[7] != NULL) {
Osamu Nakamura 0:ad834d403a8c 158 this->m_dev_res[7]->set_operation(M2MBase::POST_ALLOWED);
Osamu Nakamura 0:ad834d403a8c 159 this->m_dev_res[7]->set_execute_function(execute_callback(this,&DeviceManager::process_reboot_action));
Osamu Nakamura 0:ad834d403a8c 160 }
Osamu Nakamura 0:ad834d403a8c 161 if (this->m_dev_res[8] != NULL) {
Osamu Nakamura 0:ad834d403a8c 162 this->m_dev_res[8]->set_operation(M2MBase::POST_ALLOWED);
Osamu Nakamura 0:ad834d403a8c 163 this->m_dev_res[8]->set_execute_function(execute_callback(this,&DeviceManager::process_reset_action));
Osamu Nakamura 0:ad834d403a8c 164 }
Osamu Nakamura 0:ad834d403a8c 165
Osamu Nakamura 0:ad834d403a8c 166 // set the Device Resources Object
Osamu Nakamura 0:ad834d403a8c 167 if (cfg != NULL) {
Osamu Nakamura 0:ad834d403a8c 168 cfg->setDeviceResourcesObject(this->m_device); // device resources created under single device object... so just set it
Osamu Nakamura 0:ad834d403a8c 169 }
Osamu Nakamura 0:ad834d403a8c 170 }
Osamu Nakamura 0:ad834d403a8c 171 else {
Osamu Nakamura 0:ad834d403a8c 172 // unable to create the device object
Osamu Nakamura 0:ad834d403a8c 173 this->m_logger->logging("DeviceManager::bindDeviceResources(): Unable to create Device Object!");
Osamu Nakamura 0:ad834d403a8c 174 }
Osamu Nakamura 0:ad834d403a8c 175 }
Osamu Nakamura 0:ad834d403a8c 176
Osamu Nakamura 0:ad834d403a8c 177 // bind the firmware resources
Osamu Nakamura 0:ad834d403a8c 178 void DeviceManager::bindFirmwareResources() {
Osamu Nakamura 0:ad834d403a8c 179 // our Endpoint configuration
Osamu Nakamura 0:ad834d403a8c 180 Connector::OptionsBuilder *cfg = (Connector::OptionsBuilder *)this->m_config;
Osamu Nakamura 0:ad834d403a8c 181
Osamu Nakamura 0:ad834d403a8c 182 // establish the default base LWM2M firmware info resource values
Osamu Nakamura 0:ad834d403a8c 183 this->m_firmware = M2MInterfaceFactory::create_firmware();
Osamu Nakamura 0:ad834d403a8c 184 if (this->m_firmware != NULL) {
Osamu Nakamura 0:ad834d403a8c 185 // Create our optional resources
Osamu Nakamura 0:ad834d403a8c 186 this->m_fw_res[0] = this->m_firmware->create_resource(M2MFirmware::PackageName,""); // Package Name
Osamu Nakamura 0:ad834d403a8c 187 this->m_fw_res[1] = this->m_firmware->create_resource(M2MFirmware::PackageVersion,""); // Package Version
Osamu Nakamura 0:ad834d403a8c 188
Osamu Nakamura 0:ad834d403a8c 189 // Get the speciality resources
Osamu Nakamura 0:ad834d403a8c 190 this->m_fw_res[2] = this->getFirmwareUpdateResource();
Osamu Nakamura 0:ad834d403a8c 191 this->m_fw_res[3] = this->getFirmwarePackageResource();
Osamu Nakamura 0:ad834d403a8c 192 this->m_fw_res[4] = this->getFirmwarePackageURIResource();
Osamu Nakamura 0:ad834d403a8c 193 this->m_fw_res[5] = this->getFirmwareStateResource();
Osamu Nakamura 0:ad834d403a8c 194 this->m_fw_res[6] = this->getFirmwareUpdateResultResource();
Osamu Nakamura 0:ad834d403a8c 195
Osamu Nakamura 0:ad834d403a8c 196 // set the callback functions for Update
Osamu Nakamura 0:ad834d403a8c 197 if (this->m_fw_res[2] != NULL) {
Osamu Nakamura 0:ad834d403a8c 198 this->m_fw_res[2]->set_operation(M2MBase::POST_ALLOWED);
Osamu Nakamura 0:ad834d403a8c 199 this->m_fw_res[2]->set_execute_function(execute_callback(this,&DeviceManager::process_firmware_update_action));
Osamu Nakamura 0:ad834d403a8c 200 }
Osamu Nakamura 0:ad834d403a8c 201
Osamu Nakamura 0:ad834d403a8c 202 // set the Firmware Resources Object
Osamu Nakamura 0:ad834d403a8c 203 if (cfg != NULL) {
Osamu Nakamura 0:ad834d403a8c 204 cfg->setFirmwareResourcesObject(this->m_firmware); // firmware resources created under single firmware object... so just set it
Osamu Nakamura 0:ad834d403a8c 205 }
Osamu Nakamura 0:ad834d403a8c 206 }
Osamu Nakamura 0:ad834d403a8c 207 else {
Osamu Nakamura 0:ad834d403a8c 208 // unable to create the firmware object
Osamu Nakamura 0:ad834d403a8c 209 this->m_logger->logging("DeviceManager::bindFirmwareResources(): Unable to create Firmware Object!");
Osamu Nakamura 0:ad834d403a8c 210 }
Osamu Nakamura 0:ad834d403a8c 211 }
Osamu Nakamura 0:ad834d403a8c 212
Osamu Nakamura 0:ad834d403a8c 213 // bind mbed Cloud resources
Osamu Nakamura 0:ad834d403a8c 214 void DeviceManager::bindMBEDCloudResources() {
Osamu Nakamura 0:ad834d403a8c 215 // our Endpoint configuration
Osamu Nakamura 0:ad834d403a8c 216 Connector::OptionsBuilder *cfg = (Connector::OptionsBuilder *)this->m_config;
Osamu Nakamura 0:ad834d403a8c 217
Osamu Nakamura 0:ad834d403a8c 218 // Add mbed Cloud resources here...
Osamu Nakamura 0:ad834d403a8c 219
Osamu Nakamura 0:ad834d403a8c 220 // mbed Cloud DeRegistration Resource
Osamu Nakamura 0:ad834d403a8c 221 this->m_deregister_resource = new DeviceDeRegisterResource(this->m_logger,LWM2M_DREGISTER_OBJ_ID,LWM2M_DEV_DEREGISTER_ID,this->m_dm_responder);
Osamu Nakamura 0:ad834d403a8c 222 if (this->m_deregister_resource != NULL) {
Osamu Nakamura 0:ad834d403a8c 223 cfg->addResource(this->m_deregister_resource); // de-registration action resource added
Osamu Nakamura 0:ad834d403a8c 224 }
Osamu Nakamura 0:ad834d403a8c 225 }
Osamu Nakamura 0:ad834d403a8c 226
Osamu Nakamura 0:ad834d403a8c 227 // setup the Device Manager
Osamu Nakamura 0:ad834d403a8c 228 void DeviceManager::bind() {
Osamu Nakamura 0:ad834d403a8c 229 // Bind our Device Resources
Osamu Nakamura 0:ad834d403a8c 230 this->bindDeviceResources();
Osamu Nakamura 0:ad834d403a8c 231
Osamu Nakamura 0:ad834d403a8c 232 // Bind our Firmware Resources
Osamu Nakamura 0:ad834d403a8c 233 this->bindFirmwareResources();
Osamu Nakamura 0:ad834d403a8c 234
Osamu Nakamura 0:ad834d403a8c 235 // Bind our mbed Cloud Resources
Osamu Nakamura 0:ad834d403a8c 236 this->bindMBEDCloudResources();
Osamu Nakamura 0:ad834d403a8c 237 }
Osamu Nakamura 0:ad834d403a8c 238
Osamu Nakamura 0:ad834d403a8c 239 // process updated values (PUT): The only updatable device management resources are: Firmware::Package, Firmware::PackageURI
Osamu Nakamura 0:ad834d403a8c 240 void DeviceManager::process(M2MBase *base, M2MBase::BaseType type) {
Osamu Nakamura 0:ad834d403a8c 241 // DeviceManagementResponder
Osamu Nakamura 0:ad834d403a8c 242 DeviceManagementResponder *dmr = (DeviceManagementResponder *)this->m_dm_responder;
Osamu Nakamura 0:ad834d403a8c 243
Osamu Nakamura 0:ad834d403a8c 244 // PackageURI handler
Osamu Nakamura 0:ad834d403a8c 245 if (base == this->getFirmwareResource(PackageURI)) {
Osamu Nakamura 0:ad834d403a8c 246 // PackageURI resource
Osamu Nakamura 0:ad834d403a8c 247 M2MResource *res = this->getFirmwareResource(PackageURI);
Osamu Nakamura 0:ad834d403a8c 248
Osamu Nakamura 0:ad834d403a8c 249 // Save off the manifest
Osamu Nakamura 0:ad834d403a8c 250 this->saveManifest(res->value(),res->value_length());
Osamu Nakamura 0:ad834d403a8c 251
Osamu Nakamura 0:ad834d403a8c 252 // DEBUG
Osamu Nakamura 0:ad834d403a8c 253 this->m_logger->logging("DeviceManager::process(PUT): Setting FOTA Manifest: [%s] type: %d length: %d",this->m_fw_manifest,type,this->m_fw_manifest_length);
Osamu Nakamura 0:ad834d403a8c 254
Osamu Nakamura 0:ad834d403a8c 255 // Manifest Updated
Osamu Nakamura 0:ad834d403a8c 256 dmr->setFOTAManifest(this->m_fw_manifest,this->m_fw_manifest_length);
Osamu Nakamura 0:ad834d403a8c 257 }
Osamu Nakamura 0:ad834d403a8c 258
Osamu Nakamura 0:ad834d403a8c 259 // Package handler
Osamu Nakamura 0:ad834d403a8c 260 if (base == this->getFirmwareResource(Package)) {
Osamu Nakamura 0:ad834d403a8c 261 // FOTA Image (direct) Updated
Osamu Nakamura 0:ad834d403a8c 262 M2MResource *res = this->getFirmwareResource(PackageURI);
Osamu Nakamura 0:ad834d403a8c 263
Osamu Nakamura 0:ad834d403a8c 264 // DEBUG
Osamu Nakamura 0:ad834d403a8c 265 this->m_logger->logging("DeviceManager::process(PUT): Setting FOTA Image. Length=%d type: %d",res->value_length(),type);
Osamu Nakamura 0:ad834d403a8c 266
Osamu Nakamura 0:ad834d403a8c 267 // FOTA Image updated
Osamu Nakamura 0:ad834d403a8c 268 dmr->setFOTAImage(res->value(),res->value_length());
Osamu Nakamura 0:ad834d403a8c 269 }
Osamu Nakamura 0:ad834d403a8c 270 }
Osamu Nakamura 0:ad834d403a8c 271
Osamu Nakamura 0:ad834d403a8c 272 // Get the Device Reboot Resource from the Device Object
Osamu Nakamura 0:ad834d403a8c 273 M2MResource *DeviceManager::getDeviceRebootResource() {
Osamu Nakamura 0:ad834d403a8c 274 if (this->m_device != NULL) {
Osamu Nakamura 0:ad834d403a8c 275 // Get /3/0/3
Osamu Nakamura 0:ad834d403a8c 276 return this->getResourceFromObject(this->m_device,0,M2MDevice::Reboot);
Osamu Nakamura 0:ad834d403a8c 277 }
Osamu Nakamura 0:ad834d403a8c 278 return NULL;
Osamu Nakamura 0:ad834d403a8c 279 }
Osamu Nakamura 0:ad834d403a8c 280
Osamu Nakamura 0:ad834d403a8c 281 // Get the Firmware Update Resource from the Firmware Object
Osamu Nakamura 0:ad834d403a8c 282 M2MResource *DeviceManager::getFirmwareUpdateResource() {
Osamu Nakamura 0:ad834d403a8c 283 if (this->m_firmware != NULL) {
Osamu Nakamura 0:ad834d403a8c 284 // Get /5/0/2
Osamu Nakamura 0:ad834d403a8c 285 return this->getResourceFromObject(this->m_firmware,0,M2MFirmware::Update);
Osamu Nakamura 0:ad834d403a8c 286 }
Osamu Nakamura 0:ad834d403a8c 287 return NULL;
Osamu Nakamura 0:ad834d403a8c 288 }
Osamu Nakamura 0:ad834d403a8c 289
Osamu Nakamura 0:ad834d403a8c 290 // Get the Firmware Package Resource from the Firmware Object
Osamu Nakamura 0:ad834d403a8c 291 M2MResource *DeviceManager::getFirmwarePackageResource() {
Osamu Nakamura 0:ad834d403a8c 292 if (this->m_firmware != NULL) {
Osamu Nakamura 0:ad834d403a8c 293 // Get /5/0/0
Osamu Nakamura 0:ad834d403a8c 294 return this->getResourceFromObject(this->m_firmware,0,M2MFirmware::Package);
Osamu Nakamura 0:ad834d403a8c 295 }
Osamu Nakamura 0:ad834d403a8c 296 return NULL;
Osamu Nakamura 0:ad834d403a8c 297 }
Osamu Nakamura 0:ad834d403a8c 298
Osamu Nakamura 0:ad834d403a8c 299 // Get the Firmware Package URI Resource from the Firmware Object
Osamu Nakamura 0:ad834d403a8c 300 M2MResource *DeviceManager::getFirmwarePackageURIResource() {
Osamu Nakamura 0:ad834d403a8c 301 if (this->m_firmware != NULL) {
Osamu Nakamura 0:ad834d403a8c 302 // Get /5/0/1
Osamu Nakamura 0:ad834d403a8c 303 return this->getResourceFromObject(this->m_firmware,0,M2MFirmware::PackageUri);
Osamu Nakamura 0:ad834d403a8c 304 }
Osamu Nakamura 0:ad834d403a8c 305 return NULL;
Osamu Nakamura 0:ad834d403a8c 306 }
Osamu Nakamura 0:ad834d403a8c 307
Osamu Nakamura 0:ad834d403a8c 308 // Get the Firmware State Resource from the Firmware Object
Osamu Nakamura 0:ad834d403a8c 309 M2MResource *DeviceManager::getFirmwareStateResource() {
Osamu Nakamura 0:ad834d403a8c 310 if (this->m_firmware != NULL) {
Osamu Nakamura 0:ad834d403a8c 311 // Get /5/0/3
Osamu Nakamura 0:ad834d403a8c 312 return this->getResourceFromObject(this->m_firmware,0,M2MFirmware::State);
Osamu Nakamura 0:ad834d403a8c 313 }
Osamu Nakamura 0:ad834d403a8c 314 return NULL;
Osamu Nakamura 0:ad834d403a8c 315 }
Osamu Nakamura 0:ad834d403a8c 316
Osamu Nakamura 0:ad834d403a8c 317 // Get the Firmware UpdateResult Resource from the Firmware Object
Osamu Nakamura 0:ad834d403a8c 318 M2MResource *DeviceManager::getFirmwareUpdateResultResource() {
Osamu Nakamura 0:ad834d403a8c 319 if (this->m_firmware != NULL) {
Osamu Nakamura 0:ad834d403a8c 320 // Get /5/0/5
Osamu Nakamura 0:ad834d403a8c 321 return this->getResourceFromObject(this->m_firmware,0,M2MFirmware::UpdateResult);
Osamu Nakamura 0:ad834d403a8c 322 }
Osamu Nakamura 0:ad834d403a8c 323 return NULL;
Osamu Nakamura 0:ad834d403a8c 324 }
Osamu Nakamura 0:ad834d403a8c 325 // Get a specific resource from a resource object
Osamu Nakamura 0:ad834d403a8c 326 M2MResource *DeviceManager::getResourceFromObject(M2MObject *obj,int instanceID,int resID) {
Osamu Nakamura 0:ad834d403a8c 327 if (obj != NULL) {
Osamu Nakamura 0:ad834d403a8c 328 M2MObjectInstanceList instances = obj->instances();
Osamu Nakamura 0:ad834d403a8c 329 if (instances.size() > 0 && instances.size() > instanceID) {
Osamu Nakamura 0:ad834d403a8c 330 M2MObjectInstance *instance = instances[instanceID];
Osamu Nakamura 0:ad834d403a8c 331 if (instance != NULL) {
Osamu Nakamura 0:ad834d403a8c 332 M2MResourceList resources = instance->resources();
Osamu Nakamura 0:ad834d403a8c 333 if (resources.size() > 0 && resources.size() > resID) {
Osamu Nakamura 0:ad834d403a8c 334 M2MResource *resource = resources[resID];
Osamu Nakamura 0:ad834d403a8c 335 return resource;
Osamu Nakamura 0:ad834d403a8c 336 }
Osamu Nakamura 0:ad834d403a8c 337 }
Osamu Nakamura 0:ad834d403a8c 338 }
Osamu Nakamura 0:ad834d403a8c 339 }
Osamu Nakamura 0:ad834d403a8c 340 return NULL;
Osamu Nakamura 0:ad834d403a8c 341 }
Osamu Nakamura 0:ad834d403a8c 342
Osamu Nakamura 0:ad834d403a8c 343 // Get the Device Object
Osamu Nakamura 0:ad834d403a8c 344 M2MDevice *DeviceManager::getDeviceObject() {
Osamu Nakamura 0:ad834d403a8c 345 return this->m_device;
Osamu Nakamura 0:ad834d403a8c 346 }
Osamu Nakamura 0:ad834d403a8c 347
Osamu Nakamura 0:ad834d403a8c 348 // Get the Firmware Object
Osamu Nakamura 0:ad834d403a8c 349 M2MFirmware *DeviceManager::getFirmwareObject() {
Osamu Nakamura 0:ad834d403a8c 350 return this->m_firmware;
Osamu Nakamura 0:ad834d403a8c 351 }
Osamu Nakamura 0:ad834d403a8c 352
Osamu Nakamura 0:ad834d403a8c 353 // extract a specific firmware resource
Osamu Nakamura 0:ad834d403a8c 354 M2MResource *DeviceManager::getFirmwareResource(FirmwareResources res) {
Osamu Nakamura 0:ad834d403a8c 355 // indexed optional resources
Osamu Nakamura 0:ad834d403a8c 356 int index = (int)res;
Osamu Nakamura 0:ad834d403a8c 357 if (index >= 0 && index <NUM_FIRMWARE_RESOURCES) {
Osamu Nakamura 0:ad834d403a8c 358 return this->m_fw_res[index];
Osamu Nakamura 0:ad834d403a8c 359 }
Osamu Nakamura 0:ad834d403a8c 360 return NULL;
Osamu Nakamura 0:ad834d403a8c 361 }
Osamu Nakamura 0:ad834d403a8c 362
Osamu Nakamura 0:ad834d403a8c 363 // extract a specific device resource
Osamu Nakamura 0:ad834d403a8c 364 M2MResource *DeviceManager::getDeviceResource(DeviceResources res) {
Osamu Nakamura 0:ad834d403a8c 365 // special case: DeRegistration
Osamu Nakamura 0:ad834d403a8c 366 if (res == DeRegistration){
Osamu Nakamura 0:ad834d403a8c 367 return this->m_deregister_resource->getResource();
Osamu Nakamura 0:ad834d403a8c 368 }
Osamu Nakamura 0:ad834d403a8c 369
Osamu Nakamura 0:ad834d403a8c 370 // indexed optional resources
Osamu Nakamura 0:ad834d403a8c 371 int index = (int)res;
Osamu Nakamura 0:ad834d403a8c 372 if (index >= 0 && index <NUM_DEVICE_RESOURCES) {
Osamu Nakamura 0:ad834d403a8c 373 return this->m_dev_res[index];
Osamu Nakamura 0:ad834d403a8c 374 }
Osamu Nakamura 0:ad834d403a8c 375 return NULL;
Osamu Nakamura 0:ad834d403a8c 376 }
Osamu Nakamura 0:ad834d403a8c 377
Osamu Nakamura 0:ad834d403a8c 378 // Install the device manager into the Connector Endpoint
Osamu Nakamura 0:ad834d403a8c 379 void DeviceManager::install(const void *endpoint,const void *config) {
Osamu Nakamura 0:ad834d403a8c 380 // record the configuration
Osamu Nakamura 0:ad834d403a8c 381 this->m_config = (void *)config;
Osamu Nakamura 0:ad834d403a8c 382
Osamu Nakamura 0:ad834d403a8c 383 // record the endpoint
Osamu Nakamura 0:ad834d403a8c 384 this->m_endpoint = (void *)endpoint;
Osamu Nakamura 0:ad834d403a8c 385
Osamu Nakamura 0:ad834d403a8c 386 // set the endpoint type
Osamu Nakamura 0:ad834d403a8c 387 Connector::OptionsBuilder *cfg = (Connector::OptionsBuilder *)this->m_config;
Osamu Nakamura 0:ad834d403a8c 388 if (cfg != NULL) {
Osamu Nakamura 0:ad834d403a8c 389 // set our device type
Osamu Nakamura 0:ad834d403a8c 390 cfg->setEndpointType(this->m_dev_type);
Osamu Nakamura 0:ad834d403a8c 391 }
Osamu Nakamura 0:ad834d403a8c 392
Osamu Nakamura 0:ad834d403a8c 393 // establish connection to our responder
Osamu Nakamura 0:ad834d403a8c 394 if (this->m_dm_responder != NULL) {
Osamu Nakamura 0:ad834d403a8c 395 ((DeviceManagementResponder *)this->m_dm_responder)->setEndpoint(this->m_endpoint);
Osamu Nakamura 0:ad834d403a8c 396 }
Osamu Nakamura 0:ad834d403a8c 397 }
Osamu Nakamura 0:ad834d403a8c 398
Osamu Nakamura 0:ad834d403a8c 399 // get our device management responder
Osamu Nakamura 0:ad834d403a8c 400 void *DeviceManager::getResponder() {
Osamu Nakamura 0:ad834d403a8c 401 return this->m_dm_responder;
Osamu Nakamura 0:ad834d403a8c 402 }
Osamu Nakamura 0:ad834d403a8c 403
Osamu Nakamura 0:ad834d403a8c 404 // process our reboot action
Osamu Nakamura 0:ad834d403a8c 405 void DeviceManager::process_reboot_action(void *args) {
Osamu Nakamura 0:ad834d403a8c 406 if (this->m_dm_responder != NULL) {
Osamu Nakamura 0:ad834d403a8c 407 ((DeviceManagementResponder *)this->m_dm_responder)->rebootDevice(args);
Osamu Nakamura 0:ad834d403a8c 408 }
Osamu Nakamura 0:ad834d403a8c 409 else {
Osamu Nakamura 0:ad834d403a8c 410 // no device management responder instance
Osamu Nakamura 0:ad834d403a8c 411 this->m_logger->logging("DeviceManager::process_reboot_action: DeviceManagementResponder is NULL. No reboot processed");
Osamu Nakamura 0:ad834d403a8c 412 }
Osamu Nakamura 0:ad834d403a8c 413 }
Osamu Nakamura 0:ad834d403a8c 414
Osamu Nakamura 0:ad834d403a8c 415 // process our reset action
Osamu Nakamura 0:ad834d403a8c 416 void DeviceManager::process_reset_action(void *args) {
Osamu Nakamura 0:ad834d403a8c 417 if (this->m_dm_responder != NULL) {
Osamu Nakamura 0:ad834d403a8c 418 ((DeviceManagementResponder *)this->m_dm_responder)->resetDevice(args);
Osamu Nakamura 0:ad834d403a8c 419 }
Osamu Nakamura 0:ad834d403a8c 420 else {
Osamu Nakamura 0:ad834d403a8c 421 // no device management responder instance
Osamu Nakamura 0:ad834d403a8c 422 this->m_logger->logging("DeviceManager:: process_reset_action: DeviceManagementResponder is NULL. No reset processed");
Osamu Nakamura 0:ad834d403a8c 423 }
Osamu Nakamura 0:ad834d403a8c 424 }
Osamu Nakamura 0:ad834d403a8c 425
Osamu Nakamura 0:ad834d403a8c 426 // process our firmware update action
Osamu Nakamura 0:ad834d403a8c 427 void DeviceManager::process_firmware_update_action(void *args) {
Osamu Nakamura 0:ad834d403a8c 428 if (this->m_dm_responder != NULL) {
Osamu Nakamura 0:ad834d403a8c 429 ((DeviceManagementResponder *)this->m_dm_responder)->invokeFOTA(args);
Osamu Nakamura 0:ad834d403a8c 430 }
Osamu Nakamura 0:ad834d403a8c 431 else {
Osamu Nakamura 0:ad834d403a8c 432 // no device management responder instance
Osamu Nakamura 0:ad834d403a8c 433 this->m_logger->logging("DeviceManager:: process_firmware_update_action: DeviceManagementResponder is NULL. No firmware update action processed");
Osamu Nakamura 0:ad834d403a8c 434 }
Osamu Nakamura 0:ad834d403a8c 435 }