Mbed OS Device Connector client pushing environmental sensor data via 6LowPan.

Dependencies:   X_NUCLEO_IKS01A2

Fork of mbed-os-example-client-Sensors_6LowPan by Nicola Capovilla

The application is derived from the official mbedOS client example (link) and has been tested using a X-NUCLEO-IDS01A4 SubGHz 6LowPan connectivity board and a X-NUCLEO-IKS01A2 (default) or a X-NUCLEO-IKS01A1 motion and environmental sensors expansion board connected to a ST NUCLEO-F429ZI platform.
The following steps should be performed to make the application work:

  • Register and login into ARM mbed Connector.
  • Replace the default and empty security.h file with the one associated with your account and provided by the Connector (Security Credentials menu).
  • In order to use X-NUCLEO-IKS01A1 instead of default X-NUCLEO-IKS01A2 comment out the IKS01A2 macro definition in main.cpp file.
  • Choose NUCLEO-F429ZI as a target either from online compiler or from CLI, compile and flash.
  • Setup and connect a NUCLEO-F429ZI + X-NUCLEO-IDS01A4 6LowPan border router as explained here
  • Open a serial terminal (params 115200N1) and wait that the client is connected to the mbed Connector via the border router.
  • As soon as the client is connected it will start acquiring and pushing the environmental (pressure, temperature and humidity) data to the cloud.

Note: environmental data are expressed using IPSO representation based on OMA LWM2M standard.

Committer:
nikapov
Date:
Thu Jan 25 18:00:04 2018 +0100
Revision:
0:694e888fd1b5
First release.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
nikapov 0:694e888fd1b5 1 /*
nikapov 0:694e888fd1b5 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
nikapov 0:694e888fd1b5 3 * SPDX-License-Identifier: Apache-2.0
nikapov 0:694e888fd1b5 4 * Licensed under the Apache License, Version 2.0 (the License); you may
nikapov 0:694e888fd1b5 5 * not use this file except in compliance with the License.
nikapov 0:694e888fd1b5 6 * You may obtain a copy of the License at
nikapov 0:694e888fd1b5 7 *
nikapov 0:694e888fd1b5 8 * http://www.apache.org/licenses/LICENSE-2.0
nikapov 0:694e888fd1b5 9 *
nikapov 0:694e888fd1b5 10 * Unless required by applicable law or agreed to in writing, software
nikapov 0:694e888fd1b5 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
nikapov 0:694e888fd1b5 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
nikapov 0:694e888fd1b5 13 * See the License for the specific language governing permissions and
nikapov 0:694e888fd1b5 14 * limitations under the License.
nikapov 0:694e888fd1b5 15 */
nikapov 0:694e888fd1b5 16
nikapov 0:694e888fd1b5 17 #ifndef __SIMPLECLIENT_H__
nikapov 0:694e888fd1b5 18 #define __SIMPLECLIENT_H__
nikapov 0:694e888fd1b5 19
nikapov 0:694e888fd1b5 20 #include "mbed-client/m2minterfacefactory.h"
nikapov 0:694e888fd1b5 21 #include "mbed-client/m2mdevice.h"
nikapov 0:694e888fd1b5 22 #include "mbed-client/m2minterfaceobserver.h"
nikapov 0:694e888fd1b5 23 #include "mbed-client/m2minterface.h"
nikapov 0:694e888fd1b5 24 #include "mbed-client/m2mobject.h"
nikapov 0:694e888fd1b5 25 #include "mbed-client/m2mobjectinstance.h"
nikapov 0:694e888fd1b5 26 #include "mbed-client/m2mresource.h"
nikapov 0:694e888fd1b5 27 #include "mbed-client/m2mconfig.h"
nikapov 0:694e888fd1b5 28 #include "mbed-client/m2mblockmessage.h"
nikapov 0:694e888fd1b5 29 #include "security.h"
nikapov 0:694e888fd1b5 30 #include "mbed.h"
nikapov 0:694e888fd1b5 31
nikapov 0:694e888fd1b5 32 #define ETHERNET 1
nikapov 0:694e888fd1b5 33 #define WIFI 2
nikapov 0:694e888fd1b5 34 #define MESH_LOWPAN_ND 3
nikapov 0:694e888fd1b5 35 #define MESH_THREAD 4
nikapov 0:694e888fd1b5 36 #define ATMEL 5
nikapov 0:694e888fd1b5 37 #define MCR20 6
nikapov 0:694e888fd1b5 38 #define SPIRIT1 7
nikapov 0:694e888fd1b5 39 #define EFR32 8
nikapov 0:694e888fd1b5 40
nikapov 0:694e888fd1b5 41 #define STRINGIFY(s) #s
nikapov 0:694e888fd1b5 42
nikapov 0:694e888fd1b5 43 // Check if using mesh networking, define helper
nikapov 0:694e888fd1b5 44 #if MBED_CONF_APP_NETWORK_INTERFACE == MESH_LOWPAN_ND
nikapov 0:694e888fd1b5 45 #define MESH
nikapov 0:694e888fd1b5 46 #elif MBED_CONF_APP_NETWORK_INTERFACE == MESH_THREAD
nikapov 0:694e888fd1b5 47 #define MESH
nikapov 0:694e888fd1b5 48 #endif
nikapov 0:694e888fd1b5 49
nikapov 0:694e888fd1b5 50 #if defined (MESH) || (MBED_CONF_LWIP_IPV6_ENABLED==true)
nikapov 0:694e888fd1b5 51 // Mesh is always IPV6 - also WiFi and ETH can be IPV6 if IPV6 is enabled
nikapov 0:694e888fd1b5 52 M2MInterface::NetworkStack NETWORK_STACK = M2MInterface::LwIP_IPv6;
nikapov 0:694e888fd1b5 53 #else
nikapov 0:694e888fd1b5 54 // Everything else - we assume it's IPv4
nikapov 0:694e888fd1b5 55 M2MInterface::NetworkStack NETWORK_STACK = M2MInterface::LwIP_IPv4;
nikapov 0:694e888fd1b5 56 #endif
nikapov 0:694e888fd1b5 57
nikapov 0:694e888fd1b5 58 //Select binding mode: UDP or TCP -- note - Mesh networking is IPv6 UDP ONLY
nikapov 0:694e888fd1b5 59 #ifdef MESH
nikapov 0:694e888fd1b5 60 M2MInterface::BindingMode SOCKET_MODE = M2MInterface::UDP;
nikapov 0:694e888fd1b5 61 #else
nikapov 0:694e888fd1b5 62 // WiFi or Ethernet supports both - TCP by default to avoid
nikapov 0:694e888fd1b5 63 // NAT problems, but UDP will also work - IF you configure
nikapov 0:694e888fd1b5 64 // your network right.
nikapov 0:694e888fd1b5 65 M2MInterface::BindingMode SOCKET_MODE = M2MInterface::TCP;
nikapov 0:694e888fd1b5 66 #endif
nikapov 0:694e888fd1b5 67
nikapov 0:694e888fd1b5 68
nikapov 0:694e888fd1b5 69 // MBED_DOMAIN and MBED_ENDPOINT_NAME come
nikapov 0:694e888fd1b5 70 // from the security.h file copied from connector.mbed.com
nikapov 0:694e888fd1b5 71
nikapov 0:694e888fd1b5 72 struct MbedClientDevice {
nikapov 0:694e888fd1b5 73 const char* Manufacturer;
nikapov 0:694e888fd1b5 74 const char* Type;
nikapov 0:694e888fd1b5 75 const char* ModelNumber;
nikapov 0:694e888fd1b5 76 const char* SerialNumber;
nikapov 0:694e888fd1b5 77 };
nikapov 0:694e888fd1b5 78
nikapov 0:694e888fd1b5 79 /*
nikapov 0:694e888fd1b5 80 * Wrapper for mbed client stack that handles all callbacks, error handling, and
nikapov 0:694e888fd1b5 81 * other shenanigans to make the mbed client stack easier to use.
nikapov 0:694e888fd1b5 82 *
nikapov 0:694e888fd1b5 83 * The end user should only have to care about configuring the parameters at the
nikapov 0:694e888fd1b5 84 * top of this file and making sure they add the security.h file correctly.
nikapov 0:694e888fd1b5 85 * To add resources you can copy the _TODO__ function and add as many instances as
nikapov 0:694e888fd1b5 86 * you want.
nikapov 0:694e888fd1b5 87 *
nikapov 0:694e888fd1b5 88 */
nikapov 0:694e888fd1b5 89 class MbedClient: public M2MInterfaceObserver {
nikapov 0:694e888fd1b5 90 public:
nikapov 0:694e888fd1b5 91
nikapov 0:694e888fd1b5 92 // constructor for MbedClient object, initialize private variables
nikapov 0:694e888fd1b5 93 MbedClient(struct MbedClientDevice device) {
nikapov 0:694e888fd1b5 94 _interface = NULL;
nikapov 0:694e888fd1b5 95 _bootstrapped = false;
nikapov 0:694e888fd1b5 96 _error = false;
nikapov 0:694e888fd1b5 97 _registered = false;
nikapov 0:694e888fd1b5 98 _unregistered = false;
nikapov 0:694e888fd1b5 99 _register_security = NULL;
nikapov 0:694e888fd1b5 100 _value = 0;
nikapov 0:694e888fd1b5 101 _object = NULL;
nikapov 0:694e888fd1b5 102 _device = device;
nikapov 0:694e888fd1b5 103 }
nikapov 0:694e888fd1b5 104
nikapov 0:694e888fd1b5 105 // de-constructor for MbedClient object, you can ignore this
nikapov 0:694e888fd1b5 106 ~MbedClient() {
nikapov 0:694e888fd1b5 107 if(_interface) {
nikapov 0:694e888fd1b5 108 delete _interface;
nikapov 0:694e888fd1b5 109 }
nikapov 0:694e888fd1b5 110 if(_register_security){
nikapov 0:694e888fd1b5 111 delete _register_security;
nikapov 0:694e888fd1b5 112 }
nikapov 0:694e888fd1b5 113 }
nikapov 0:694e888fd1b5 114
nikapov 0:694e888fd1b5 115 // debug printf function
nikapov 0:694e888fd1b5 116 void trace_printer(const char* str) {
nikapov 0:694e888fd1b5 117 printf("\r\n%s\r\n", str);
nikapov 0:694e888fd1b5 118 }
nikapov 0:694e888fd1b5 119
nikapov 0:694e888fd1b5 120 /*
nikapov 0:694e888fd1b5 121 * Creates M2MInterface using which endpoint can
nikapov 0:694e888fd1b5 122 * setup its name, resource type, life time, connection mode,
nikapov 0:694e888fd1b5 123 * Currently only LwIPv4 is supported.
nikapov 0:694e888fd1b5 124 */
nikapov 0:694e888fd1b5 125 void create_interface(const char *server_address,
nikapov 0:694e888fd1b5 126 void *handler=NULL) {
nikapov 0:694e888fd1b5 127 // Randomizing listening port for Certificate mode connectivity
nikapov 0:694e888fd1b5 128 _server_address = server_address;
nikapov 0:694e888fd1b5 129 uint16_t port = 0; // Network interface will randomize with port 0
nikapov 0:694e888fd1b5 130
nikapov 0:694e888fd1b5 131 // create mDS interface object, this is the base object everything else attaches to
nikapov 0:694e888fd1b5 132 _interface = M2MInterfaceFactory::create_interface(*this,
nikapov 0:694e888fd1b5 133 MBED_ENDPOINT_NAME, // endpoint name string
nikapov 0:694e888fd1b5 134 "test", // endpoint type string
nikapov 0:694e888fd1b5 135 100, // lifetime
nikapov 0:694e888fd1b5 136 port, // listen port
nikapov 0:694e888fd1b5 137 MBED_DOMAIN, // domain string
nikapov 0:694e888fd1b5 138 SOCKET_MODE, // binding mode
nikapov 0:694e888fd1b5 139 NETWORK_STACK, // network stack
nikapov 0:694e888fd1b5 140 ""); // context address string
nikapov 0:694e888fd1b5 141 const char *binding_mode = (SOCKET_MODE == M2MInterface::UDP) ? "UDP" : "TCP";
nikapov 0:694e888fd1b5 142 printf("\r\nSOCKET_MODE : %s\r\n", binding_mode);
nikapov 0:694e888fd1b5 143 printf("Connecting to %s\r\n", server_address);
nikapov 0:694e888fd1b5 144
nikapov 0:694e888fd1b5 145 if(_interface) {
nikapov 0:694e888fd1b5 146 _interface->set_platform_network_handler(handler);
nikapov 0:694e888fd1b5 147 }
nikapov 0:694e888fd1b5 148
nikapov 0:694e888fd1b5 149 }
nikapov 0:694e888fd1b5 150
nikapov 0:694e888fd1b5 151 /*
nikapov 0:694e888fd1b5 152 * check private variable to see if the registration was sucessful or not
nikapov 0:694e888fd1b5 153 */
nikapov 0:694e888fd1b5 154 bool register_successful() {
nikapov 0:694e888fd1b5 155 return _registered;
nikapov 0:694e888fd1b5 156 }
nikapov 0:694e888fd1b5 157
nikapov 0:694e888fd1b5 158 /*
nikapov 0:694e888fd1b5 159 * check private variable to see if un-registration was sucessful or not
nikapov 0:694e888fd1b5 160 */
nikapov 0:694e888fd1b5 161 bool unregister_successful() {
nikapov 0:694e888fd1b5 162 return _unregistered;
nikapov 0:694e888fd1b5 163 }
nikapov 0:694e888fd1b5 164
nikapov 0:694e888fd1b5 165 /*
nikapov 0:694e888fd1b5 166 * Creates register server object with mbed device server address and other parameters
nikapov 0:694e888fd1b5 167 * required for client to connect to mbed device server.
nikapov 0:694e888fd1b5 168 */
nikapov 0:694e888fd1b5 169 M2MSecurity* create_register_object() {
nikapov 0:694e888fd1b5 170 // create security object using the interface factory.
nikapov 0:694e888fd1b5 171 // this will generate a security ObjectID and ObjectInstance
nikapov 0:694e888fd1b5 172 M2MSecurity *security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer);
nikapov 0:694e888fd1b5 173
nikapov 0:694e888fd1b5 174 // make sure security ObjectID/ObjectInstance was created successfully
nikapov 0:694e888fd1b5 175 if(security) {
nikapov 0:694e888fd1b5 176 // Add ResourceID's and values to the security ObjectID/ObjectInstance
nikapov 0:694e888fd1b5 177 security->set_resource_value(M2MSecurity::M2MServerUri, _server_address);
nikapov 0:694e888fd1b5 178 security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::Certificate);
nikapov 0:694e888fd1b5 179 security->set_resource_value(M2MSecurity::ServerPublicKey, SERVER_CERT, sizeof(SERVER_CERT) - 1);
nikapov 0:694e888fd1b5 180 security->set_resource_value(M2MSecurity::PublicKey, CERT, sizeof(CERT) - 1);
nikapov 0:694e888fd1b5 181 security->set_resource_value(M2MSecurity::Secretkey, KEY, sizeof(KEY) - 1);
nikapov 0:694e888fd1b5 182 }
nikapov 0:694e888fd1b5 183 return security;
nikapov 0:694e888fd1b5 184 }
nikapov 0:694e888fd1b5 185
nikapov 0:694e888fd1b5 186 /*
nikapov 0:694e888fd1b5 187 * Creates device object which contains mandatory resources linked with
nikapov 0:694e888fd1b5 188 * device endpoint.
nikapov 0:694e888fd1b5 189 */
nikapov 0:694e888fd1b5 190 M2MDevice* create_device_object() {
nikapov 0:694e888fd1b5 191 // create device objectID/ObjectInstance
nikapov 0:694e888fd1b5 192 M2MDevice *device = M2MInterfaceFactory::create_device();
nikapov 0:694e888fd1b5 193 // make sure device object was created successfully
nikapov 0:694e888fd1b5 194 if(device) {
nikapov 0:694e888fd1b5 195 // add resourceID's to device objectID/ObjectInstance
nikapov 0:694e888fd1b5 196 device->create_resource(M2MDevice::Manufacturer, _device.Manufacturer);
nikapov 0:694e888fd1b5 197 device->create_resource(M2MDevice::DeviceType, _device.Type);
nikapov 0:694e888fd1b5 198 device->create_resource(M2MDevice::ModelNumber, _device.ModelNumber);
nikapov 0:694e888fd1b5 199 device->create_resource(M2MDevice::SerialNumber, _device.SerialNumber);
nikapov 0:694e888fd1b5 200 }
nikapov 0:694e888fd1b5 201 return device;
nikapov 0:694e888fd1b5 202 }
nikapov 0:694e888fd1b5 203
nikapov 0:694e888fd1b5 204 /*
nikapov 0:694e888fd1b5 205 * register an object
nikapov 0:694e888fd1b5 206 */
nikapov 0:694e888fd1b5 207 void test_register(M2MSecurity *register_object, M2MObjectList object_list){
nikapov 0:694e888fd1b5 208 if(_interface) {
nikapov 0:694e888fd1b5 209 // Register function
nikapov 0:694e888fd1b5 210 _interface->register_object(register_object, object_list);
nikapov 0:694e888fd1b5 211 }
nikapov 0:694e888fd1b5 212 }
nikapov 0:694e888fd1b5 213
nikapov 0:694e888fd1b5 214 /*
nikapov 0:694e888fd1b5 215 * unregister all objects
nikapov 0:694e888fd1b5 216 */
nikapov 0:694e888fd1b5 217 void test_unregister() {
nikapov 0:694e888fd1b5 218 if(_interface) {
nikapov 0:694e888fd1b5 219 // Unregister function
nikapov 0:694e888fd1b5 220 _interface->unregister_object(NULL); // NULL will unregister all objects
nikapov 0:694e888fd1b5 221 }
nikapov 0:694e888fd1b5 222 }
nikapov 0:694e888fd1b5 223
nikapov 0:694e888fd1b5 224 //Callback from mbed client stack when the bootstrap
nikapov 0:694e888fd1b5 225 // is successful, it returns the mbed Device Server object
nikapov 0:694e888fd1b5 226 // which will be used for registering the resources to
nikapov 0:694e888fd1b5 227 // mbed Device server.
nikapov 0:694e888fd1b5 228 void bootstrap_done(M2MSecurity *server_object){
nikapov 0:694e888fd1b5 229 if(server_object) {
nikapov 0:694e888fd1b5 230 _bootstrapped = true;
nikapov 0:694e888fd1b5 231 _error = false;
nikapov 0:694e888fd1b5 232 trace_printer("Bootstrapped");
nikapov 0:694e888fd1b5 233 }
nikapov 0:694e888fd1b5 234 }
nikapov 0:694e888fd1b5 235
nikapov 0:694e888fd1b5 236 //Callback from mbed client stack when the registration
nikapov 0:694e888fd1b5 237 // is successful, it returns the mbed Device Server object
nikapov 0:694e888fd1b5 238 // to which the resources are registered and registered objects.
nikapov 0:694e888fd1b5 239 void object_registered(M2MSecurity */*security_object*/, const M2MServer &/*server_object*/){
nikapov 0:694e888fd1b5 240 _registered = true;
nikapov 0:694e888fd1b5 241 _unregistered = false;
nikapov 0:694e888fd1b5 242 trace_printer("Registered object successfully!");
nikapov 0:694e888fd1b5 243 }
nikapov 0:694e888fd1b5 244
nikapov 0:694e888fd1b5 245 //Callback from mbed client stack when the unregistration
nikapov 0:694e888fd1b5 246 // is successful, it returns the mbed Device Server object
nikapov 0:694e888fd1b5 247 // to which the resources were unregistered.
nikapov 0:694e888fd1b5 248 void object_unregistered(M2MSecurity */*server_object*/){
nikapov 0:694e888fd1b5 249 trace_printer("Unregistered Object Successfully");
nikapov 0:694e888fd1b5 250 _unregistered = true;
nikapov 0:694e888fd1b5 251 _registered = false;
nikapov 0:694e888fd1b5 252 }
nikapov 0:694e888fd1b5 253
nikapov 0:694e888fd1b5 254 /*
nikapov 0:694e888fd1b5 255 * Callback from mbed client stack when registration is updated
nikapov 0:694e888fd1b5 256 */
nikapov 0:694e888fd1b5 257 void registration_updated(M2MSecurity */*security_object*/, const M2MServer & /*server_object*/){
nikapov 0:694e888fd1b5 258 /* The registration is updated automatically and frequently by the
nikapov 0:694e888fd1b5 259 * mbed client stack. This print statement is turned off because it
nikapov 0:694e888fd1b5 260 * tends to happen alot.
nikapov 0:694e888fd1b5 261 */
nikapov 0:694e888fd1b5 262 //trace_printer("\r\nRegistration Updated\r\n");
nikapov 0:694e888fd1b5 263 }
nikapov 0:694e888fd1b5 264
nikapov 0:694e888fd1b5 265 // Callback from mbed client stack if any error is encountered
nikapov 0:694e888fd1b5 266 // during any of the LWM2M operations. Error type is passed in
nikapov 0:694e888fd1b5 267 // the callback.
nikapov 0:694e888fd1b5 268 void error(M2MInterface::Error error){
nikapov 0:694e888fd1b5 269 _error = true;
nikapov 0:694e888fd1b5 270 switch(error){
nikapov 0:694e888fd1b5 271 case M2MInterface::AlreadyExists:
nikapov 0:694e888fd1b5 272 trace_printer("[ERROR:] M2MInterface::AlreadyExist");
nikapov 0:694e888fd1b5 273 break;
nikapov 0:694e888fd1b5 274 case M2MInterface::BootstrapFailed:
nikapov 0:694e888fd1b5 275 trace_printer("[ERROR:] M2MInterface::BootstrapFailed");
nikapov 0:694e888fd1b5 276 break;
nikapov 0:694e888fd1b5 277 case M2MInterface::InvalidParameters:
nikapov 0:694e888fd1b5 278 trace_printer("[ERROR:] M2MInterface::InvalidParameters");
nikapov 0:694e888fd1b5 279 break;
nikapov 0:694e888fd1b5 280 case M2MInterface::NotRegistered:
nikapov 0:694e888fd1b5 281 trace_printer("[ERROR:] M2MInterface::NotRegistered");
nikapov 0:694e888fd1b5 282 break;
nikapov 0:694e888fd1b5 283 case M2MInterface::Timeout:
nikapov 0:694e888fd1b5 284 trace_printer("[ERROR:] M2MInterface::Timeout");
nikapov 0:694e888fd1b5 285 break;
nikapov 0:694e888fd1b5 286 case M2MInterface::NetworkError:
nikapov 0:694e888fd1b5 287 trace_printer("[ERROR:] M2MInterface::NetworkError");
nikapov 0:694e888fd1b5 288 break;
nikapov 0:694e888fd1b5 289 case M2MInterface::ResponseParseFailed:
nikapov 0:694e888fd1b5 290 trace_printer("[ERROR:] M2MInterface::ResponseParseFailed");
nikapov 0:694e888fd1b5 291 break;
nikapov 0:694e888fd1b5 292 case M2MInterface::UnknownError:
nikapov 0:694e888fd1b5 293 trace_printer("[ERROR:] M2MInterface::UnknownError");
nikapov 0:694e888fd1b5 294 break;
nikapov 0:694e888fd1b5 295 case M2MInterface::MemoryFail:
nikapov 0:694e888fd1b5 296 trace_printer("[ERROR:] M2MInterface::MemoryFail");
nikapov 0:694e888fd1b5 297 break;
nikapov 0:694e888fd1b5 298 case M2MInterface::NotAllowed:
nikapov 0:694e888fd1b5 299 trace_printer("[ERROR:] M2MInterface::NotAllowed");
nikapov 0:694e888fd1b5 300 break;
nikapov 0:694e888fd1b5 301 case M2MInterface::SecureConnectionFailed:
nikapov 0:694e888fd1b5 302 trace_printer("[ERROR:] M2MInterface::SecureConnectionFailed");
nikapov 0:694e888fd1b5 303 break;
nikapov 0:694e888fd1b5 304 case M2MInterface::DnsResolvingFailed:
nikapov 0:694e888fd1b5 305 trace_printer("[ERROR:] M2MInterface::DnsResolvingFailed");
nikapov 0:694e888fd1b5 306 break;
nikapov 0:694e888fd1b5 307
nikapov 0:694e888fd1b5 308 default:
nikapov 0:694e888fd1b5 309 break;
nikapov 0:694e888fd1b5 310 }
nikapov 0:694e888fd1b5 311 }
nikapov 0:694e888fd1b5 312
nikapov 0:694e888fd1b5 313 /* Callback from mbed client stack if any value has changed
nikapov 0:694e888fd1b5 314 * during PUT operation. Object and its type is passed in
nikapov 0:694e888fd1b5 315 * the callback.
nikapov 0:694e888fd1b5 316 * BaseType enum from m2mbase.h
nikapov 0:694e888fd1b5 317 * Object = 0x0, Resource = 0x1, ObjectInstance = 0x2, ResourceInstance = 0x3
nikapov 0:694e888fd1b5 318 */
nikapov 0:694e888fd1b5 319 void value_updated(M2MBase *base, M2MBase::BaseType type) {
nikapov 0:694e888fd1b5 320 printf("\r\nPUT Request Received!");
nikapov 0:694e888fd1b5 321 printf("\r\nName :'%s', \r\nPath : '%s', \r\nType : '%d' (0 for Object, 1 for Resource), \r\nType : '%s'\r\n",
nikapov 0:694e888fd1b5 322 base->name(),
nikapov 0:694e888fd1b5 323 base->uri_path(),
nikapov 0:694e888fd1b5 324 type,
nikapov 0:694e888fd1b5 325 base->resource_type()
nikapov 0:694e888fd1b5 326 );
nikapov 0:694e888fd1b5 327 }
nikapov 0:694e888fd1b5 328
nikapov 0:694e888fd1b5 329 /*
nikapov 0:694e888fd1b5 330 * update the registration period
nikapov 0:694e888fd1b5 331 */
nikapov 0:694e888fd1b5 332 void test_update_register() {
nikapov 0:694e888fd1b5 333 if (_registered) {
nikapov 0:694e888fd1b5 334 _interface->update_registration(_register_security, 100);
nikapov 0:694e888fd1b5 335 }
nikapov 0:694e888fd1b5 336 }
nikapov 0:694e888fd1b5 337
nikapov 0:694e888fd1b5 338 /*
nikapov 0:694e888fd1b5 339 * manually configure the security object private variable
nikapov 0:694e888fd1b5 340 */
nikapov 0:694e888fd1b5 341 void set_register_object(M2MSecurity *register_object) {
nikapov 0:694e888fd1b5 342 if (_register_security == NULL) {
nikapov 0:694e888fd1b5 343 _register_security = register_object;
nikapov 0:694e888fd1b5 344 }
nikapov 0:694e888fd1b5 345 }
nikapov 0:694e888fd1b5 346
nikapov 0:694e888fd1b5 347 private:
nikapov 0:694e888fd1b5 348
nikapov 0:694e888fd1b5 349 /*
nikapov 0:694e888fd1b5 350 * Private variables used in class
nikapov 0:694e888fd1b5 351 */
nikapov 0:694e888fd1b5 352 M2MInterface *_interface;
nikapov 0:694e888fd1b5 353 M2MSecurity *_register_security;
nikapov 0:694e888fd1b5 354 M2MObject *_object;
nikapov 0:694e888fd1b5 355 volatile bool _bootstrapped;
nikapov 0:694e888fd1b5 356 volatile bool _error;
nikapov 0:694e888fd1b5 357 volatile bool _registered;
nikapov 0:694e888fd1b5 358 volatile bool _unregistered;
nikapov 0:694e888fd1b5 359 int _value;
nikapov 0:694e888fd1b5 360 struct MbedClientDevice _device;
nikapov 0:694e888fd1b5 361 String _server_address;
nikapov 0:694e888fd1b5 362 };
nikapov 0:694e888fd1b5 363
nikapov 0:694e888fd1b5 364 #endif // __SIMPLECLIENT_H__