From 91c748f7adfbcf837492b28a4e0d33ec9e042376 Mon Sep 17 00:00:00 2001 From: Jay Sharma Date: Fri, 18 Mar 2016 22:37:54 +0530 Subject: [PATCH] [Easy-Setup] Changed the enrollee's cpp files to c files - Updated the enrollee SDK. - Updated the Linux Application Change-Id: Ieacc114d8cff3caaeb5e9f5f9cb1cdc972258d31 Signed-off-by: Jay Sharma Reviewed-on: https://gerrit.iotivity.org/gerrit/6087 Tested-by: jenkins-iotivity Reviewed-by: Madan Lanka --- service/easy-setup/enrollee/SConscript | 35 +- .../enrollee/{src => arduino}/easysetup.cpp | 0 .../enrollee/{src => arduino}/onboarding.cpp | 0 .../enrollee/{src => arduino}/resourcehandler.cpp | 0 .../enrollee/{src => arduino}/softap.cpp | 0 .../wifi/{networkhandler.cpp => networkhandler.c} | 2 +- .../softapnative.cpp => linux/wifi/softapnative.c} | 0 service/easy-setup/enrollee/src/easysetup.c | 198 +++++++++++ .../easy-setup/enrollee/src/easysetupcallbacks.h | 69 ++++ service/easy-setup/enrollee/src/onboarding.c | 94 +++++ service/easy-setup/enrollee/src/resourcehandler.c | 396 +++++++++++++++++++++ service/easy-setup/enrollee/src/resourcehandler.h | 8 + service/easy-setup/enrollee/src/softap.c | 89 +++++ service/easy-setup/enrollee/src/softap.h | 11 +- .../wifi/{networkhandler.cpp => networkhandler.c} | 0 .../softapnative.cpp => tizen/wifi/softapnative.c} | 0 .../enrollee/unittests/enrolleetests.cpp | 3 +- service/easy-setup/inc/escommon.h | 8 - .../easy-setup/sampleapp/enrollee/linux/SConscript | 2 +- .../linux/{enrolleewifi.cpp => enrolleewifi.c} | 148 ++++---- 20 files changed, 957 insertions(+), 106 deletions(-) rename service/easy-setup/enrollee/{src => arduino}/easysetup.cpp (100%) rename service/easy-setup/enrollee/{src => arduino}/onboarding.cpp (100%) mode change 100755 => 100644 rename service/easy-setup/enrollee/{src => arduino}/resourcehandler.cpp (100%) mode change 100755 => 100644 rename service/easy-setup/enrollee/{src => arduino}/softap.cpp (100%) rename service/easy-setup/enrollee/linux/wifi/{networkhandler.cpp => networkhandler.c} (98%) rename service/easy-setup/enrollee/{tizen/wifi/softapnative.cpp => linux/wifi/softapnative.c} (100%) create mode 100644 service/easy-setup/enrollee/src/easysetup.c create mode 100644 service/easy-setup/enrollee/src/easysetupcallbacks.h create mode 100644 service/easy-setup/enrollee/src/onboarding.c create mode 100644 service/easy-setup/enrollee/src/resourcehandler.c create mode 100644 service/easy-setup/enrollee/src/softap.c rename service/easy-setup/enrollee/tizen/wifi/{networkhandler.cpp => networkhandler.c} (100%) rename service/easy-setup/enrollee/{linux/wifi/softapnative.cpp => tizen/wifi/softapnative.c} (100%) rename service/easy-setup/sampleapp/enrollee/linux/{enrolleewifi.cpp => enrolleewifi.c} (54%) mode change 100755 => 100644 diff --git a/service/easy-setup/enrollee/SConscript b/service/easy-setup/enrollee/SConscript index 0ee8b10..f129242 100644 --- a/service/easy-setup/enrollee/SConscript +++ b/service/easy-setup/enrollee/SConscript @@ -59,7 +59,8 @@ enrollee_env.PrependUnique(CPPPATH = [ enrollee_env.get('SRC_DIR') + '/service/easy-setup/inc', enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/linux/wifi', enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/inc', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src']) + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino']) if enrollee_env.get('SECURED') == '1': enrollee_env.AppendUnique(CPPPATH = [ @@ -112,12 +113,12 @@ if target_os == 'arduino': es_enrollee_src = None if target_os == 'linux': - es_enrollee_common_src = [enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/easysetup.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/onboarding.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/resourcehandler.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/softap.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/linux/wifi/softapnative.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/linux/wifi/networkhandler.cpp'] + es_enrollee_common_src = [enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/easysetup.c', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/onboarding.c', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/resourcehandler.c', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/softap.c', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/linux/wifi/softapnative.c', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/linux/wifi/networkhandler.c'] enrollee_env.AppendUnique(es_enrollee_src = es_enrollee_common_src) @@ -126,21 +127,21 @@ if target_os == 'linux': if target_os == 'tizen': enrollee_sdk_shared = enrollee_env.SharedLibrary('ESEnrolleeSDK', [ - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/easysetup.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/onboarding.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/softap.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/resourcehandler.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/tizen/wifi/networkhandler.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/tizen/wifi/softapnative.cpp']) + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/easysetup.c', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/onboarding.c', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/softap.c', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/resourcehandler.c', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/tizen/wifi/networkhandler.c', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/tizen/wifi/softapnative.c']) enrollee_env.InstallTarget(enrollee_sdk_shared, 'libESEnrolleeSDK') enrollee_env.UserInstallTargetLib(enrollee_sdk_shared, 'libESEnrolleeSDK') if target_os == 'arduino': es_sdk_static = enrollee_env.StaticLibrary('ESEnrolleeSDK', [ - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/easysetup.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/onboarding.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/softap.cpp', - enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/src/resourcehandler.cpp', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino/easysetup.cpp', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino/onboarding.cpp', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino/softap.cpp', + enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino/resourcehandler.cpp', enrollee_env.get('SRC_DIR') + '/service/easy-setup/enrollee/arduino/wifi/networkhandler.cpp']) enrollee_env.InstallTarget(es_sdk_static, 'libESEnrolleeSDK') diff --git a/service/easy-setup/enrollee/src/easysetup.cpp b/service/easy-setup/enrollee/arduino/easysetup.cpp similarity index 100% rename from service/easy-setup/enrollee/src/easysetup.cpp rename to service/easy-setup/enrollee/arduino/easysetup.cpp diff --git a/service/easy-setup/enrollee/src/onboarding.cpp b/service/easy-setup/enrollee/arduino/onboarding.cpp old mode 100755 new mode 100644 similarity index 100% rename from service/easy-setup/enrollee/src/onboarding.cpp rename to service/easy-setup/enrollee/arduino/onboarding.cpp diff --git a/service/easy-setup/enrollee/src/resourcehandler.cpp b/service/easy-setup/enrollee/arduino/resourcehandler.cpp old mode 100755 new mode 100644 similarity index 100% rename from service/easy-setup/enrollee/src/resourcehandler.cpp rename to service/easy-setup/enrollee/arduino/resourcehandler.cpp diff --git a/service/easy-setup/enrollee/src/softap.cpp b/service/easy-setup/enrollee/arduino/softap.cpp similarity index 100% rename from service/easy-setup/enrollee/src/softap.cpp rename to service/easy-setup/enrollee/arduino/softap.cpp diff --git a/service/easy-setup/enrollee/linux/wifi/networkhandler.cpp b/service/easy-setup/enrollee/linux/wifi/networkhandler.c similarity index 98% rename from service/easy-setup/enrollee/linux/wifi/networkhandler.cpp rename to service/easy-setup/enrollee/linux/wifi/networkhandler.c index 0aa74b5..7c5a2bb 100644 --- a/service/easy-setup/enrollee/linux/wifi/networkhandler.cpp +++ b/service/easy-setup/enrollee/linux/wifi/networkhandler.c @@ -26,7 +26,7 @@ #include "easysetup.h" #include "oic_string.h" -#define LOG_TAG "TIZEN ES" +#define LOG_TAG "LINUX ES" const char *gSsid = "DLNA_LISMORE1"; const char *gPass = "dlna@010203"; diff --git a/service/easy-setup/enrollee/tizen/wifi/softapnative.cpp b/service/easy-setup/enrollee/linux/wifi/softapnative.c similarity index 100% rename from service/easy-setup/enrollee/tizen/wifi/softapnative.cpp rename to service/easy-setup/enrollee/linux/wifi/softapnative.c diff --git a/service/easy-setup/enrollee/src/easysetup.c b/service/easy-setup/enrollee/src/easysetup.c new file mode 100644 index 0000000..dcb35a8 --- /dev/null +++ b/service/easy-setup/enrollee/src/easysetup.c @@ -0,0 +1,198 @@ +//****************************************************************** +// +// Copyright 2015 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// 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. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +/** + * @file + * + * This file contains the implementation for EasySetup Enrollee device + */ + +#include "easysetup.h" +#include "softap.h" +#include "onboarding.h" +#include "logger.h" +#include "resourcehandler.h" +#include "easysetupcallbacks.h" + +/** + * @var ES_ENROLLEE_TAG + * @brief Logging tag for module name. + */ +#define ES_ENROLLEE_TAG "ES" + +//----------------------------------------------------------------------------- +// Private variables +//----------------------------------------------------------------------------- + +/** + * @var gTargetSsid + * @brief Target SSID of the Soft Access point to which the device has to connect + */ +static char gTargetSsid[MAXSSIDLEN]; + +/** + * @var gTargetPass + * @brief Password of the target access point to which the device has to connect + */ +static char gTargetPass[MAXNETCREDLEN]; + +/** + * @var gEnrolleeStatusCb + * @brief Fucntion pointer holding the callback for intimation of EasySetup Enrollee status callback + */ +static EventCallback gEnrolleeStatusCb = NULL; + +/** + * @var gIsSecured + * @brief Variable to check if secure mode is enabled or not. + */ +static bool gIsSecured = false; + +void OnboardingCallback(ESResult esResult) +{ + OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "OnboardingCallback with result = %d", esResult); + if(esResult == ES_OK) + { + gEnrolleeStatusCb(esResult, ES_ON_BOARDED_STATE); + } + else + { + OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, + "Onboarding is failed callback result is = %d", esResult); + gEnrolleeStatusCb(esResult, ES_INIT_STATE); + } +} + +void ProvisioningCallback(ESResult esResult) +{ + OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "ProvisioningCallback with result = %d", esResult); + + if (esResult == ES_RECVTRIGGEROFPROVRES) + { + GetTargetNetworkInfoFromProvResource(gTargetSsid, gTargetPass); + gEnrolleeStatusCb(ES_OK, ES_PROVISIONED_STATE); + OIC_LOG(DEBUG, ES_ENROLLEE_TAG, "Connecting with target network"); + + // Connecting/onboarding to target network + ConnectToWiFiNetwork(gTargetSsid, gTargetPass, OnboardingCallbackTargetNet); + } + else + { + OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "Provisioning is failed callback result is = %d", esResult); + // Resetting Enrollee to ONBOARDED_STATE as Enrollee is alreday onboarded in previous step + gEnrolleeStatusCb(ES_OK, ES_ON_BOARDED_STATE); + } +} + +void OnboardingCallbackTargetNet(ESResult esResult) +{ + OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, "OnboardingCallback on target network with result = %d", + esResult); + if(esResult == ES_OK) + { + gEnrolleeStatusCb(esResult, ES_ON_BOARDED_TARGET_NETWORK_STATE); + } + else + { + OIC_LOG_V(DEBUG, ES_ENROLLEE_TAG, + "Onboarding is failed on target network and callback result is = %d", esResult); + // Resetting Enrollee state to the ES_PROVISIONED_STATE + // as device is already being provisioned with target network creds. + gEnrolleeStatusCb(esResult, ES_PROVISIONED_STATE); + } +} + +ESResult InitEasySetup(OCConnectivityType networkType, const char *ssid, const char *passwd, + bool isSecured, + EventCallback cb) +{ + OIC_LOG(INFO, ES_ENROLLEE_TAG, "InitEasySetup IN"); + if(!ValidateParam(networkType,ssid,passwd,cb)) + { + OIC_LOG(ERROR, ES_ENROLLEE_TAG, + "InitEasySetup::Stopping Easy setup due to invalid parameters"); + return ES_ERROR; + } + + //Init callback + gEnrolleeStatusCb = cb; + + gIsSecured = isSecured; + + // TODO : This onboarding state has to be set by lower layer, as they better + // knows when actually on-boarding started. + cb(ES_ERROR,ES_ON_BOARDING_STATE); + + OIC_LOG(INFO, ES_ENROLLEE_TAG, "received callback"); + OIC_LOG(INFO, ES_ENROLLEE_TAG, "onboarding now.."); + + if(!ESOnboard(ssid, passwd, OnboardingCallback)) + { + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "InitEasySetup::On-boarding failed"); + cb(ES_ERROR, ES_INIT_STATE); + return ES_ERROR; + } + + OIC_LOG(INFO, ES_ENROLLEE_TAG, "InitEasySetup OUT"); + return ES_OK; +} + +ESResult TerminateEasySetup() +{ + UnRegisterResourceEventCallBack(); + + //Delete Prov resource + if (DeleteProvisioningResource() != OC_STACK_OK) + { + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "Deleting prov resource error!!"); + return ES_ERROR; + } + + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "TerminateEasySetup success"); + return ES_OK; +} + +ESResult InitProvisioning() +{ + OIC_LOG(INFO, ES_ENROLLEE_TAG, "InitProvisioning <>"); + + if (CreateProvisioningResource(gIsSecured) != OC_STACK_OK) + { + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "CreateProvisioningResource error"); + return ES_ERROR; + } + + RegisterResourceEventCallBack(ProvisioningCallback); + + OIC_LOG(INFO, ES_ENROLLEE_TAG, "InitProvisioning OUT"); + return ES_RESOURCECREATED; +} + +static bool ValidateParam(OCConnectivityType networkType, const char *ssid, const char *passwd, + EventCallback cb) +{ + if (!ssid || !passwd || !cb) + { + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ValidateParam - Invalid parameters"); + return false; + } + return true; +} + diff --git a/service/easy-setup/enrollee/src/easysetupcallbacks.h b/service/easy-setup/enrollee/src/easysetupcallbacks.h new file mode 100644 index 0000000..bf552f0 --- /dev/null +++ b/service/easy-setup/enrollee/src/easysetupcallbacks.h @@ -0,0 +1,69 @@ +//****************************************************************** +// +// Copyright 2016 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// 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. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +/** + * @file + * + * This file contains private internal callback function + * prototypes for Easy setup [Enrollee] + */ + +#ifndef EASYSETUP_ENROLLEE_CALLBACKS_H__ +#define EASYSETUP_ENROLLEE_CALLBACKS_H__ + +#include "escommon.h" + +#ifdef __cplusplus +extern "C" { +#endif // __cplusplus + +//----------------------------------------------------------------------------- +// Private internal callback function prototypes for Easy setup [Enrollee] +//----------------------------------------------------------------------------- + + /* + * Callback for on boarding + */ +void OnboardingCallback(ESResult esResult); + + /* + * Callback for provisioning + */ +void ProvisioningCallback(ESResult SSSS); + + /* + * Callback for on boarding target Network + */ +void OnboardingCallbackTargetNet(ESResult esResult); + + /* + * Function for validating the parameter for InitEasySetup API + */ +static bool ValidateParam(OCConnectivityType networkType, const char *ssid, const char *passwd, + EventCallback cb); + +#ifdef __cplusplus +} +#endif // __cplusplus + + +#endif /* EASYSETUP_ENROLLEE_CALLBACKS_H__ */ + + diff --git a/service/easy-setup/enrollee/src/onboarding.c b/service/easy-setup/enrollee/src/onboarding.c new file mode 100644 index 0000000..42551d7 --- /dev/null +++ b/service/easy-setup/enrollee/src/onboarding.c @@ -0,0 +1,94 @@ +//****************************************************************** +// +// Copyright 2015 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// 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. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +/** + * @file + * + * This file has methods for on-boarding the Enrollee device. + * This will contain template methods that will have core business logic & negotiation algorithm + * on various on-boarding methods. + */ + +#include "easysetup.h" +#include "softap.h" +#include "onboarding.h" + +#include "logger.h" +#include "resourcehandler.h" + +/** + * @var ES_ENROLLEE_TAG + * @brief Logging tag for module name. + */ +#define ES_ENROLLEE_TAG "ES_SOFTAP" + +/** + * It will return true on-boarding type is soft AP + */ +bool ESSoftapOnboarding() +{ + // TODO: To be changed based on user config. Current version, hardcoded to SoftAp onboarding + return true; +} + +/** + * It will return true on-boarding type is BLE + */ +bool ESBleOnboarding() +{ + //BLE onboarding is not supported with current version. + return false; +} + +/** + * It will do onboarding based on the user's configuration. + */ +bool ESOnboard(const char * ssid, const char* passwd, NetworkEventCallback cb) +{ + OIC_LOG(DEBUG, ES_ENROLLEE_TAG, "ESOnboard IN"); + + if (ESSoftapOnboarding()) + { + if (ESSoftapAtEnrollee()) + { + OIC_LOG(DEBUG, ES_ENROLLEE_TAG, "Create SoftAp at enrollee"); + ESCreateSoftap(ssid, passwd, cb); + } + else + { + OIC_LOG(DEBUG, ES_ENROLLEE_TAG, "Connecting to Mediator SoftAp"); + ConnectToWiFiNetwork(ssid, passwd, cb); + } + return true; + } + else if (ESBleOnboarding()) + { + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESOnboard::Ble onboarding is not supported"); + // TODO: + return false; + } + else + { + // TODO: + OIC_LOG(ERROR, ES_ENROLLEE_TAG, "ESOnboard::Invalid onboarding option"); + return false; + } +} + diff --git a/service/easy-setup/enrollee/src/resourcehandler.c b/service/easy-setup/enrollee/src/resourcehandler.c new file mode 100644 index 0000000..8533ea6 --- /dev/null +++ b/service/easy-setup/enrollee/src/resourcehandler.c @@ -0,0 +1,396 @@ +//****************************************************************** +// +// Copyright 2015 Samsung Electronics All Rights Reserved. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +// +// 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 "resourcehandler.h" + +#include + +#include "ocpayload.h" +#include "oic_string.h" + +/** + * @var ES_RH_TAG + * @brief Logging tag for module name. + */ +#define ES_RH_TAG "ES_RH" +//----------------------------------------------------------------------------- +// Private variables +//----------------------------------------------------------------------------- + +/** + * @var gProvResource + * @brief Structure for holding the Provisioning status and target information required to + * connect to the target network + */ +static ProvResource gProvResource; + +/** + * @var gNetResource + * @brief Structure forr holding the Provisioning status of network information + */ +static NetResource gNetResource; + +//----------------------------------------------------------------------------- +// Private internal function prototypes +//----------------------------------------------------------------------------- +OCEntityHandlerResult OCEntityHandlerCb(OCEntityHandlerFlag flag, OCEntityHandlerRequest *ehRequest, + void *callback); +const char *getResult(OCStackResult result); +OCEntityHandlerResult ProcessGetRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload); +OCEntityHandlerResult ProcessPutRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload); +OCEntityHandlerResult ProcessPostRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload); +OCRepPayload* constructResponse(OCEntityHandlerRequest *ehRequest); + +ResourceEventCallback gNetworkInfoProvEventCb = NULL; + +void RegisterResourceEventCallBack(ResourceEventCallback cb) +{ + gNetworkInfoProvEventCb = cb; +} + +void UnRegisterResourceEventCallBack() +{ + if (gNetworkInfoProvEventCb) + { + gNetworkInfoProvEventCb = NULL; + } +} + +void GetTargetNetworkInfoFromProvResource(char *name, char *pass) +{ + if (name != NULL && pass != NULL) + { + OICStrcpy(name, sizeof(name), gProvResource.tnn); + OICStrcpy(pass, sizeof(pass), gProvResource.cd); + } +} + +OCStackResult CreateProvisioningResource(bool isSecured) +{ + gProvResource.ps = ES_PS_NEED_PROVISIONING; + gProvResource.tr = ES_PS_TRIGGER_INIT_VALUE; + + gProvResource.tnt = CT_ADAPTER_IP; + OICStrcpy(gProvResource.tnn, sizeof(gProvResource.tnn), "Unknown"); + OICStrcpy(gProvResource.cd, sizeof(gProvResource.cd), "Unknown"); + + OCStackResult res = OC_STACK_ERROR; + if (isSecured) + { + res = OCCreateResource(&gProvResource.handle, OC_RSRVD_ES_PROV_RES_TYPE, + OC_RSRVD_INTERFACE_DEFAULT, + OC_RSRVD_ES_URI_PROV, OCEntityHandlerCb, + NULL, OC_DISCOVERABLE | OC_OBSERVABLE | OC_SECURE); + } + else + { + res = OCCreateResource(&gProvResource.handle, OC_RSRVD_ES_PROV_RES_TYPE, + OC_RSRVD_INTERFACE_DEFAULT, + OC_RSRVD_ES_URI_PROV, OCEntityHandlerCb, + NULL, OC_DISCOVERABLE | OC_OBSERVABLE); + } + + OIC_LOG_V(INFO, ES_RH_TAG, "Created Prov resource with result: %s", getResult(res)); + return res; +} + +OCStackResult DeleteProvisioningResource() +{ + OCStackResult res = OCDeleteResource(gProvResource.handle); + if (res != OC_STACK_OK) + { + OIC_LOG_V(INFO, ES_RH_TAG, "Deleting Prov resource error with result: %s", getResult(res)); + } + + return res; +} + +OCEntityHandlerResult ProcessGetRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload **payload) +{ + OCEntityHandlerResult ehResult = OC_EH_ERROR; + if (!ehRequest) + { + OIC_LOG(ERROR, ES_RH_TAG, "Request is Null"); + return ehResult; + } + if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) + { + OIC_LOG(ERROR, ES_RH_TAG, "Incoming payload not a representation"); + return ehResult; + } + + OCRepPayload *getResp = constructResponse(ehRequest); + if (!getResp) + { + OIC_LOG(ERROR, ES_RH_TAG, "constructResponse failed"); + return OC_EH_ERROR; + } + + *payload = getResp; + ehResult = OC_EH_OK; + + return ehResult; +} + +OCEntityHandlerResult ProcessPostRequest(OCEntityHandlerRequest *ehRequest, OCRepPayload** payload) +{ + OIC_LOG(INFO, ES_RH_TAG, "ProcessPostRequest enter"); + OCEntityHandlerResult ehResult = OC_EH_ERROR; + if (ehRequest->payload && ehRequest->payload->type != PAYLOAD_TYPE_REPRESENTATION) + { + OIC_LOG(ERROR, ES_RH_TAG, "Incoming payload not a representation"); + return ehResult; + } + + OCRepPayload* input = (OCRepPayload*) (ehRequest->payload); + if (!input) + { + OIC_LOG(ERROR, ES_RH_TAG, "Failed to parse"); + return ehResult; + } + + int64_t tr; + if (OCRepPayloadGetPropInt(input, OC_RSRVD_ES_TR, &tr)) + { + // Triggering + gProvResource.tr = tr; + } + + //ES_PS_PROVISIONING_COMPLETED state indicates that already provisioning is completed. + // A new request for provisioning means overriding existing network provisioning information. + if (gProvResource.ps == ES_PS_PROVISIONING_COMPLETED && tr == ES_PS_TRIGGER_CONNECTION) + { + OIC_LOG(DEBUG, ES_RH_TAG, "Provisioning already completed." + "Tiggering the network connection"); + + if (gNetworkInfoProvEventCb) + { + gNetworkInfoProvEventCb(ES_RECVTRIGGEROFPROVRES); + ehResult = OC_EH_OK; + } + else + { + OIC_LOG(ERROR, ES_RH_TAG, "gNetworkInfoProvEventCb is NULL." + "Network handler not registered. Failed to connect to the network"); + ehResult = OC_EH_ERROR; + } + + return ehResult; + } + else if (gProvResource.ps == ES_PS_PROVISIONING_COMPLETED) + { + OIC_LOG(DEBUG, ES_RH_TAG, "Provisioning already completed. " + "This a request to override the existing the network provisioning information"); + } + else + { + OIC_LOG(DEBUG, ES_RH_TAG, "Provisioning the network information to the Enrollee."); + } + + OICStrcpy(gProvResource.tnn, sizeof(gProvResource.tnn), ""); + OICStrcpy(gProvResource.cd, sizeof(gProvResource.cd), ""); + + char* tnn; + if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_TNN, &tnn)) + { + OICStrcpy(gProvResource.tnn, sizeof(gProvResource.tnn), tnn); + OIC_LOG(INFO, ES_RH_TAG, "got ssid"); + } + + OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.tnn %s", gProvResource.tnn); + + char* cd; + if (OCRepPayloadGetPropString(input, OC_RSRVD_ES_CD, &cd)) + { + OICStrcpy(gProvResource.cd, sizeof(gProvResource.cd), cd); + OIC_LOG(INFO, ES_RH_TAG, "got password"); + }OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.cd %s", gProvResource.cd); + + gProvResource.ps = ES_PS_PROVISIONING_COMPLETED; + + OIC_LOG_V(INFO, ES_RH_TAG, "gProvResource.ps %lld", gProvResource.ps); + + OCRepPayload *getResp = constructResponse(ehRequest); + if (!getResp) + { + OIC_LOG(ERROR, ES_RH_TAG, "constructResponse failed"); + return OC_EH_ERROR; + } + + *payload = getResp; + ehResult = OC_EH_OK; + + return ehResult; +} + +OCEntityHandlerResult ProcessPutRequest(OCEntityHandlerRequest * ehRequest, + OCRepPayload** payload) +{ + OCEntityHandlerResult ehResult = OC_EH_ERROR; + + return ehResult; +} + +OCRepPayload* constructResponse(OCEntityHandlerRequest *ehRequest) +{ + OCRepPayload* payload = OCRepPayloadCreate(); + if (!payload) + { + OIC_LOG(ERROR, ES_RH_TAG, "Failed to allocate Payload"); + return NULL; + } + + if (ehRequest->resource == gProvResource.handle) + { + OIC_LOG(INFO, ES_RH_TAG, "constructResponse prov res"); + OCRepPayloadSetUri(payload, OC_RSRVD_ES_URI_PROV); + OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_PS, gProvResource.ps); + OCRepPayloadSetPropInt(payload, OC_RSRVD_ES_TNT, gProvResource.tnt); + } + else if (ehRequest->requestHandle == gNetResource.handle) + { + + OCRepPayloadSetUri(payload, OC_RSRVD_ES_URI_NET); + OCRepPayloadSetPropInt(payload, "ant", gNetResource.ant[0]); + } + return payload; +} + +/** + * This is the entity handler for the registered resource. + * This is invoked by OCStack whenever it recevies a request for this resource. + */ +OCEntityHandlerResult OCEntityHandlerCb(OCEntityHandlerFlag flag, + OCEntityHandlerRequest* entityHandlerRequest, void *callback) +{ + (void) callback; + OCEntityHandlerResult ehRet = OC_EH_OK; + OCEntityHandlerResponse response = + { 0, 0, OC_EH_ERROR, 0, 0, + { }, + { 0 }, false }; + OCRepPayload* payload = NULL; + + if (entityHandlerRequest && (flag & OC_REQUEST_FLAG)) + { + if (OC_REST_GET == entityHandlerRequest->method) + { + OIC_LOG(INFO, ES_RH_TAG, "Received GET request"); + ehRet = ProcessGetRequest(entityHandlerRequest, &payload); + } + else if (OC_REST_PUT == entityHandlerRequest->method) + { + OIC_LOG(INFO, ES_RH_TAG, "Received PUT request"); + + //PUT request will be handled in the internal implementation + if (gProvResource.handle != NULL + && entityHandlerRequest->resource == gProvResource.handle) + { + ehRet = ProcessPutRequest(entityHandlerRequest, &payload); + } + else + { + OIC_LOG(ERROR, ES_RH_TAG, "Cannot process put"); + ehRet = OC_EH_ERROR; + } + } + else if (OC_REST_POST == entityHandlerRequest->method) + { + OIC_LOG(INFO, ES_RH_TAG, "Received OC_REST_POST from client"); + if (gProvResource.handle != NULL + && entityHandlerRequest->resource == gProvResource.handle) + { + ehRet = ProcessPostRequest(entityHandlerRequest, &payload); + } + else + { + OIC_LOG(ERROR, ES_RH_TAG, "Cannot process put"); + ehRet = OC_EH_ERROR; + } + } + + if (ehRet == OC_EH_OK) + { + // Format the response. Note this requires some info about the request + response.requestHandle = entityHandlerRequest->requestHandle; + response.resourceHandle = entityHandlerRequest->resource; + response.ehResult = ehRet; + //response uses OCPaylod while all get,put methodes use OCRepPayload + response.payload = (OCPayload*) (payload); + response.numSendVendorSpecificHeaderOptions = 0; + memset(response.sendVendorSpecificHeaderOptions, 0, + sizeof(response.sendVendorSpecificHeaderOptions)); + memset(response.resourceUri, 0, sizeof(response.resourceUri)); + // Indicate that response is NOT in a persistent buffer + response.persistentBufferFlag = 0; + + // Send the response + if (OCDoResponse(&response) != OC_STACK_OK) + { + OIC_LOG(ERROR, ES_RH_TAG, "Error sending response"); + ehRet = OC_EH_ERROR; + } + } + } + + return ehRet; +} + +const char *getResult(OCStackResult result) +{ + switch (result) + { + case OC_STACK_OK: + return "OC_STACK_OK"; + case OC_STACK_INVALID_URI: + return "OC_STACK_INVALID_URI"; + case OC_STACK_INVALID_QUERY: + return "OC_STACK_INVALID_QUERY"; + case OC_STACK_INVALID_IP: + return "OC_STACK_INVALID_IP"; + case OC_STACK_INVALID_PORT: + return "OC_STACK_INVALID_PORT"; + case OC_STACK_INVALID_CALLBACK: + return "OC_STACK_INVALID_CALLBACK"; + case OC_STACK_INVALID_METHOD: + return "OC_STACK_INVALID_METHOD"; + case OC_STACK_NO_MEMORY: + return "OC_STACK_NO_MEMORY"; + case OC_STACK_COMM_ERROR: + return "OC_STACK_COMM_ERROR"; + case OC_STACK_INVALID_PARAM: + return "OC_STACK_INVALID_PARAM"; + case OC_STACK_NOTIMPL: + return "OC_STACK_NOTIMPL"; + case OC_STACK_NO_RESOURCE: + return "OC_STACK_NO_RESOURCE"; + case OC_STACK_RESOURCE_ERROR: + return "OC_STACK_RESOURCE_ERROR"; + case OC_STACK_SLOW_RESOURCE: + return "OC_STACK_SLOW_RESOURCE"; + case OC_STACK_NO_OBSERVERS: + return "OC_STACK_NO_OBSERVERS"; + case OC_STACK_ERROR: + return "OC_STACK_ERROR"; + default: + return "UNKNOWN"; + } +} + diff --git a/service/easy-setup/enrollee/src/resourcehandler.h b/service/easy-setup/enrollee/src/resourcehandler.h index 243f8f2..5afa812 100644 --- a/service/easy-setup/enrollee/src/resourcehandler.h +++ b/service/easy-setup/enrollee/src/resourcehandler.h @@ -30,6 +30,10 @@ #ifndef ES_RESOURCE_HANDLER_H_ #define ES_RESOURCE_HANDLER_H_ +#ifdef __cplusplus +extern "C" { +#endif + typedef void (*ResourceEventCallback)(ESResult); /* Structure to represent a Light resource */ @@ -60,4 +64,8 @@ void GetTargetNetworkInfoFromProvResource(char *, char *); void RegisterResourceEventCallBack(ResourceEventCallback); void UnRegisterResourceEventCallBack(void); +#ifdef __cplusplus +} #endif + +#endif //ES_RESOURCE_HANDLER_H_ \ No newline at end of file diff --git a/service/easy-setup/enrollee/src/softap.c b/service/easy-setup/enrollee/src/softap.c new file mode 100644 index 0000000..8784350 --- /dev/null +++ b/service/easy-setup/enrollee/src/softap.c @@ -0,0 +1,89 @@ +// 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. +// +//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + +/** + * These are adapter APIs will make caller modules agnostic to platform. + */ + +#include "softapnative.h" +#include "easysetup.h" +#include "softap.h" +#include "networkhandler.h" + +void ESCreateSoftapCallback(int result, const char *ip, const char* mac_addr, + const char* device_name ); + +NetworkEventCallback gCallback; + +/** + * It will return Device which is creating Soft AP. + * i.e.Enrollee or Mediator. + * This decesion is based on, what is the value set for ES_SOFTAP_MODE in build command as well as + * in iotivity.spec file. + */ +DeviceRole ESSoftapHost() +{ +#ifdef ENROLLEE_SOFTAP + //SoftAp at enrollee + return ENROLLEE; +#else + //SoftAp at mediator + return MEDIATOR; +#endif +} + +/** + * It will return true if the Soft AP is created at Enrollee device + */ +bool ESSoftapAtEnrollee() +{ + return ( ESSoftapHost() == ENROLLEE) ? true : false; +} + +/** + * It will return true if the Soft AP is created at Mediator device + */ +bool ESSoftapAtMediator() +{ + return (ESSoftapHost() == MEDIATOR) ? true : false; +} + +/** + * This API will map result returned from the native to the caller. + * Callback API's signature needs to be modified under build switch according + * to the underline platform. + */ +void ESCreateSoftapCallback(int result, const char *ip, const char* mac_addr, + const char* device_name) +{ + if(SOFTAP_SUCCESS == result) //on Success + { + gCallback(ES_OK); + } + else //on Failure + { + gCallback(ES_ERROR); + } +} + +/** + * This API will create the softap at enrollee + */ +void ESCreateSoftap(const char * ssid, const char* passwd, NetworkEventCallback cb) +{ + gCallback = cb; + + // TODO: To be implemented + // Create Soft AP through native APIs -- start + // native API call by and pass ESCreateSoftapCallback() as callback + ESCreateSoftapNative(ssid, passwd,ESCreateSoftapCallback); + // Create Soft AP through native APIs -- end +} + diff --git a/service/easy-setup/enrollee/src/softap.h b/service/easy-setup/enrollee/src/softap.h index 3ae3c51..f0bc68f 100644 --- a/service/easy-setup/enrollee/src/softap.h +++ b/service/easy-setup/enrollee/src/softap.h @@ -25,6 +25,10 @@ #include "escommon.h" #include "networkhandler.h" +#ifdef __cplusplus +extern "C" { +#endif + /** * @file * @@ -68,10 +72,9 @@ DeviceRole ESSoftapHost(); void ESCreateSoftap(const char * ssid, const char* passwd, NetworkEventCallback cb); -//#ifdef __cplusplus -//} -//#endif // __cplusplus - +#ifdef __cplusplus +} +#endif #endif /* EASYSETUP_ENROLLEE_SOFTAP_H__ */ diff --git a/service/easy-setup/enrollee/tizen/wifi/networkhandler.cpp b/service/easy-setup/enrollee/tizen/wifi/networkhandler.c similarity index 100% rename from service/easy-setup/enrollee/tizen/wifi/networkhandler.cpp rename to service/easy-setup/enrollee/tizen/wifi/networkhandler.c diff --git a/service/easy-setup/enrollee/linux/wifi/softapnative.cpp b/service/easy-setup/enrollee/tizen/wifi/softapnative.c similarity index 100% rename from service/easy-setup/enrollee/linux/wifi/softapnative.cpp rename to service/easy-setup/enrollee/tizen/wifi/softapnative.c diff --git a/service/easy-setup/enrollee/unittests/enrolleetests.cpp b/service/easy-setup/enrollee/unittests/enrolleetests.cpp index 6f55811..5e9c42e 100644 --- a/service/easy-setup/enrollee/unittests/enrolleetests.cpp +++ b/service/easy-setup/enrollee/unittests/enrolleetests.cpp @@ -49,6 +49,7 @@ #include "onboarding.h" #include "resourcehandler.h" #include "softap.h" +#include "easysetupcallbacks.h" #include "gtesthelper.h" @@ -66,8 +67,6 @@ static const char TAG[] = "TestHarness"; char ssid[] = "EasySetup123"; char passwd[] = "EasySetup123"; -void OnboardingCallback(ESResult esResult); - //----------------------------------------------------------------------------- // Callback functions //----------------------------------------------------------------------------- diff --git a/service/easy-setup/inc/escommon.h b/service/easy-setup/inc/escommon.h index ea1a650..d1eee47 100755 --- a/service/easy-setup/inc/escommon.h +++ b/service/easy-setup/inc/escommon.h @@ -21,17 +21,9 @@ #ifndef ES_COMMON_H_ #define ES_COMMON_H_ -#include -#include -#ifndef WITH_ARDUINO -#include -#endif - #include "ocstack.h" #include "octypes.h" -using namespace std; - // Defines #define OIC_STRING_MAX_VALUE 100 #define IPV4_ADDR_SIZE 16 diff --git a/service/easy-setup/sampleapp/enrollee/linux/SConscript b/service/easy-setup/sampleapp/enrollee/linux/SConscript index 6ae239c..6fb0f68 100644 --- a/service/easy-setup/sampleapp/enrollee/linux/SConscript +++ b/service/easy-setup/sampleapp/enrollee/linux/SConscript @@ -59,7 +59,7 @@ enrollee_env.PrependUnique(LIBS = ['oc', 'octbstack', 'oc_logger', 'ocsrm', 'pth if enrollee_env.get('SECURED') == '1': enrollee_env.PrependUnique(LIBS = ['ocpmapi', 'ocprovision']) -enrollee = enrollee_env.Program('enrollee', 'enrolleewifi.cpp') +enrollee = enrollee_env.Program('enrollee', 'enrolleewifi.c') i_enrollee = enrollee_env.Install(env.get('BUILD_DIR'), enrollee) diff --git a/service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.cpp b/service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c old mode 100755 new mode 100644 similarity index 54% rename from service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.cpp rename to service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c index fac4c5d..33ad05d --- a/service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.cpp +++ b/service/easy-setup/sampleapp/enrollee/linux/enrolleewifi.c @@ -23,14 +23,12 @@ #include #include -#include +#include #include #define TAG "TS" -using namespace std; - -void *listeningFunc(void*); +void *listeningFunc(void *); /** * @var ssid @@ -62,41 +60,41 @@ static bool gIsSecured = false; void PrintMenu() { - cout<<"============"<>option; - switch (option) - { - case 'H': // help - case 'h': - PrintMenu(); - break; - - case 'Q': // quit - case 'q': - cout<<"quit"; - break; - - case 'S': // Enable Security - case 's': - EnableSecurity(); - break; - - case 'I': // Init EasySetup - case 'i': - StartEasySetup(); - break; - - case 'P': // start provisioning - case 'p': - StartOICStackAndStartResources(); - break; - - case 'T': // stop easy setup - case 't': - StopEasySetup(); - break; - - default: - cout<<"wrong option"<