//
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-#include<iostream>
+#include <iostream>
+#include <functional>
+
#include "mutex"
#include "condition_variable"
#include "RCSRemoteResourceObject.h"
#include "RCSResourceAttributes.h"
#include "RCSAddress.h"
-
#include "OCPlatform.h"
using namespace OC;
constexpr int INCORRECT_INPUT = 2;
constexpr int QUIT_INPUT = 3;
+constexpr int REQUEST_TEMP = 1;
+constexpr int REQUEST_LIGHT = 2;
+
+std::unique_ptr<RCSDiscoveryTask> discoveryTask = nullptr;
std::shared_ptr<RCSRemoteResourceObject> resource;
-const std::string defaultKey = "Temperature";
-const std::string resourceType = "core.TemperatureSensor";
-const std::string relativetUri = OC_RSRVD_WELL_KNOWN_URI;
+std::string defaultKey = "Temperature";
+const std::string relativeUri = OC_RSRVD_WELL_KNOWN_URI;
+const std::string multicastAdd = "multi";
std::mutex mtx;
std::condition_variable cond;
void getCachedAttributes();
void getCachedAttribute();
void stopCaching();
+void discoverResource();
+void cancelDiscovery();
+int processUserInput();
enum Menu
{
GET_CACHED_ATTRIBUTES,
GET_CACHED_ATTRIBUTE,
STOP_CACHING,
+ DISCOVERY_RESOURCE,
+ CANCEL_DISCOVERY,
QUIT,
END_OF_MENU
};
{Menu::GET_CACHED_ATTRIBUTES, getCachedAttributes, CORRECT_INPUT},
{Menu::GET_CACHED_ATTRIBUTE, getCachedAttribute, CORRECT_INPUT},
{Menu::STOP_CACHING, stopCaching, CORRECT_INPUT},
+ {Menu::DISCOVERY_RESOURCE, discoverResource, CORRECT_INPUT},
+ {Menu::CANCEL_DISCOVERY, cancelDiscovery, CORRECT_INPUT},
{Menu::QUIT, [](){}, QUIT_INPUT},
{Menu::END_OF_MENU, nullptr, INCORRECT_INPUT}
};
-void onResourceDiscovered(std::shared_ptr<RCSRemoteResourceObject> foundResource)
+void onResourceDiscovered(std::shared_ptr<RCSRemoteResourceObject> discoveredResource)
{
- std::cout << "onResourceDiscovered callback" << std::endl;
-
- std::string resourceURI = foundResource->getUri();
- std::string hostAddress = foundResource->getAddress();
+ std::cout << "onResourceDiscovered callback :: " << std::endl;
+ std::string resourceURI = discoveredResource->getUri();
+ std::string hostAddress = discoveredResource->getAddress();
- std::cout << "\t\tResource URI : " << resourceURI << std::endl;
- std::cout << "\t\tResource Host : " << hostAddress << std::endl;
+ std::cout << resourceURI << std::endl;
+ std::cout << hostAddress << std::endl;
- resource = foundResource;
-
- cond.notify_all();
+ resource = discoveredResource;
}
void onResourceStateChanged(const ResourceState& resourceState)
std::cout << "8 :: Get Cached Attributes" << std::endl;
std::cout << "9 :: Get Cached Attribute" << std::endl;
std::cout << "10 :: Stop Caching" << std::endl;
- std::cout << "11 :: Stop Server" << std::endl;
+ std::cout << "11 :: Discover Resource" << std::endl;
+ std::cout << "12 :: Cancel Discovery" << std::endl;
+ std::cout << "13 :: Stop Server" << std::endl;
}
int processUserInput()
OCPlatform::Configure(config);
}
-bool discoverResource()
+void discoverResource()
{
- std::cout << "Wait 2 seconds until discovered." << std::endl;
+ std::string resourceType;
- RCSDiscoveryManager::getInstance()->discoverResourceByType(RCSAddress::multicast(),
- relativetUri, resourceType, &onResourceDiscovered);
+ std::cout << "========================================================" << std::endl;
+ std::cout << "1. Temperature Resource Discovery" << std::endl;
+ std::cout << "2. Light Resource Discovery" << std::endl;
+ std::cout << "========================================================" << std::endl;
- std::unique_lock<std::mutex> lck(mtx);
- cond.wait_for(lck,std::chrono::seconds(2));
+ switch (processUserInput())
+ {
+ case REQUEST_TEMP:
+ resourceType = "core.TemperatureSensor";
+ break;
+ case REQUEST_LIGHT:
+ resourceType = "core.light";
+ defaultKey = "Light";
+ break;
+ default :
+ std::cout << "Invalid input, please try again" << std::endl;
+ return;
+ }
+
+ std::string addressInput;
+ std::cout << "========================================================" << std::endl;
+ std::cout << "Please input address" << std::endl;
+ std::cout << "(want to use multicast -> please input 'multi')" << std::endl;
+ std::cout << "========================================================" << std::endl;
+
+ std::cin >> addressInput;
+
+ if(addressInput == multicastAdd)
+ {
+ discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByType(RCSAddress::multicast(),
+ relativeUri, resourceType, &onResourceDiscovered);
+ }
+ else
+ {
+ discoveryTask = RCSDiscoveryManager::getInstance()->discoverResourceByType(RCSAddress::unicast
+ (addressInput), relativeUri, resourceType, &onResourceDiscovered);
+ }
+}
- return resource != nullptr;
+void cancelDiscovery()
+{
+ if(!discoveryTask)
+ {
+ std::cout << "There isn't discovery request..." << std::endl;
+ return;
+ }
+ discoveryTask->cancel();
}
int main()
{
platFormConfigure();
- if (!discoverResource())
- {
- std::cout << "Can't discovered Server... Exiting the Client." << std::endl;
- return -1;
- }
-
try
{
process();
return 0;
}
-
constexpr int DEFALUT_VALUE = 0;
+constexpr int REQUEST_TEMP = 1;
+constexpr int REQUEST_LIGHT = 2;
+
+constexpr int PRESENCE_ON = 1;
+constexpr int PRESENCE_OFF = 2;
+
constexpr int DEFALUT_SERVER = 1;
constexpr int CUSTOM_SERVER = 2;
constexpr int STOP = 3;
constexpr int INCREASE_TEMPERATURE = 1;
constexpr int DECREASE_TEMPERATURE = 2;
-constexpr int STOP_SENSOR = 3;
+constexpr int STOP_TEMPERATURE_SENSOR = 3;
+constexpr int STOP_LIGHT_SENSOR = 1;
constexpr int CORRECT_INPUT = 1;
constexpr int INCORRECT_INPUT = 2;
constexpr int QUIT = 3;
+
std::string resourceUri = "/a/TempSensor";
std::string resourceType = "core.TemperatureSensor";
std::string resourceInterface = "oic.if.";
std::string attributeKey = "Temperature";
+int isPresenceOn = PRESENCE_ON;
RCSResourceObject::Ptr server;
+int processUserInput();
+
enum class Control{
INCREASE,
DECREASE
std::cout << "========================================================" << std::endl;
}
+void displayControlLightMenu()
+{
+ std::cout << "========================================================" << std::endl;
+ std::cout << "1. Stop the Sensor" << std::endl;
+ std::cout << "========================================================" << std::endl;
+}
+
void printAttribute(const RCSResourceAttributes& attrs)
{
for(const auto& attr : attrs)
RCSResourceAttributes& attrs)
{
std::cout << "Recieved a Get request from Client" << std::endl;
-
RCSResourceObject::LockGuard lock(*server);
RCSResourceAttributes attributes = server->getAttributes();
void createResource()
{
- server = RCSResourceObject::Builder(resourceUri, resourceType,
- resourceInterface).setDiscoverable(true).setObservable(true).build();
+ server = RCSResourceObject::Builder(resourceUri, resourceType,resourceInterface).
+ setDiscoverable(true).setObservable(true).build();
}
void initServer()
{
+ std::cout << "========================================================" << std::endl;
+ std::cout << "Select Resource Type" << std::endl;
+ std::cout << "1. Temperature" << std::endl;
+ std::cout << "2. Light" << std::endl;
+ std::cout << "========================================================" << std::endl;
+
+ switch(processUserInput())
+ {
+ case REQUEST_TEMP:
+ resourceUri = "/a/TempSensor";
+ resourceType = "core.TemperatureSensor";
+ break;
+ case REQUEST_LIGHT:
+ resourceUri = "/a/light";
+ resourceType = "core.light";
+ break;
+ default :
+ std::cout << "Invalid input, please try again" << std::endl;
+ return;
+ }
+
try
{
createResource();
return userInput;
}
+int selectPresenceMenu()
+{
+ std::cout << "========================================================" << std::endl;
+ std::cout << "1. Presence On" << std::endl;
+ std::cout << "2. Presence Off" << std::endl;
+ std::cout << "========================================================" << std::endl;
+
+ switch(processUserInput())
+ {
+ case PRESENCE_ON:
+ isPresenceOn = PRESENCE_ON;
+ startPresence(3);
+ return CORRECT_INPUT;
+ case PRESENCE_OFF:
+ isPresenceOn = PRESENCE_OFF;
+ return CORRECT_INPUT;
+ default :
+ std::cout << "Invalid input, please try again" << std::endl;
+ return INCORRECT_INPUT;
+ }
+}
int selectServerMenu()
{
switch (processUserInput())
changeTemperature(Control::DECREASE);
return CORRECT_INPUT;
- case STOP_SENSOR:
+ case STOP_TEMPERATURE_SENSOR:
+ return QUIT;
+
+ default:
+ std::cout << "Invalid input. Please try again." << std::endl;
+ return INCORRECT_INPUT;
+ }
+}
+
+int selectControlLightMenu()
+{
+ switch (processUserInput())
+ {
+ case STOP_LIGHT_SENSOR:
return QUIT;
default:
{
while(true)
{
- displayMenu();
+ int ret = selectPresenceMenu();
+ if(ret == CORRECT_INPUT) break;
+ }
+ while(true)
+ {
+ displayMenu();
int ret = selectServerMenu();
if(ret == QUIT) return;
while(true)
{
- displayControlTemperatureMenu();
-
- if (selectControlTemperatureMenu() == QUIT) return;
+ if(resourceType == "core.TemperatureSensor")
+ {
+ displayControlTemperatureMenu();
+ if (selectControlTemperatureMenu() == QUIT) return;
+ }
+ else if(resourceType == "core.light")
+ {
+ displayControlLightMenu();
+ if (selectControlLightMenu() == QUIT) return;
+ }
}
}
int main(void)
{
- startPresence(3);
-
try
{
process();
std::cout << "main exception : " << e.what() << std::endl;
}
+ if(isPresenceOn == PRESENCE_ON)
+ {
+ stopPresence();
+ }
std::cout << "Stopping the Server" << std::endl;
}
-
-