Donald Meyers / Mbed OS evan
Committer:
djmeyers
Date:
Sat Mar 18 22:37:16 2017 +0000
Revision:
0:06ee5f8a484a
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
djmeyers 0:06ee5f8a484a 1 /*
djmeyers 0:06ee5f8a484a 2 * Copyright (c) 2015 ARM Limited. All rights reserved.
djmeyers 0:06ee5f8a484a 3 * SPDX-License-Identifier: Apache-2.0
djmeyers 0:06ee5f8a484a 4 * Licensed under the Apache License, Version 2.0 (the License); you may
djmeyers 0:06ee5f8a484a 5 * not use this file except in compliance with the License.
djmeyers 0:06ee5f8a484a 6 * You may obtain a copy of the License at
djmeyers 0:06ee5f8a484a 7 *
djmeyers 0:06ee5f8a484a 8 * http://www.apache.org/licenses/LICENSE-2.0
djmeyers 0:06ee5f8a484a 9 *
djmeyers 0:06ee5f8a484a 10 * Unless required by applicable law or agreed to in writing, software
djmeyers 0:06ee5f8a484a 11 * distributed under the License is distributed on an AS IS BASIS, WITHOUT
djmeyers 0:06ee5f8a484a 12 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
djmeyers 0:06ee5f8a484a 13 * See the License for the specific language governing permissions and
djmeyers 0:06ee5f8a484a 14 * limitations under the License.
djmeyers 0:06ee5f8a484a 15 */
djmeyers 0:06ee5f8a484a 16 #include <unistd.h>
djmeyers 0:06ee5f8a484a 17 #include <malloc.h>
djmeyers 0:06ee5f8a484a 18 #include <stdio.h>
djmeyers 0:06ee5f8a484a 19 #include <stdarg.h>
djmeyers 0:06ee5f8a484a 20 #include <pthread.h>
djmeyers 0:06ee5f8a484a 21 #include <signal.h> /* For SIGIGN and SIGINT */
djmeyers 0:06ee5f8a484a 22 #include "mbed-client/m2minterfacefactory.h"
djmeyers 0:06ee5f8a484a 23 #include "mbed-client/m2mdevice.h"
djmeyers 0:06ee5f8a484a 24 #include "mbed-client/m2minterfaceobserver.h"
djmeyers 0:06ee5f8a484a 25 #include "mbed-client/m2minterface.h"
djmeyers 0:06ee5f8a484a 26 #include "mbed-client/m2mobjectinstance.h"
djmeyers 0:06ee5f8a484a 27 #include "mbed-client/m2mresource.h"
djmeyers 0:06ee5f8a484a 28
djmeyers 0:06ee5f8a484a 29 #include "mbed-trace/mbed_trace.h"
djmeyers 0:06ee5f8a484a 30
djmeyers 0:06ee5f8a484a 31 const String &BOOTSTRAP_SERVER_ADDRESS = "coap://10.45.3.10:5693";
djmeyers 0:06ee5f8a484a 32 const String &M2M_SERVER_ADDRESS = "coap://10.45.3.10:5683";
djmeyers 0:06ee5f8a484a 33 const String &MANUFACTURER = "manufacturer";
djmeyers 0:06ee5f8a484a 34 const String &TYPE = "type";
djmeyers 0:06ee5f8a484a 35 const String &MODEL_NUMBER = "2015";
djmeyers 0:06ee5f8a484a 36 const String &SERIAL_NUMBER = "12345";
djmeyers 0:06ee5f8a484a 37
djmeyers 0:06ee5f8a484a 38 const uint8_t STATIC_VALUE[] = "Open Mobile Alliance";
djmeyers 0:06ee5f8a484a 39
djmeyers 0:06ee5f8a484a 40 static void ctrl_c_handle_function(void);
djmeyers 0:06ee5f8a484a 41 void close_function();
djmeyers 0:06ee5f8a484a 42 typedef void (*signalhandler_t)(int); /* Function pointer type for ctrl-c */
djmeyers 0:06ee5f8a484a 43
djmeyers 0:06ee5f8a484a 44 class MbedClient: public M2MInterfaceObserver {
djmeyers 0:06ee5f8a484a 45 public:
djmeyers 0:06ee5f8a484a 46 MbedClient(){
djmeyers 0:06ee5f8a484a 47 _security = NULL;
djmeyers 0:06ee5f8a484a 48 _interface = NULL;
djmeyers 0:06ee5f8a484a 49 _register_security = NULL;
djmeyers 0:06ee5f8a484a 50 _device = NULL;
djmeyers 0:06ee5f8a484a 51 _object = NULL;
djmeyers 0:06ee5f8a484a 52 _bootstrapped = false;
djmeyers 0:06ee5f8a484a 53 _error = false;
djmeyers 0:06ee5f8a484a 54 _registered = false;
djmeyers 0:06ee5f8a484a 55 _unregistered = false;
djmeyers 0:06ee5f8a484a 56 _registration_updated = false;
djmeyers 0:06ee5f8a484a 57 _value = 0;
djmeyers 0:06ee5f8a484a 58 }
djmeyers 0:06ee5f8a484a 59
djmeyers 0:06ee5f8a484a 60 ~MbedClient() {
djmeyers 0:06ee5f8a484a 61 if(_security) {
djmeyers 0:06ee5f8a484a 62 delete _security;
djmeyers 0:06ee5f8a484a 63 }
djmeyers 0:06ee5f8a484a 64 if(_register_security){
djmeyers 0:06ee5f8a484a 65 delete _register_security;
djmeyers 0:06ee5f8a484a 66 }
djmeyers 0:06ee5f8a484a 67 if(_device) {
djmeyers 0:06ee5f8a484a 68 M2MDevice::delete_instance();
djmeyers 0:06ee5f8a484a 69 _device = NULL;
djmeyers 0:06ee5f8a484a 70 }
djmeyers 0:06ee5f8a484a 71 if(_object) {
djmeyers 0:06ee5f8a484a 72 delete _object;
djmeyers 0:06ee5f8a484a 73 }
djmeyers 0:06ee5f8a484a 74 if(_interface) {
djmeyers 0:06ee5f8a484a 75 delete _interface;
djmeyers 0:06ee5f8a484a 76 }
djmeyers 0:06ee5f8a484a 77 }
djmeyers 0:06ee5f8a484a 78
djmeyers 0:06ee5f8a484a 79 bool create_interface() {
djmeyers 0:06ee5f8a484a 80 _interface = M2MInterfaceFactory::create_interface(*this,
djmeyers 0:06ee5f8a484a 81 "linux-endpoint",
djmeyers 0:06ee5f8a484a 82 "test",
djmeyers 0:06ee5f8a484a 83 60,
djmeyers 0:06ee5f8a484a 84 5683,
djmeyers 0:06ee5f8a484a 85 "",
djmeyers 0:06ee5f8a484a 86 M2MInterface::UDP,
djmeyers 0:06ee5f8a484a 87 M2MInterface::LwIP_IPv4,
djmeyers 0:06ee5f8a484a 88 "");
djmeyers 0:06ee5f8a484a 89 printf("Endpoint Name : linux-endpoint\n");
djmeyers 0:06ee5f8a484a 90 return (_interface == NULL) ? false : true;
djmeyers 0:06ee5f8a484a 91 }
djmeyers 0:06ee5f8a484a 92
djmeyers 0:06ee5f8a484a 93 bool bootstrap_successful() {
djmeyers 0:06ee5f8a484a 94 while(!_bootstrapped && !_error) {
djmeyers 0:06ee5f8a484a 95 sleep(1);
djmeyers 0:06ee5f8a484a 96 }
djmeyers 0:06ee5f8a484a 97 return _bootstrapped;
djmeyers 0:06ee5f8a484a 98 }
djmeyers 0:06ee5f8a484a 99
djmeyers 0:06ee5f8a484a 100 bool register_successful() {
djmeyers 0:06ee5f8a484a 101 while(!_registered && !_error) {
djmeyers 0:06ee5f8a484a 102 sleep(1);
djmeyers 0:06ee5f8a484a 103 }
djmeyers 0:06ee5f8a484a 104 return _registered;
djmeyers 0:06ee5f8a484a 105 }
djmeyers 0:06ee5f8a484a 106
djmeyers 0:06ee5f8a484a 107 bool unregister_successful() {
djmeyers 0:06ee5f8a484a 108 while(!_unregistered && !_error) {
djmeyers 0:06ee5f8a484a 109 sleep(1);
djmeyers 0:06ee5f8a484a 110 }
djmeyers 0:06ee5f8a484a 111 return _unregistered;
djmeyers 0:06ee5f8a484a 112 }
djmeyers 0:06ee5f8a484a 113
djmeyers 0:06ee5f8a484a 114 bool registration_update_successful() {
djmeyers 0:06ee5f8a484a 115 while(!_registration_updated && !_error) {
djmeyers 0:06ee5f8a484a 116 }
djmeyers 0:06ee5f8a484a 117 return _registration_updated;
djmeyers 0:06ee5f8a484a 118 }
djmeyers 0:06ee5f8a484a 119
djmeyers 0:06ee5f8a484a 120 bool create_bootstrap_object() {
djmeyers 0:06ee5f8a484a 121 bool success = false;
djmeyers 0:06ee5f8a484a 122 if(_security) {
djmeyers 0:06ee5f8a484a 123 delete _security;
djmeyers 0:06ee5f8a484a 124 }
djmeyers 0:06ee5f8a484a 125 _security = M2MInterfaceFactory::create_security(M2MSecurity::Bootstrap);
djmeyers 0:06ee5f8a484a 126 if(_security) {
djmeyers 0:06ee5f8a484a 127 if(_security->set_resource_value(M2MSecurity::M2MServerUri, BOOTSTRAP_SERVER_ADDRESS) &&
djmeyers 0:06ee5f8a484a 128 _security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity)) {
djmeyers 0:06ee5f8a484a 129 success = true;
djmeyers 0:06ee5f8a484a 130 /* Not used now because there is no TLS or DTLS implementation available for stack.
djmeyers 0:06ee5f8a484a 131 security->set_resource_value(M2MSecurity::ServerPublicKey,certificates->certificate_ptr[0],certificates->certificate_len[0]);
djmeyers 0:06ee5f8a484a 132 security->set_resource_value(M2MSecurity::PublicKey,certificates->certificate_ptr[1],certificates->certificate_len[1]);
djmeyers 0:06ee5f8a484a 133 security->set_resource_value(M2MSecurity::Secretkey,certificates->own_private_key_ptr,certificates->own_private_key_len);
djmeyers 0:06ee5f8a484a 134 */
djmeyers 0:06ee5f8a484a 135 }
djmeyers 0:06ee5f8a484a 136 }
djmeyers 0:06ee5f8a484a 137 printf("Bootstrap Server Address %s\n", BOOTSTRAP_SERVER_ADDRESS.c_str());
djmeyers 0:06ee5f8a484a 138 return success;
djmeyers 0:06ee5f8a484a 139 }
djmeyers 0:06ee5f8a484a 140
djmeyers 0:06ee5f8a484a 141 bool create_register_object() {
djmeyers 0:06ee5f8a484a 142 bool success = false;
djmeyers 0:06ee5f8a484a 143 _register_security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer);
djmeyers 0:06ee5f8a484a 144 if(_register_security) {
djmeyers 0:06ee5f8a484a 145 if(_register_security->set_resource_value(M2MSecurity::M2MServerUri, M2M_SERVER_ADDRESS) &&
djmeyers 0:06ee5f8a484a 146 _register_security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity)) {
djmeyers 0:06ee5f8a484a 147 success = true;
djmeyers 0:06ee5f8a484a 148 /* Not used now because there is no TLS or DTLS implementation available for stack.
djmeyers 0:06ee5f8a484a 149 security->set_resource_value(M2MSecurity::ServerPublicKey,certificates->certificate_ptr[0],certificates->certificate_len[0]);
djmeyers 0:06ee5f8a484a 150 security->set_resource_value(M2MSecurity::PublicKey,certificates->certificate_ptr[1],certificates->certificate_len[1]);
djmeyers 0:06ee5f8a484a 151 security->set_resource_value(M2MSecurity::Secretkey,certificates->own_private_key_ptr,certificates->own_private_key_len);
djmeyers 0:06ee5f8a484a 152 */
djmeyers 0:06ee5f8a484a 153 }
djmeyers 0:06ee5f8a484a 154 }
djmeyers 0:06ee5f8a484a 155 return success;
djmeyers 0:06ee5f8a484a 156 }
djmeyers 0:06ee5f8a484a 157
djmeyers 0:06ee5f8a484a 158 void test_bootstrap() {
djmeyers 0:06ee5f8a484a 159 _interface->bootstrap(_security);
djmeyers 0:06ee5f8a484a 160 }
djmeyers 0:06ee5f8a484a 161
djmeyers 0:06ee5f8a484a 162 bool create_device_object() {
djmeyers 0:06ee5f8a484a 163 bool success = false;
djmeyers 0:06ee5f8a484a 164 _device = M2MInterfaceFactory::create_device();
djmeyers 0:06ee5f8a484a 165 if(_device) {
djmeyers 0:06ee5f8a484a 166 _device->object_instance()->set_operation(M2MBase::GET_PUT_POST_ALLOWED);
djmeyers 0:06ee5f8a484a 167 if(_device->create_resource(M2MDevice::Manufacturer,MANUFACTURER) &&
djmeyers 0:06ee5f8a484a 168 _device->create_resource(M2MDevice::DeviceType,TYPE) &&
djmeyers 0:06ee5f8a484a 169 _device->create_resource(M2MDevice::ModelNumber,MODEL_NUMBER) &&
djmeyers 0:06ee5f8a484a 170 _device->create_resource(M2MDevice::SerialNumber,SERIAL_NUMBER)) {
djmeyers 0:06ee5f8a484a 171 success = true;
djmeyers 0:06ee5f8a484a 172 }
djmeyers 0:06ee5f8a484a 173 }
djmeyers 0:06ee5f8a484a 174 return success;
djmeyers 0:06ee5f8a484a 175 }
djmeyers 0:06ee5f8a484a 176
djmeyers 0:06ee5f8a484a 177 void execute_function(void *argument) {
djmeyers 0:06ee5f8a484a 178 if(argument) {
djmeyers 0:06ee5f8a484a 179 char* arguments = (char*)argument;
djmeyers 0:06ee5f8a484a 180 printf("Received %s!!\n", arguments);
djmeyers 0:06ee5f8a484a 181 }
djmeyers 0:06ee5f8a484a 182 printf("I am executed !!\n");
djmeyers 0:06ee5f8a484a 183 }
djmeyers 0:06ee5f8a484a 184
djmeyers 0:06ee5f8a484a 185 bool create_generic_object() {
djmeyers 0:06ee5f8a484a 186 bool success = false;
djmeyers 0:06ee5f8a484a 187 _object = M2MInterfaceFactory::create_object("10");
djmeyers 0:06ee5f8a484a 188 if(_object) {
djmeyers 0:06ee5f8a484a 189 _object->set_operation(M2MBase::GET_PUT_POST_ALLOWED);
djmeyers 0:06ee5f8a484a 190 M2MObjectInstance* inst = _object->create_object_instance();
djmeyers 0:06ee5f8a484a 191 if(inst) {
djmeyers 0:06ee5f8a484a 192 inst->set_operation(M2MBase::GET_PUT_POST_ALLOWED);
djmeyers 0:06ee5f8a484a 193 inst->set_observable(false);
djmeyers 0:06ee5f8a484a 194 char buffer[20];
djmeyers 0:06ee5f8a484a 195 int size = sprintf(buffer,"%d",_value);
djmeyers 0:06ee5f8a484a 196
djmeyers 0:06ee5f8a484a 197 inst->create_static_resource("0",
djmeyers 0:06ee5f8a484a 198 "ResourceTest",
djmeyers 0:06ee5f8a484a 199 M2MResourceInstance::INTEGER,
djmeyers 0:06ee5f8a484a 200 STATIC_VALUE,
djmeyers 0:06ee5f8a484a 201 sizeof(STATIC_VALUE)-1);
djmeyers 0:06ee5f8a484a 202
djmeyers 0:06ee5f8a484a 203 M2MResourceInstance* instance = inst->create_dynamic_resource_instance("1",
djmeyers 0:06ee5f8a484a 204 "ResourceTest",
djmeyers 0:06ee5f8a484a 205 M2MResourceInstance::INTEGER,
djmeyers 0:06ee5f8a484a 206 true,0);
djmeyers 0:06ee5f8a484a 207
djmeyers 0:06ee5f8a484a 208 if(instance) {
djmeyers 0:06ee5f8a484a 209 instance->set_operation(M2MBase::GET_PUT_POST_ALLOWED);
djmeyers 0:06ee5f8a484a 210 instance->set_value((const uint8_t*)buffer,
djmeyers 0:06ee5f8a484a 211 (const uint32_t)size);
djmeyers 0:06ee5f8a484a 212 instance->set_execute_function(execute_callback(this,&MbedClient::execute_function));
djmeyers 0:06ee5f8a484a 213 _value++;
djmeyers 0:06ee5f8a484a 214 }
djmeyers 0:06ee5f8a484a 215 }
djmeyers 0:06ee5f8a484a 216 }
djmeyers 0:06ee5f8a484a 217 return success;
djmeyers 0:06ee5f8a484a 218 }
djmeyers 0:06ee5f8a484a 219
djmeyers 0:06ee5f8a484a 220 void update_resource() {
djmeyers 0:06ee5f8a484a 221 if(_object) {
djmeyers 0:06ee5f8a484a 222 M2MObjectInstance* inst = _object->object_instance();
djmeyers 0:06ee5f8a484a 223 if(inst) {
djmeyers 0:06ee5f8a484a 224 M2MResource* res = inst->resource("1");
djmeyers 0:06ee5f8a484a 225 res = inst->resource("1");
djmeyers 0:06ee5f8a484a 226 if(res) {
djmeyers 0:06ee5f8a484a 227 M2MResourceInstance *res_inst = res->resource_instance(0);
djmeyers 0:06ee5f8a484a 228 if(res_inst) {
djmeyers 0:06ee5f8a484a 229 char buffer1[20];
djmeyers 0:06ee5f8a484a 230 int size1 = sprintf(buffer1,"%d",_value);
djmeyers 0:06ee5f8a484a 231 res_inst->set_value((const uint8_t*)buffer1,
djmeyers 0:06ee5f8a484a 232 (const uint32_t)size1);
djmeyers 0:06ee5f8a484a 233 _value++;
djmeyers 0:06ee5f8a484a 234 }
djmeyers 0:06ee5f8a484a 235 }
djmeyers 0:06ee5f8a484a 236 }
djmeyers 0:06ee5f8a484a 237 }
djmeyers 0:06ee5f8a484a 238 }
djmeyers 0:06ee5f8a484a 239
djmeyers 0:06ee5f8a484a 240 void test_register(){
djmeyers 0:06ee5f8a484a 241 M2MObjectList object_list;
djmeyers 0:06ee5f8a484a 242 object_list.push_back(_device);
djmeyers 0:06ee5f8a484a 243 object_list.push_back(_object);
djmeyers 0:06ee5f8a484a 244
djmeyers 0:06ee5f8a484a 245 _interface->register_object(_register_security,object_list);
djmeyers 0:06ee5f8a484a 246 }
djmeyers 0:06ee5f8a484a 247
djmeyers 0:06ee5f8a484a 248 void test_update_register() {
djmeyers 0:06ee5f8a484a 249 uint32_t updated_lifetime = 20;
djmeyers 0:06ee5f8a484a 250 _registered = false;
djmeyers 0:06ee5f8a484a 251 _unregistered = false;
djmeyers 0:06ee5f8a484a 252 _interface->update_registration(_register_security,updated_lifetime);
djmeyers 0:06ee5f8a484a 253 }
djmeyers 0:06ee5f8a484a 254
djmeyers 0:06ee5f8a484a 255 void test_unregister() {
djmeyers 0:06ee5f8a484a 256 _interface->unregister_object(NULL);
djmeyers 0:06ee5f8a484a 257 }
djmeyers 0:06ee5f8a484a 258
djmeyers 0:06ee5f8a484a 259 void bootstrap_done(M2MSecurity *server_object){
djmeyers 0:06ee5f8a484a 260 if(server_object) {
djmeyers 0:06ee5f8a484a 261 _register_security = server_object;
djmeyers 0:06ee5f8a484a 262 _bootstrapped = true;
djmeyers 0:06ee5f8a484a 263 printf("\nBootstrapped\n");
djmeyers 0:06ee5f8a484a 264 printf("mDS Address %s\n",
djmeyers 0:06ee5f8a484a 265 _register_security->resource_value_string(M2MSecurity::M2MServerUri).c_str());
djmeyers 0:06ee5f8a484a 266 }
djmeyers 0:06ee5f8a484a 267 }
djmeyers 0:06ee5f8a484a 268
djmeyers 0:06ee5f8a484a 269 void object_registered(M2MSecurity */*security_object*/, const M2MServer &/*server_object*/){
djmeyers 0:06ee5f8a484a 270 _registered = true;
djmeyers 0:06ee5f8a484a 271 printf("\nRegistered\n");
djmeyers 0:06ee5f8a484a 272 }
djmeyers 0:06ee5f8a484a 273
djmeyers 0:06ee5f8a484a 274 void object_unregistered(M2MSecurity */*server_object*/){
djmeyers 0:06ee5f8a484a 275 _unregistered = true;
djmeyers 0:06ee5f8a484a 276 printf("\nUnregistered\n");
djmeyers 0:06ee5f8a484a 277 }
djmeyers 0:06ee5f8a484a 278
djmeyers 0:06ee5f8a484a 279 void registration_updated(M2MSecurity */*security_object*/, const M2MServer & /*server_object*/){
djmeyers 0:06ee5f8a484a 280 _registration_updated = true;
djmeyers 0:06ee5f8a484a 281 printf("\nregistration updated\n");
djmeyers 0:06ee5f8a484a 282
djmeyers 0:06ee5f8a484a 283 }
djmeyers 0:06ee5f8a484a 284
djmeyers 0:06ee5f8a484a 285 void error(M2MInterface::Error error){
djmeyers 0:06ee5f8a484a 286 _error = true;
djmeyers 0:06ee5f8a484a 287 close_function();
djmeyers 0:06ee5f8a484a 288 printf("\nError occured Error Code : %d\n", (int8_t)error);
djmeyers 0:06ee5f8a484a 289
djmeyers 0:06ee5f8a484a 290 }
djmeyers 0:06ee5f8a484a 291
djmeyers 0:06ee5f8a484a 292 void value_updated(M2MBase *base, M2MBase::BaseType type) {
djmeyers 0:06ee5f8a484a 293 printf("\nValue updated of Object name %s and Type %d\n",
djmeyers 0:06ee5f8a484a 294 base->name(), type);
djmeyers 0:06ee5f8a484a 295 }
djmeyers 0:06ee5f8a484a 296
djmeyers 0:06ee5f8a484a 297 private:
djmeyers 0:06ee5f8a484a 298
djmeyers 0:06ee5f8a484a 299 M2MInterface *_interface;
djmeyers 0:06ee5f8a484a 300 M2MSecurity *_security;
djmeyers 0:06ee5f8a484a 301 M2MSecurity *_register_security;
djmeyers 0:06ee5f8a484a 302 M2MDevice *_device;
djmeyers 0:06ee5f8a484a 303 M2MObject *_object;
djmeyers 0:06ee5f8a484a 304 bool _bootstrapped;
djmeyers 0:06ee5f8a484a 305 bool _error;
djmeyers 0:06ee5f8a484a 306 bool _registered;
djmeyers 0:06ee5f8a484a 307 bool _unregistered;
djmeyers 0:06ee5f8a484a 308 bool _registration_updated;
djmeyers 0:06ee5f8a484a 309 int _value;
djmeyers 0:06ee5f8a484a 310 };
djmeyers 0:06ee5f8a484a 311
djmeyers 0:06ee5f8a484a 312 void* wait_for_bootstrap(void* arg) {
djmeyers 0:06ee5f8a484a 313 MbedClient *client;
djmeyers 0:06ee5f8a484a 314 client = (MbedClient*) arg;
djmeyers 0:06ee5f8a484a 315 if(client->bootstrap_successful()) {
djmeyers 0:06ee5f8a484a 316 printf("Registering endpoint\n");
djmeyers 0:06ee5f8a484a 317 client->test_register();
djmeyers 0:06ee5f8a484a 318 }
djmeyers 0:06ee5f8a484a 319 return NULL;
djmeyers 0:06ee5f8a484a 320 }
djmeyers 0:06ee5f8a484a 321
djmeyers 0:06ee5f8a484a 322 void* wait_for_unregister(void* arg) {
djmeyers 0:06ee5f8a484a 323 MbedClient *client;
djmeyers 0:06ee5f8a484a 324 client = (MbedClient*) arg;
djmeyers 0:06ee5f8a484a 325 if(client->unregister_successful()) {
djmeyers 0:06ee5f8a484a 326 printf("Unregistered done --> exiting\n");
djmeyers 0:06ee5f8a484a 327 close_function();
djmeyers 0:06ee5f8a484a 328 }
djmeyers 0:06ee5f8a484a 329 return NULL;
djmeyers 0:06ee5f8a484a 330 }
djmeyers 0:06ee5f8a484a 331
djmeyers 0:06ee5f8a484a 332 void* send_observation(void* arg) {
djmeyers 0:06ee5f8a484a 333 MbedClient *client;
djmeyers 0:06ee5f8a484a 334 client = (MbedClient*) arg;
djmeyers 0:06ee5f8a484a 335 static uint8_t counter = 0;
djmeyers 0:06ee5f8a484a 336 while(1) {
djmeyers 0:06ee5f8a484a 337 sleep(1);
djmeyers 0:06ee5f8a484a 338 if(counter >= 5 &&
djmeyers 0:06ee5f8a484a 339 client->register_successful()) {
djmeyers 0:06ee5f8a484a 340 printf("Sending observation\n");
djmeyers 0:06ee5f8a484a 341 client->update_resource();
djmeyers 0:06ee5f8a484a 342 counter = 0;
djmeyers 0:06ee5f8a484a 343 }
djmeyers 0:06ee5f8a484a 344 else
djmeyers 0:06ee5f8a484a 345 counter++;
djmeyers 0:06ee5f8a484a 346 }
djmeyers 0:06ee5f8a484a 347 return NULL;
djmeyers 0:06ee5f8a484a 348 }
djmeyers 0:06ee5f8a484a 349
djmeyers 0:06ee5f8a484a 350 static MbedClient *m2mclient = NULL;
djmeyers 0:06ee5f8a484a 351
djmeyers 0:06ee5f8a484a 352 static void ctrl_c_handle_function(void)
djmeyers 0:06ee5f8a484a 353 {
djmeyers 0:06ee5f8a484a 354 if(m2mclient && m2mclient->register_successful()) {
djmeyers 0:06ee5f8a484a 355 printf("Unregistering endpoint\n");
djmeyers 0:06ee5f8a484a 356 m2mclient->test_unregister();
djmeyers 0:06ee5f8a484a 357 }
djmeyers 0:06ee5f8a484a 358 }
djmeyers 0:06ee5f8a484a 359
djmeyers 0:06ee5f8a484a 360 void trace_printer(const char* str)
djmeyers 0:06ee5f8a484a 361 {
djmeyers 0:06ee5f8a484a 362 printf("%s\r\n", str);
djmeyers 0:06ee5f8a484a 363 }
djmeyers 0:06ee5f8a484a 364
djmeyers 0:06ee5f8a484a 365 static pthread_t bootstrap_thread;
djmeyers 0:06ee5f8a484a 366 static pthread_t unregister_thread;
djmeyers 0:06ee5f8a484a 367 static pthread_t observation_thread;
djmeyers 0:06ee5f8a484a 368
djmeyers 0:06ee5f8a484a 369 void close_function() {
djmeyers 0:06ee5f8a484a 370 pthread_cancel(bootstrap_thread);
djmeyers 0:06ee5f8a484a 371 pthread_cancel(unregister_thread);
djmeyers 0:06ee5f8a484a 372 pthread_cancel(observation_thread);
djmeyers 0:06ee5f8a484a 373 }
djmeyers 0:06ee5f8a484a 374
djmeyers 0:06ee5f8a484a 375 int main() {
djmeyers 0:06ee5f8a484a 376
djmeyers 0:06ee5f8a484a 377 MbedClient mbed_client;
djmeyers 0:06ee5f8a484a 378
djmeyers 0:06ee5f8a484a 379 m2mclient = &mbed_client;
djmeyers 0:06ee5f8a484a 380
djmeyers 0:06ee5f8a484a 381 mbed_trace_init();
djmeyers 0:06ee5f8a484a 382 mbed_trace_print_function_set( trace_printer );
djmeyers 0:06ee5f8a484a 383 mbed_trace_config_set(TRACE_MODE_COLOR|TRACE_ACTIVE_LEVEL_DEBUG|TRACE_CARRIAGE_RETURN);
djmeyers 0:06ee5f8a484a 384
djmeyers 0:06ee5f8a484a 385 signal(SIGINT, (signalhandler_t)ctrl_c_handle_function);
djmeyers 0:06ee5f8a484a 386
djmeyers 0:06ee5f8a484a 387 bool result = mbed_client.create_interface();
djmeyers 0:06ee5f8a484a 388 if(true == result) {
djmeyers 0:06ee5f8a484a 389 printf("\nInterface created\n");
djmeyers 0:06ee5f8a484a 390 }
djmeyers 0:06ee5f8a484a 391 result = mbed_client.create_bootstrap_object();
djmeyers 0:06ee5f8a484a 392 if(true == result) {
djmeyers 0:06ee5f8a484a 393 printf("Bootstrap object created");
djmeyers 0:06ee5f8a484a 394 }
djmeyers 0:06ee5f8a484a 395
djmeyers 0:06ee5f8a484a 396 result = mbed_client.create_register_object();
djmeyers 0:06ee5f8a484a 397 if(true == result) {
djmeyers 0:06ee5f8a484a 398 printf("Register object created");
djmeyers 0:06ee5f8a484a 399 }
djmeyers 0:06ee5f8a484a 400
djmeyers 0:06ee5f8a484a 401 result = mbed_client.create_device_object();
djmeyers 0:06ee5f8a484a 402 if(true == result){
djmeyers 0:06ee5f8a484a 403 printf("\nDevice object created !!\n");
djmeyers 0:06ee5f8a484a 404 }
djmeyers 0:06ee5f8a484a 405
djmeyers 0:06ee5f8a484a 406 result = mbed_client.create_generic_object();
djmeyers 0:06ee5f8a484a 407
djmeyers 0:06ee5f8a484a 408 if(true == result) {
djmeyers 0:06ee5f8a484a 409 printf("\nGeneric object created\n");
djmeyers 0:06ee5f8a484a 410 }
djmeyers 0:06ee5f8a484a 411
djmeyers 0:06ee5f8a484a 412 // printf("Bootstrapping endpoint\n");
djmeyers 0:06ee5f8a484a 413 // mbed_client.test_bootstrap();
djmeyers 0:06ee5f8a484a 414
djmeyers 0:06ee5f8a484a 415 printf("Registering endpoint\n");
djmeyers 0:06ee5f8a484a 416 mbed_client.test_register();
djmeyers 0:06ee5f8a484a 417
djmeyers 0:06ee5f8a484a 418
djmeyers 0:06ee5f8a484a 419 pthread_create(&bootstrap_thread, NULL, &wait_for_bootstrap, (void*) &mbed_client);
djmeyers 0:06ee5f8a484a 420 pthread_create(&observation_thread, NULL, &send_observation, (void*) &mbed_client);
djmeyers 0:06ee5f8a484a 421 pthread_create(&unregister_thread, NULL, &wait_for_unregister, (void*) &mbed_client);
djmeyers 0:06ee5f8a484a 422
djmeyers 0:06ee5f8a484a 423 pthread_join(bootstrap_thread, NULL);
djmeyers 0:06ee5f8a484a 424 pthread_join(unregister_thread, NULL);
djmeyers 0:06ee5f8a484a 425 pthread_join(observation_thread, NULL);
djmeyers 0:06ee5f8a484a 426
djmeyers 0:06ee5f8a484a 427 exit(EXIT_SUCCESS);
djmeyers 0:06ee5f8a484a 428 }
djmeyers 0:06ee5f8a484a 429