Ram Gandikota
/
metronome
FRDM K64F Metronome
Diff: mbed-client/test/helloworld-mbedclient/mbedclient.cpp
- Revision:
- 0:a2cb7295a1f7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed-client/test/helloworld-mbedclient/mbedclient.cpp Sun May 14 18:35:07 2017 +0000 @@ -0,0 +1,336 @@ +/* + * 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); +}