Ram Gandikota
/
metronome
FRDM K64F Metronome
mbed-client/test/helloworld-mbedclient/mbedclient.cpp
- Committer:
- ram54288
- Date:
- 2017-05-14
- Revision:
- 0:a2cb7295a1f7
File content as of revision 0:a2cb7295a1f7:
/* * Copyright (c) 2015 ARM Limited. All rights reserved. * SPDX-License-Identifier: Apache-2.0 * Licensed under the Apache License, Version 2.0 (the License); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "mbedclient.h" #include "mbed-client/m2minterfacefactory.h" #include "mbed-client/m2mdevice.h" #include "mbed-client/m2mobjectinstance.h" #include "mbed-client/m2mresource.h" #ifdef TARGET_LIKE_MBED #include "minar/minar.h" #include "test_env.h" #endif #include <time.h> #include <stdio.h> // Enter your mbed Device Server's IPv4 address and Port number in // mentioned format like 192.168.0.1:5693 const String &BOOTSTRAP_SERVER_ADDRESS = "coap://10.45.3.10:5693"; const String &BOOTSTRAP_SERVER_DTLS_ADDRESS = "coap://10.45.3.10:5694"; #ifdef SIXLOWPAN_INTERFACE const String &MBED_SERVER_ADDRESS = "coap://FD00:FF1:CE0B:A5E1:1068:AF13:9B61:D557:5683"; const String &MBED_SERVER_DTLS_ADDRESS = "coap://FD00:FF1:CE0B:A5E1:1068:AF13:9B61:D557:5684"; #else const String &MBED_SERVER_ADDRESS = "coap://10.45.3.10:5683"; //const String &MBED_SERVER_ADDRESS = "coap://10.45.0.152:5683"; const String &MBED_SERVER_DTLS_ADDRESS = "coap://10.45.3.10:5684"; #endif const String CLIENT_NAME = "secure-client"; const String &MANUFACTURER = "ARM"; const String &TYPE = "type"; const String &MODEL_NUMBER = "2015"; const String &SERIAL_NUMBER = "12345"; const uint8_t STATIC_VALUE[] = "Static value"; #ifdef TARGET_LIKE_LINUX #include <unistd.h> #else #endif MbedClient::MbedClient() #ifndef TARGET_LIKE_LINUX :_led(LED3) #endif { _security = NULL; _interface = NULL; _register_security = NULL; _device = NULL; _object = NULL; _bootstrapped = false; _error = false; _registered = false; _unregistered = false; _registration_updated = false; _value = 0; } MbedClient::~MbedClient() { if(_security) { delete _security; } if(_register_security){ delete _register_security; } if(_device) { M2MDevice::delete_instance(); } if(_object) { delete _object; } if(_interface) { delete _interface; } } bool MbedClient::create_interface() { M2MInterface::NetworkStack stack = M2MInterface::LwIP_IPv4; #ifdef SIXLOWPAN_INTERFACE stack = M2MInterface::Nanostack_IPv6; #endif /* From http://www.iana.org/assignments/port-numbers: "The Dynamic and/or Private Ports are those from 49152 through 65535" */ srand(time(NULL)); uint16_t port = (rand() % (65535-49152)) + 49152; _interface = M2MInterfaceFactory::create_interface(*this, CLIENT_NAME, "test", 60, port, "", M2MInterface::UDP, stack, ""); return (_interface == NULL) ? false : true; } bool MbedClient::bootstrap_successful() { #ifdef TARGET_LIKE_LINUX while(!_bootstrapped && !_error) { sleep(1); } #endif return _bootstrapped; } bool MbedClient::register_successful() { #ifdef TARGET_LIKE_LINUX while(!_registered && !_error) { sleep(1); } #endif return _registered; } bool MbedClient::unregister_successful() { #ifdef TARGET_LIKE_LINUX while(!_unregistered && !_error) { sleep(1); } #endif return _unregistered; } bool MbedClient::registration_update_successful() { #ifdef TARGET_LIKE_LINUX while(!_registration_updated && !_error) { sleep(1); } #endif return _registration_updated; } M2MSecurity* MbedClient::create_bootstrap_object(bool useSecureConnection) { // Creates bootstrap server object with Bootstrap server address and other parameters // required for client to connect to bootstrap server. M2MSecurity *security = M2MInterfaceFactory::create_security(M2MSecurity::Bootstrap); if(security) { if(useSecureConnection){ security->set_resource_value(M2MSecurity::M2MServerUri, BOOTSTRAP_SERVER_DTLS_ADDRESS); //TODO: remove these, when bootstrapping server supports DTLS delete security; return NULL; }else{ security->set_resource_value(M2MSecurity::M2MServerUri, BOOTSTRAP_SERVER_ADDRESS); //TODO: refactor this out security->set_resource_value(M2MSecurity::SecurityMode, M2MSecurity::NoSecurity); } } return security; } M2MSecurity* MbedClient::create_register_object(bool useSecureConnection) { // Creates bootstrap server object with Bootstrap server address and other parameters // required for client to connect to bootstrap server. M2MSecurity *security = M2MInterfaceFactory::create_security(M2MSecurity::M2MServer); if(security) { if(useSecureConnection){ security->set_resource_value(M2MSecurity::M2MServerUri, MBED_SERVER_DTLS_ADDRESS); }else{ security->set_resource_value(M2MSecurity::M2MServerUri, MBED_SERVER_ADDRESS); } } return security; } void MbedClient::test_bootstrap(M2MSecurity *security) { if(_interface) { // Bootstrap function. _interface->bootstrap(security); } } M2MDevice* MbedClient::create_device_object() { // Creates device object which contains mandatory resources linked with // device endpoint. M2MDevice *device = M2MInterfaceFactory::create_device(); if(device) { device->create_resource(M2MDevice::Manufacturer,MANUFACTURER); device->create_resource(M2MDevice::DeviceType,TYPE); device->create_resource(M2MDevice::ModelNumber,MODEL_NUMBER); device->create_resource(M2MDevice::SerialNumber,SERIAL_NUMBER); } return device; } void MbedClient::execute_function(void *argument) { #ifdef TARGET_LIKE_LINUX if(argument) { char* arguments = (char*)argument; printf("Received %s!!\n", arguments); } printf("I am executed !!\n"); #else _led == 0 ? _led = 1 : _led = 0; #endif } M2MObject* MbedClient::create_generic_object() { _object = M2MInterfaceFactory::create_object("Test"); if(_object) { M2MObjectInstance* inst = _object->create_object_instance(); if(inst) { inst->set_operation(M2MBase::GET_ALLOWED); M2MResource* res = inst->create_dynamic_resource("Dynamic", "ResourceTest", M2MResourceInstance::INTEGER, true); char buffer[20]; int size = sprintf(buffer,"%d",_value); res->set_operation(M2MBase::GET_PUT_POST_ALLOWED); res->set_value((const uint8_t*)buffer, (const uint32_t)size); res->set_execute_function(execute_callback(this,&MbedClient::execute_function)); _value++; inst->create_static_resource("Static", "ResourceTest", M2MResourceInstance::STRING, STATIC_VALUE, sizeof(STATIC_VALUE)-1); } } return _object; } void MbedClient::update_resource() { if(_object) { M2MObjectInstance* inst = _object->object_instance(); if(inst) { M2MResource* res = inst->resource("Dynamic"); if( res ){ char buffer[20]; int size = sprintf(buffer,"%d",_value); res->set_value((const uint8_t*)buffer, (const uint32_t)size); _value++; } } } } void MbedClient::test_register(M2MObjectList object_list){ if(_interface) { _interface->register_object(_register_security, object_list); } } void MbedClient::set_register_object(M2MSecurity *®ister_object){ if(_register_security) { delete _register_security; _register_security = NULL; } _register_security = register_object; } void MbedClient::test_update_register() { uint32_t updated_lifetime = 20; _registered = false; _unregistered = false; if(_interface){ _interface->update_registration(_register_security,updated_lifetime); } } void MbedClient::test_unregister() { if(_interface) { _interface->unregister_object(NULL); } } void MbedClient::bootstrap_done(M2MSecurity *server_object){ if(server_object) { set_register_object(server_object); _bootstrapped = true; _error = false; printf("\nBootstrapped\n"); } } void MbedClient::object_registered(M2MSecurity */*security_object*/, const M2MServer &/*server_object*/){ _registered = true; _unregistered = false; printf("\nRegistered\n"); } void MbedClient::object_unregistered(M2MSecurity */*server_object*/){ _unregistered = true; _registered = false; #ifdef TARGET_LIKE_MBED notify_completion(_unregistered); minar::Scheduler::stop(); #endif printf("\nUnregistered\n"); } void MbedClient::registration_updated(M2MSecurity */*security_object*/, const M2MServer & /*server_object*/){ _registration_updated = true; printf("\nregistration updated\n"); } void MbedClient::error(M2MInterface::Error error){ _error = true; printf("\nError occured Error code %d\n", (int)error); } void MbedClient::value_updated(M2MBase *base, M2MBase::BaseType type) { printf("\nValue updated of Object name %s and Type %d\n", base->name(), type); }