sandbox / Mbed OS simple-mbed-client-example

Dependencies:   simple-mbed-client

Fork of simple-mbed-client-example by Jan Jongboom

Committer:
geky
Date:
Thu Mar 03 19:26:28 2016 +0000
Revision:
11:341c9f62028b
Parent:
4:dcd0494556be
Child:
12:31e60c8bb7f6
Adopted the NetworkSocketAPI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
geky 4:dcd0494556be 1 /*
geky 4:dcd0494556be 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
geky 4:dcd0494556be 3 * SPDX-License-Identifier: Apache-2.0
geky 4:dcd0494556be 4 * Licensed under the Apache License, Version 2.0 (the License); you may
geky 4:dcd0494556be 5 * not use this file except in compliance with the License.
geky 4:dcd0494556be 6 * You may obtain a copy of the License at
geky 4:dcd0494556be 7 *
geky 4:dcd0494556be 8 * http://www.apache.org/licenses/LICENSE-2.0
geky 4:dcd0494556be 9 *
geky 4:dcd0494556be 10 * Unless required by applicable law or agreed to in writing, software
geky 4:dcd0494556be 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
geky 4:dcd0494556be 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
geky 4:dcd0494556be 13 * See the License for the specific language governing permissions and
geky 4:dcd0494556be 14 * limitations under the License.
geky 4:dcd0494556be 15 */
geky 4:dcd0494556be 16 #include "EthernetInterface.h"
geky 4:dcd0494556be 17 #include "mbed-client/m2minterfacefactory.h"
geky 4:dcd0494556be 18 #include "mbed-client/m2mdevice.h"
geky 4:dcd0494556be 19 #include "mbed-client/m2minterfaceobserver.h"
geky 4:dcd0494556be 20 #include "mbed-client/m2minterface.h"
geky 4:dcd0494556be 21 #include "mbed-client/m2mobjectinstance.h"
geky 4:dcd0494556be 22 #include "mbed-client/m2mresource.h"
geky 4:dcd0494556be 23 #include "security.h"
geky 4:dcd0494556be 24 #include "ns_trace.h"
geky 4:dcd0494556be 25
geky 4:dcd0494556be 26 #include "mbed.h"
geky 11:341c9f62028b 27 #include "rtos.h"
geky 11:341c9f62028b 28
geky 11:341c9f62028b 29 #include "ESP8266Interface.h"
geky 11:341c9f62028b 30 #include "mbed-client-classic/m2mnetwork.h"
geky 4:dcd0494556be 31
geky 4:dcd0494556be 32
geky 4:dcd0494556be 33 Serial output(USBTX, USBRX);
geky 4:dcd0494556be 34
geky 4:dcd0494556be 35 //Select binding mode: UDP or TCP
geky 4:dcd0494556be 36 M2MInterface::BindingMode SOCKET_MODE = M2MInterface::UDP;
geky 4:dcd0494556be 37
geky 4:dcd0494556be 38 // This is address to mbed Device Connector
geky 4:dcd0494556be 39 const String &MBED_SERVER_ADDRESS = "coap://api.connector.mbed.com:5684";
geky 4:dcd0494556be 40
geky 4:dcd0494556be 41 const String &MBED_USER_NAME_DOMAIN = MBED_DOMAIN;
geky 4:dcd0494556be 42 const String &ENDPOINT_NAME = MBED_ENDPOINT_NAME;
geky 4:dcd0494556be 43
geky 4:dcd0494556be 44 const String &MANUFACTURER = "manufacturer";
geky 4:dcd0494556be 45 const String &TYPE = "type";
geky 4:dcd0494556be 46 const String &MODEL_NUMBER = "2015";
geky 4:dcd0494556be 47 const String &SERIAL_NUMBER = "12345";
geky 4:dcd0494556be 48
geky 4:dcd0494556be 49 const uint8_t STATIC_VALUE[] = "Static value";
geky 4:dcd0494556be 50
geky 4:dcd0494556be 51 #if defined(TARGET_K64F)
geky 4:dcd0494556be 52 #define OBS_BUTTON SW2
geky 4:dcd0494556be 53 #define UNREG_BUTTON SW3
geky 4:dcd0494556be 54 #endif
geky 4:dcd0494556be 55
geky 4:dcd0494556be 56
geky 4:dcd0494556be 57 class MbedClient: public M2MInterfaceObserver {
geky 4:dcd0494556be 58 public:
geky 4:dcd0494556be 59 MbedClient(){
geky 4:dcd0494556be 60 _interface = NULL;
geky 4:dcd0494556be 61 _bootstrapped = false;
geky 4:dcd0494556be 62 _error = false;
geky 4:dcd0494556be 63 _registered = false;
geky 4:dcd0494556be 64 _unregistered = false;
geky 4:dcd0494556be 65 _register_security = NULL;
geky 4:dcd0494556be 66 _value = 0;
geky 4:dcd0494556be 67 _object = NULL;
geky 4:dcd0494556be 68 }
geky 4:dcd0494556be 69
geky 4:dcd0494556be 70 ~MbedClient() {
geky 4:dcd0494556be 71 if(_interface) {
geky 4:dcd0494556be 72 delete _interface;
geky 4:dcd0494556be 73 }
geky 4:dcd0494556be 74 if(_register_security){
geky 4:dcd0494556be 75 delete _register_security;
geky 4:dcd0494556be 76 }
geky 4:dcd0494556be 77 }
geky 4:dcd0494556be 78
geky 4:dcd0494556be 79 void trace_printer(const char* str) {
geky 4:dcd0494556be 80 output.printf("\r\n%s\r\n", str);
geky 4:dcd0494556be 81 }
geky 4:dcd0494556be 82
geky 4:dcd0494556be 83 void create_interface() {
geky 4:dcd0494556be 84 // Creates M2MInterface using which endpoint can
geky 4:dcd0494556be 85 // setup its name, resource type, life time, connection mode,
geky 4:dcd0494556be 86 // Currently only LwIPv4 is supported.
geky 4:dcd0494556be 87
geky 4:dcd0494556be 88 // Randomizing listening port for Certificate mode connectivity
geky 4:dcd0494556be 89 srand(time(NULL));
geky 4:dcd0494556be 90 uint16_t port = rand() % 65535 + 12345;
geky 4:dcd0494556be 91
geky 4:dcd0494556be 92 _interface = M2MInterfaceFactory::create_interface(*this,
geky 4:dcd0494556be 93 ENDPOINT_NAME,
geky 4:dcd0494556be 94 "test",
geky 4:dcd0494556be 95 3600,
geky 4:dcd0494556be 96 port,
geky 4:dcd0494556be 97 MBED_USER_NAME_DOMAIN,
geky 4:dcd0494556be 98 SOCKET_MODE,
geky 4:dcd0494556be 99 M2MInterface::LwIP_IPv4,
geky 4:dcd0494556be 100 "");
geky 4:dcd0494556be 101 }
geky 4:dcd0494556be 102
geky 4:dcd0494556be 103 bool register_successful() {
geky 4:dcd0494556be 104 return _registered;
geky 4:dcd0494556be 105 }
geky 4:dcd0494556be 106
geky 4:dcd0494556be 107 bool unregister_successful() {
geky 4:dcd0494556be 108 return _unregistered;
geky 4:dcd0494556be 109 }
geky 4:dcd0494556be 110
geky 4:dcd0494556be 111 M2MSecurity* create_register_object() {
geky 4:dcd0494556be 112 // Creates register server object with mbed device server address and other parameters
geky 4:dcd0494556be 113 // required for client to connect to mbed device server.
geky 4:dcd0494556be 114 M2MSecurity *security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer);
geky 4:dcd0494556be 115 if(security) {
geky 4:dcd0494556be 116 security->set_resource_value(M2MSecurity::M2MServerUri, MBED_SERVER_ADDRESS);
geky 4:dcd0494556be 117 security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::Certificate);
geky 4:dcd0494556be 118 security->set_resource_value(M2MSecurity::ServerPublicKey,SERVER_CERT,sizeof(SERVER_CERT));
geky 4:dcd0494556be 119 security->set_resource_value(M2MSecurity::PublicKey,CERT,sizeof(CERT));
geky 4:dcd0494556be 120 security->set_resource_value(M2MSecurity::Secretkey,KEY,sizeof(KEY));
geky 4:dcd0494556be 121 }
geky 4:dcd0494556be 122 return security;
geky 4:dcd0494556be 123 }
geky 4:dcd0494556be 124
geky 4:dcd0494556be 125 M2MDevice* create_device_object() {
geky 4:dcd0494556be 126 // Creates device object which contains mandatory resources linked with
geky 4:dcd0494556be 127 // device endpoint.
geky 4:dcd0494556be 128 M2MDevice *device = M2MInterfaceFactory::create_device();
geky 4:dcd0494556be 129 if(device) {
geky 4:dcd0494556be 130 device->create_resource(M2MDevice::Manufacturer,MANUFACTURER);
geky 4:dcd0494556be 131 device->create_resource(M2MDevice::DeviceType,TYPE);
geky 4:dcd0494556be 132 device->create_resource(M2MDevice::ModelNumber,MODEL_NUMBER);
geky 4:dcd0494556be 133 device->create_resource(M2MDevice::SerialNumber,SERIAL_NUMBER);
geky 4:dcd0494556be 134 }
geky 4:dcd0494556be 135 return device;
geky 4:dcd0494556be 136 }
geky 4:dcd0494556be 137
geky 4:dcd0494556be 138 M2MObject* create_generic_object() {
geky 4:dcd0494556be 139 _object = M2MInterfaceFactory::create_object("Test");
geky 4:dcd0494556be 140 if(_object) {
geky 4:dcd0494556be 141 M2MObjectInstance* inst = _object->create_object_instance();
geky 4:dcd0494556be 142 if(inst) {
geky 4:dcd0494556be 143 M2MResource* res = inst->create_dynamic_resource("D",
geky 4:dcd0494556be 144 "ResourceTest",
geky 4:dcd0494556be 145 M2MResourceInstance::INTEGER,
geky 4:dcd0494556be 146 true);
geky 4:dcd0494556be 147 char buffer[20];
geky 4:dcd0494556be 148 int size = sprintf(buffer,"%d",_value);
geky 4:dcd0494556be 149 res->set_operation(M2MBase::GET_PUT_ALLOWED);
geky 4:dcd0494556be 150 res->set_value((const uint8_t*)buffer,
geky 4:dcd0494556be 151 (const uint32_t)size);
geky 4:dcd0494556be 152 _value++;
geky 4:dcd0494556be 153
geky 4:dcd0494556be 154 inst->create_static_resource("S",
geky 4:dcd0494556be 155 "ResourceTest",
geky 4:dcd0494556be 156 M2MResourceInstance::STRING,
geky 4:dcd0494556be 157 STATIC_VALUE,
geky 4:dcd0494556be 158 sizeof(STATIC_VALUE)-1);
geky 4:dcd0494556be 159 }
geky 4:dcd0494556be 160 }
geky 4:dcd0494556be 161 return _object;
geky 4:dcd0494556be 162 }
geky 4:dcd0494556be 163
geky 4:dcd0494556be 164 void update_resource() {
geky 4:dcd0494556be 165 if(_object) {
geky 4:dcd0494556be 166 M2MObjectInstance* inst = _object->object_instance();
geky 4:dcd0494556be 167 if(inst) {
geky 4:dcd0494556be 168 M2MResource* res = inst->resource("D");
geky 4:dcd0494556be 169
geky 4:dcd0494556be 170 char buffer[20];
geky 4:dcd0494556be 171 int size = sprintf(buffer,"%d",_value);
geky 4:dcd0494556be 172 res->set_value((const uint8_t*)buffer,
geky 4:dcd0494556be 173 (const uint32_t)size);
geky 4:dcd0494556be 174 _value++;
geky 4:dcd0494556be 175 }
geky 4:dcd0494556be 176 }
geky 4:dcd0494556be 177 }
geky 4:dcd0494556be 178
geky 4:dcd0494556be 179 void test_register(M2MSecurity *register_object, M2MObjectList object_list){
geky 4:dcd0494556be 180 if(_interface) {
geky 4:dcd0494556be 181 // Register function
geky 4:dcd0494556be 182 _interface->register_object(register_object, object_list);
geky 4:dcd0494556be 183 }
geky 4:dcd0494556be 184 }
geky 4:dcd0494556be 185
geky 4:dcd0494556be 186 void test_unregister() {
geky 4:dcd0494556be 187 if(_interface) {
geky 4:dcd0494556be 188 // Unregister function
geky 4:dcd0494556be 189 _interface->unregister_object(NULL);
geky 4:dcd0494556be 190 }
geky 4:dcd0494556be 191 }
geky 0:9ad9d701b1c3 192
geky 4:dcd0494556be 193 //Callback from mbed client stack when the bootstrap
geky 4:dcd0494556be 194 // is successful, it returns the mbed Device Server object
geky 4:dcd0494556be 195 // which will be used for registering the resources to
geky 4:dcd0494556be 196 // mbed Device server.
geky 4:dcd0494556be 197 void bootstrap_done(M2MSecurity *server_object){
geky 4:dcd0494556be 198 if(server_object) {
geky 4:dcd0494556be 199 _bootstrapped = true;
geky 4:dcd0494556be 200 _error = false;
geky 4:dcd0494556be 201 trace_printer("\nBootstrapped\n");
geky 4:dcd0494556be 202 }
geky 4:dcd0494556be 203 }
geky 4:dcd0494556be 204
geky 4:dcd0494556be 205 //Callback from mbed client stack when the registration
geky 4:dcd0494556be 206 // is successful, it returns the mbed Device Server object
geky 4:dcd0494556be 207 // to which the resources are registered and registered objects.
geky 4:dcd0494556be 208 void object_registered(M2MSecurity */*security_object*/, const M2MServer &/*server_object*/){
geky 4:dcd0494556be 209 _registered = true;
geky 4:dcd0494556be 210 _unregistered = false;
geky 4:dcd0494556be 211 trace_printer("\nRegistered\n");
geky 4:dcd0494556be 212 }
geky 4:dcd0494556be 213
geky 4:dcd0494556be 214 //Callback from mbed client stack when the unregistration
geky 4:dcd0494556be 215 // is successful, it returns the mbed Device Server object
geky 4:dcd0494556be 216 // to which the resources were unregistered.
geky 4:dcd0494556be 217 void object_unregistered(M2MSecurity */*server_object*/){
geky 4:dcd0494556be 218 _unregistered = true;
geky 4:dcd0494556be 219 _registered = false;
geky 4:dcd0494556be 220 trace_printer("\nUnregistered\n");
geky 4:dcd0494556be 221 }
geky 4:dcd0494556be 222
geky 4:dcd0494556be 223 void registration_updated(M2MSecurity */*security_object*/, const M2MServer & /*server_object*/){
geky 4:dcd0494556be 224 }
geky 4:dcd0494556be 225
geky 4:dcd0494556be 226 //Callback from mbed client stack if any error is encountered
geky 4:dcd0494556be 227 // during any of the LWM2M operations. Error type is passed in
geky 4:dcd0494556be 228 // the callback.
geky 4:dcd0494556be 229 void error(M2MInterface::Error error){
geky 4:dcd0494556be 230 _error = true;
geky 4:dcd0494556be 231 switch(error){
geky 4:dcd0494556be 232 case M2MInterface::AlreadyExists:
geky 4:dcd0494556be 233 trace_printer("[ERROR:] M2MInterface::AlreadyExists\n");
geky 4:dcd0494556be 234 break;
geky 4:dcd0494556be 235 case M2MInterface::BootstrapFailed:
geky 4:dcd0494556be 236 trace_printer("[ERROR:] M2MInterface::BootstrapFailed\n");
geky 4:dcd0494556be 237 break;
geky 4:dcd0494556be 238 case M2MInterface::InvalidParameters:
geky 4:dcd0494556be 239 trace_printer("[ERROR:] M2MInterface::InvalidParameters\n");
geky 4:dcd0494556be 240 break;
geky 4:dcd0494556be 241 case M2MInterface::NotRegistered:
geky 4:dcd0494556be 242 trace_printer("[ERROR:] M2MInterface::NotRegistered\n");
geky 4:dcd0494556be 243 break;
geky 4:dcd0494556be 244 case M2MInterface::Timeout:
geky 4:dcd0494556be 245 trace_printer("[ERROR:] M2MInterface::Timeout\n");
geky 4:dcd0494556be 246 break;
geky 4:dcd0494556be 247 case M2MInterface::NetworkError:
geky 4:dcd0494556be 248 trace_printer("[ERROR:] M2MInterface::NetworkError\n");
geky 4:dcd0494556be 249 break;
geky 4:dcd0494556be 250 case M2MInterface::ResponseParseFailed:
geky 4:dcd0494556be 251 trace_printer("[ERROR:] M2MInterface::ResponseParseFailed\n");
geky 4:dcd0494556be 252 break;
geky 4:dcd0494556be 253 case M2MInterface::UnknownError:
geky 4:dcd0494556be 254 trace_printer("[ERROR:] M2MInterface::UnknownError\n");
geky 4:dcd0494556be 255 break;
geky 4:dcd0494556be 256 case M2MInterface::MemoryFail:
geky 4:dcd0494556be 257 trace_printer("[ERROR:] M2MInterface::MemoryFail\n");
geky 4:dcd0494556be 258 break;
geky 4:dcd0494556be 259 case M2MInterface::NotAllowed:
geky 4:dcd0494556be 260 trace_printer("[ERROR:] M2MInterface::NotAllowed\n");
geky 4:dcd0494556be 261 break;
geky 4:dcd0494556be 262 default:
geky 4:dcd0494556be 263 break;
geky 4:dcd0494556be 264 }
geky 4:dcd0494556be 265 }
geky 4:dcd0494556be 266
geky 4:dcd0494556be 267 //Callback from mbed client stack if any value has changed
geky 4:dcd0494556be 268 // during PUT operation. Object and its type is passed in
geky 4:dcd0494556be 269 // the callback.
geky 4:dcd0494556be 270 void value_updated(M2MBase *base, M2MBase::BaseType type) {
geky 4:dcd0494556be 271 output.printf("\nValue updated of Object name %s and Type %d\n",
geky 4:dcd0494556be 272 base->name().c_str(), type);
geky 4:dcd0494556be 273 }
geky 4:dcd0494556be 274
geky 4:dcd0494556be 275 void test_update_register() {
geky 4:dcd0494556be 276 if (_registered) {
geky 4:dcd0494556be 277 _interface->update_registration(_register_security, 3600);
geky 4:dcd0494556be 278 }
geky 4:dcd0494556be 279 }
geky 4:dcd0494556be 280
geky 4:dcd0494556be 281 void set_register_object(M2MSecurity *register_object) {
geky 4:dcd0494556be 282 if (_register_security == NULL) {
geky 4:dcd0494556be 283 _register_security = register_object;
geky 4:dcd0494556be 284 }
geky 4:dcd0494556be 285 }
geky 4:dcd0494556be 286
geky 4:dcd0494556be 287 private:
geky 4:dcd0494556be 288
geky 4:dcd0494556be 289 M2MInterface *_interface;
geky 4:dcd0494556be 290 M2MSecurity *_register_security;
geky 4:dcd0494556be 291 M2MObject *_object;
geky 4:dcd0494556be 292 volatile bool _bootstrapped;
geky 4:dcd0494556be 293 volatile bool _error;
geky 4:dcd0494556be 294 volatile bool _registered;
geky 4:dcd0494556be 295 volatile bool _unregistered;
geky 4:dcd0494556be 296 int _value;
geky 4:dcd0494556be 297 };
geky 4:dcd0494556be 298
geky 4:dcd0494556be 299 // Instantiate the class which implements
geky 4:dcd0494556be 300 // LWM2M Client API
geky 4:dcd0494556be 301 MbedClient mbed_client;
geky 11:341c9f62028b 302 ESP8266Interface esp(D1, D0);
geky 11:341c9f62028b 303 M2MNetwork network(&esp);
geky 4:dcd0494556be 304
geky 4:dcd0494556be 305 // Set up Hardware interrupt button.
geky 11:341c9f62028b 306 InterruptIn obs_button(SW2);
geky 11:341c9f62028b 307 InterruptIn unreg_button(SW3);
geky 4:dcd0494556be 308
geky 4:dcd0494556be 309 // Network interaction must be performed outside of interrupt context
geky 4:dcd0494556be 310 Semaphore updates(0);
geky 4:dcd0494556be 311 volatile bool registered = false;
geky 4:dcd0494556be 312 osThreadId mainThread;
geky 4:dcd0494556be 313
geky 4:dcd0494556be 314 void unregister() {
geky 4:dcd0494556be 315 registered = false;
geky 4:dcd0494556be 316 updates.release();
geky 4:dcd0494556be 317 }
geky 4:dcd0494556be 318
geky 4:dcd0494556be 319 void update() {
geky 4:dcd0494556be 320 updates.release();
geky 4:dcd0494556be 321 }
geky 4:dcd0494556be 322
geky 4:dcd0494556be 323 // Status indication
geky 4:dcd0494556be 324 Ticker status_ticker;
geky 11:341c9f62028b 325 DigitalOut status_led(LED1);
geky 4:dcd0494556be 326 void blinky() { status_led = !status_led; }
geky 4:dcd0494556be 327
geky 4:dcd0494556be 328
geky 4:dcd0494556be 329 // Entry point to the program
geky 4:dcd0494556be 330 int main() {
geky 4:dcd0494556be 331 status_ticker.attach_us(blinky, 250000);
geky 4:dcd0494556be 332
geky 4:dcd0494556be 333 // Keep track of the main thread
geky 4:dcd0494556be 334 mainThread = osThreadGetId();
geky 4:dcd0494556be 335
geky 4:dcd0494556be 336 // Sets the console baud-rate
geky 4:dcd0494556be 337 output.baud(115200);
geky 4:dcd0494556be 338
geky 4:dcd0494556be 339 // This sets up the network interface configuration which will be used
geky 4:dcd0494556be 340 // by LWM2M Client API to communicate with mbed Device server.
geky 11:341c9f62028b 341 esp.connect("Sniffer", "Sandcastle");
geky 4:dcd0494556be 342
geky 4:dcd0494556be 343 //lwipv4_socket_init();
geky 11:341c9f62028b 344 output.printf("IP address %s\r\n", esp.getIPAddress());
geky 4:dcd0494556be 345
geky 4:dcd0494556be 346 // On press of SW3 button on K64F board, example application
geky 4:dcd0494556be 347 // will call unregister API towards mbed Device Server
geky 4:dcd0494556be 348 //unreg_button.fall(&mbed_client,&MbedClient::test_unregister);
geky 4:dcd0494556be 349 unreg_button.fall(&unregister);
geky 4:dcd0494556be 350
geky 4:dcd0494556be 351 // On press of SW2 button on K64F board, example application
geky 4:dcd0494556be 352 // will send observation towards mbed Device Server
geky 4:dcd0494556be 353 obs_button.fall(&update);
geky 4:dcd0494556be 354
geky 4:dcd0494556be 355 // Create LWM2M Client API interface to manage register and unregister
geky 4:dcd0494556be 356 mbed_client.create_interface();
geky 4:dcd0494556be 357
geky 4:dcd0494556be 358 // Create LWM2M server object specifying mbed device server
geky 4:dcd0494556be 359 // information.
geky 4:dcd0494556be 360 M2MSecurity* register_object = mbed_client.create_register_object();
geky 4:dcd0494556be 361
geky 4:dcd0494556be 362 // Create LWM2M device object specifying device resources
geky 4:dcd0494556be 363 // as per OMA LWM2M specification.
geky 4:dcd0494556be 364 M2MDevice* device_object = mbed_client.create_device_object();
geky 4:dcd0494556be 365
geky 4:dcd0494556be 366 // Create Generic object specifying custom resources
geky 4:dcd0494556be 367 M2MObject* generic_object = mbed_client.create_generic_object();
geky 4:dcd0494556be 368
geky 4:dcd0494556be 369 // Add all the objects that you would like to register
geky 4:dcd0494556be 370 // into the list and pass the list for register API.
geky 4:dcd0494556be 371 M2MObjectList object_list;
geky 4:dcd0494556be 372 object_list.push_back(device_object);
geky 4:dcd0494556be 373 object_list.push_back(generic_object);
geky 4:dcd0494556be 374
geky 4:dcd0494556be 375 mbed_client.set_register_object(register_object);
geky 4:dcd0494556be 376
geky 4:dcd0494556be 377 // Register with mbed Device Connector
geky 4:dcd0494556be 378 mbed_client.test_register(register_object, object_list);
geky 4:dcd0494556be 379 registered = true;
geky 4:dcd0494556be 380
geky 4:dcd0494556be 381 while (true) {
geky 4:dcd0494556be 382 int update = updates.wait(25000);
geky 4:dcd0494556be 383
geky 4:dcd0494556be 384 if (!registered) {
geky 4:dcd0494556be 385 break;
geky 4:dcd0494556be 386 } else if (update) {
geky 4:dcd0494556be 387 mbed_client.update_resource();
geky 4:dcd0494556be 388 } else {
geky 4:dcd0494556be 389 mbed_client.test_update_register();
geky 4:dcd0494556be 390 }
geky 4:dcd0494556be 391 }
geky 4:dcd0494556be 392
geky 4:dcd0494556be 393 mbed_client.test_unregister();
geky 4:dcd0494556be 394 status_ticker.detach();
geky 4:dcd0494556be 395 }
geky 4:dcd0494556be 396
geky 4:dcd0494556be 397