//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
#include <iostream>
-#include<stdio.h>
+#include <condition_variable>
-#include "oic_string.h"
-#include "EasySetup.h"
#include "OCPlatform.h"
-#include "logger.h"
+#include "OCApi.h"
#include "OCProvisioningManager.h"
+#include "EasySetup.h"
+#include "ESRichCommon.h"
#define ES_SAMPLE_APP_TAG "ES_SAMPLE_APP_TAG"
#define DECLARE_MENU(FUNC, ...) { #FUNC, FUNC }
using namespace OC;
using namespace OIC::Service;
-static EasySetup *easySetupIntance = nullptr;
-static ProvConfig netInfo;
-static WiFiOnboadingConnection onboardingConn;
-static RemoteEnrollee::shared_ptr remoteEnrollee = nullptr;
+static std::shared_ptr<RemoteEnrollee> remoteEnrollee = nullptr;
+static std::shared_ptr<OC::OCResource> curResource = nullptr;
-static std::string ipaddress, ssid, pwd;
-char security;
+static std::mutex g_discoverymtx;
+static std::condition_variable g_cond;
-struct CloseApp
-{
-};
+#define PROV_RESOURCE_TYPE "ocf.wk.prov"
typedef void (*Runner)();
Runner g_currentRun;
-int processUserInput(int min, int max)
+int processUserInput(int min = std::numeric_limits<int>::min(),
+ int max = std::numeric_limits<int>::max())
{
assert(min <= max);
int input;
std::cin >> input;
+ std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
- if (!std::cin.fail())
- {
- if(input == max + 1) throw CloseApp();
- if(min <= input && input <= max) return input;
- }
+ if (!std::cin.fail() && min <= input && input <= max) return input;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
throw std::runtime_error("Invalid Input, please try again");
}
-void easySetupStatusCallback (std::shared_ptr< EasySetupStatus > easySetupStatus)
+void printConfiguration(EnrolleeConf conf)
+{
+ cout << "===========================================" << endl;
+ cout << "\tDevice Name : " << conf.getDeviceName() << endl;
+
+ for(auto it : conf.getWiFiModes())
+ {
+ cout << "\tSupported WiFi modes : " << it << endl;
+ }
+
+ cout << "\tSupported WiFi freq : " << static_cast<int>(conf.getWiFiFreq()) << endl;
+ cout << "\tCloud accessibility: " << conf.isCloudAccessible() << endl;
+ cout << "===========================================" << endl;
+}
+
+void printStatus(EnrolleeStatus status)
+{
+ cout << "===========================================" << endl;
+ cout << "\tProvStatus : " << status.getProvStatus() << endl;
+ cout << "\tLastErrCode : " << status.getLastErrCode() << endl;
+ cout << "===========================================" << endl;
+}
+
+void provisionSecurityStatusCallback(std::shared_ptr<SecProvisioningStatus> secProvisioningStatus)
+{
+ if(secProvisioningStatus->getESResult() != ES_OK)
+ {
+ cout << "provisionSecurity is failed." << endl;
+ return;
+ }
+ else
+ {
+ cout << "provisionSecurity is success." << endl;
+ cout << "uuid : " << secProvisioningStatus->getDeviceUUID()<< endl;
+ }
+}
+
+void provisionSecurity()
{
- OIC_LOG_V(DEBUG, ES_SAMPLE_APP_TAG, "easySetupStatusCallback status is Status = %d",
- easySetupStatus->getEasySetupState());
+ remoteEnrollee->provisionSecurity(provisionSecurityStatusCallback);
+}
+void getStatusCallback(std::shared_ptr< GetEnrolleeStatus > getEnrolleeStatus)
+{
+ if(getEnrolleeStatus->getESResult() != ES_OK)
+ {
+ cout << "getStatus is failed." << endl;
+ return;
+ }
+ else
+ {
+ cout << "getStatus is success." << endl;
+ printStatus(getEnrolleeStatus->getEnrolleeStatus());
+ }
}
-void startProvisioning()
+
+void getStatus()
{
+ if(!remoteEnrollee)
+ return;
+
try
{
- remoteEnrollee->startProvisioning();
+ remoteEnrollee->getStatus(getStatusCallback);
}
- catch(OCException &exception)
+ catch (OCException &e)
{
- std::cout << "Exception : " << exception.reason();
+ std::cout << "Exception during getConfiguration call" << e.reason();
+ return;
}
}
-void initEasySetup()
+void getConfigurationCallback(std::shared_ptr< GetConfigurationStatus > getConfigurationStatus)
{
+ if(getConfigurationStatus->getESResult() != ES_OK)
+ {
+ cout << "GetConfigurationStatus is failed." << endl;
+ return;
+ }
+ else
+ {
+ cout << "GetConfigurationStatus is success." << endl;
+ printConfiguration(getConfigurationStatus->getEnrolleeConf());
+ }
+}
- easySetupIntance = EasySetup::getInstance();
+void getConfiguration()
+{
+ if(!remoteEnrollee)
+ return;
- cout<<"\n Enter the IP address : ";
- cin>>ipaddress;
- cout<<"\n Enter the Target Network SSID : ";
- cin>>ssid;
- cout<<"\n Enter the Target Network Password : ";
- cin>>pwd;
- cout<<"\n Enable Security: [Y/N] ";
- cin>>security;
+ try
+ {
+ remoteEnrollee->getConfiguration(getConfigurationCallback);
+ }
+ catch (OCException &e)
+ {
+ std::cout << "Exception during getConfiguration call" << e.reason();
+ return;
+ }
+}
- if ( ipaddress.size() == 0 || ssid.size() == 0 || pwd.size()==0 )
+void deviceProvisioningStatusCallback(std::shared_ptr< DevicePropProvisioningStatus > provStatus)
+{
+ if(provStatus->getESResult() != ES_OK)
{
- cout<<"\n Invalid information try again !!!";
+ cout << "Device Provisioning is failed." << endl;
+ return;
}
else
- {
- cout <<"\n Entered details are : \n";
- cout<<"\n IP address : "<<ipaddress;
- cout<<"\n Target Network SSID : "<<ssid;
- cout<<"\n Target Network Password : "<<pwd;
+ {
+ cout << "Device Provisioning is success." << endl;
+ }
+}
- if (security == 'Y' || security == 'y' )
- {
- onboardingConn.isSecured = true;
- cout<<"\n Security is Enabled\n\n\n";
- }
- else
- {
- onboardingConn.isSecured = false;
- cout<<"\n Security is not Enabled\n\n\n";
- }
+void provisionDeviceProperty()
+{
+ if(!remoteEnrollee)
+ return;
- netInfo.connType = CT_ADAPTER_IP;
+ DeviceProp devProp;
+ devProp.setWiFiProp("Iotivity_SSID", "Iotivity_PWD", WPA2_PSK, TKIP_AES);
+ devProp.setDevConfProp("korean", "Korea");
- OICStrcpy(netInfo.provData.WIFI.ssid, NET_WIFI_SSID_SIZE - 1, ssid.c_str());
- OICStrcpy(netInfo.provData.WIFI.pwd, NET_WIFI_PWD_SIZE - 1, pwd.c_str());
+ try
+ {
+ //remoteEnrollee->provisionDeviceProperties(deviceProp, deviceProvisioningStatusCallback);
+ remoteEnrollee->provisionDeviceProperties(devProp, deviceProvisioningStatusCallback);
+ }
+ catch (OCException &e)
+ {
+ std::cout << "Exception during provisionDeviceProperties call" << e.reason();
+ return;
+ }
+}
- OICStrcpy(onboardingConn.ipAddress, IPV4_ADDR_SIZE - 1, ipaddress.c_str());
+void cloudProvisioningStatusCallback(std::shared_ptr< CloudPropProvisioningStatus > provStatus)
+{
+ switch (provStatus->getESCloudState())
+ {
+ case ES_CLOUD_PROVISIONING_ERROR:
+ cout << "Cloud Provisioning is failed." << endl;
+ break;
+ case ES_CLOUD_PROVISIONING_SUCCESS:
+ cout << "Cloud Provisioning is success." << endl;
+ break;
+ case ES_CLOUD_ENROLLEE_FOUND:
+ cout << "Enrollee is found in a given network." << endl;
+ break;
+ case ES_CLOUD_ENROLLEE_NOT_FOUND:
+ cout << "Enrollee is not found in a given network." << endl;
+ break;
+ }
+}
+
+void provisionCloudProperty()
+{
+ if(!remoteEnrollee)
+ return;
- try
- {
- remoteEnrollee = easySetupIntance->createEnrolleeDevice(netInfo,onboardingConn);
- }
- catch (OCException &e)
- {
- std::cout << "Exception during createEnrolleeDevice call" << e.reason();
- return;
- }
+ CloudProp cloudProp;
+ cloudProp.setCloudProp("authCode", "authProvider", "ciServer");
+ cloudProp.setCloudID("f002ae8b-c42c-40d3-8b8d-1927c17bd1b3");
- remoteEnrollee->registerEasySetupStatusHandler(&easySetupStatusCallback);
+ try
+ {
+ remoteEnrollee->provisionCloudProperties(cloudProp, cloudProvisioningStatusCallback);
+ }
+ catch (OCException &e)
+ {
+ std::cout << "Exception during provisionCloudProperties call" << e.reason();
+ return;
}
}
-void runEasySetupMenu()
+void DisplayMenu()
{
- constexpr int EASY_SETUP_INIT = 1;
- constexpr int START_PROVISIONING = 2;
- constexpr int STOP_PROVISIONING = 3;
- constexpr int STOP_EASY_SETUP = 4;
+ constexpr int PROVISION_SECURITY = 1;
+ constexpr int GET_STATUS = 2;
+ constexpr int GET_CONFIGURATION = 3;
+ constexpr int PROVISION_DEVICE_PROPERTY = 4;
+ constexpr int PROVISION_CLOUD_PROPERTY = 5;
std::cout << "========================================================\n";
- std::cout << EASY_SETUP_INIT << ". Easy Setup Init \n";
- std::cout << START_PROVISIONING << ". Start Provisioning \n";
- std::cout << STOP_PROVISIONING << ". Stop Provisioning \n";
- std::cout << STOP_EASY_SETUP << ". Stop Easy Setup \n";
- std::cout << STOP_EASY_SETUP + 1 << ". Quit \n";
+ std::cout << PROVISION_SECURITY << ". Provision Security to Enrollee \n";
+ std::cout << GET_STATUS << ". Get Status from Enrollee \n";
+ std::cout << GET_CONFIGURATION << ". Get Configuration from Enrollee \n";
+ std::cout << PROVISION_DEVICE_PROPERTY << ". Provision Device Property\n";
+ std::cout << PROVISION_CLOUD_PROPERTY << ". Provision Cloud Property \n";
std::cout << "========================================================\n";
- int selection = processUserInput(EASY_SETUP_INIT, STOP_EASY_SETUP);
+ int selection = processUserInput(PROVISION_SECURITY, PROVISION_CLOUD_PROPERTY);
switch (selection)
{
- case EASY_SETUP_INIT:
- initEasySetup();
+ case PROVISION_SECURITY:
+ provisionSecurity();
+ break;
+ case GET_STATUS:
+ getStatus();
break;
- case START_PROVISIONING:
- startProvisioning();
+ case GET_CONFIGURATION:
+ getConfiguration();
break;
- case STOP_PROVISIONING:
- //stopProvisioning();
+ case PROVISION_DEVICE_PROPERTY:
+ provisionDeviceProperty();
break;
- case STOP_EASY_SETUP:
- //stopEasySetup();
+ case PROVISION_CLOUD_PROPERTY:
+ provisionCloudProperty();
break;
default:
break;
};
}
+// Callback to found resources
+void foundResource(std::shared_ptr<OC::OCResource> resource)
+{
+ std::string resourceURI;
+ std::string hostAddress;
+ try
+ {
+ // Do some operations with resource object.
+ if(resource &&
+ !curResource &&
+ resource->getResourceTypes().at(0) == PROV_RESOURCE_TYPE)
+ {
+ std::cout<<"DISCOVERED Resource:"<<std::endl;
+ // Get the resource URI
+ resourceURI = resource->uri();
+ std::cout << "\tURI of the resource: " << resourceURI << std::endl;
+
+ // Get the resource host address
+ hostAddress = resource->host();
+ std::cout << "\tHost address of the resource: " << hostAddress << std::endl;
+
+ // Get the resource types
+ std::cout << "\tList of resource types: " << std::endl;
+ for(auto &resourceTypes : resource->getResourceTypes())
+ {
+ std::cout << "\t\t" << resourceTypes << std::endl;
+ }
+
+ // Get the resource interfaces
+ std::cout << "\tList of resource interfaces: " << std::endl;
+ for(auto &resourceInterfaces : resource->getResourceInterfaces())
+ {
+ std::cout << "\t\t" << resourceInterfaces << std::endl;
+ }
+
+ if(curResource == nullptr)
+ {
+ remoteEnrollee = EasySetup::getInstance()->createRemoteEnrollee(resource);
+ if(!remoteEnrollee)
+ {
+ std::cout << "RemoteEnrollee object is failed for some reasons!" << std::endl;
+ }
+ else
+ {
+ curResource = resource;
+ std::cout << "RemoteEnrollee object is successfully created!" << std::endl;
+ g_cond.notify_all();
+ }
+ }
+ }
+ }
+ catch(std::exception& e)
+ {
+ std::cerr << "Exception in foundResource: "<< e.what() << std::endl;
+ }
+}
+
static FILE* client_open(const char *UNUSED_PARAM, const char *mode)
{
(void)UNUSED_PARAM;
int main()
{
+ std::ostringstream requestURI;
OCPersistentStorage ps {client_open, fread, fwrite, fclose, unlink };
PlatformConfig config
}
#endif
- g_currentRun = runEasySetupMenu;
+ try
+ {
+ requestURI << OC_RSRVD_WELL_KNOWN_URI << "?rt=" << PROV_RESOURCE_TYPE;
+
+ OCPlatform::findResource("", requestURI.str(), CT_DEFAULT, &foundResource);
+ std::cout<< "Finding Resource... " <<std::endl;
+
+ std::unique_lock<std::mutex> lck(g_discoverymtx);
+ g_cond.wait_for(lck, std::chrono::seconds(4));
+
+ }catch(OCException& e)
+ {
+ oclog() << "Exception in main: "<<e.what();
+ }
while (true)
{
try
{
- g_currentRun();
+ DisplayMenu();
}
catch (const std::exception& e)
{
std::cout << "Exception caught in main " << e.what() << std::endl;
}
- catch (const CloseApp&)
- {
- break;
- }
}
std::cout << "Stopping the client" << std::endl;