1 //******************************************************************
3 // Copyright 2016 Samsung Electronics All Rights Reserved.
5 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
7 // Licensed under the Apache License, Version 2.0 (the "License");
8 // you may not use this file except in compliance with the License.
9 // You may obtain a copy of the License at
11 // http://www.apache.org/licenses/LICENSE-2.0
13 // Unless required by applicable law or agreed to in writing, software
14 // distributed under the License is distributed on an "AS IS" BASIS,
15 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 // See the License for the specific language governing permissions and
17 // limitations under the License.
19 //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
21 #include "OCPlatform.h"
31 static const char* SVR_DB_FILE_NAME = "./oic_svr_db_server.dat";
34 OCConnectivityType connectivityType = CT_ADAPTER_TCP;
36 ResourceHandles m_publishedResourceHandles;
38 static void onDelete(const int& eCode);
39 static void onPublish(const OCRepresentation& rep, const int& eCode);
45 std::string m_resourceUri;
46 OCResourceHandle m_resourceHandle;
49 /// This function internally calls registerResource API.
50 void registerResource()
53 string resourceTypeName;
54 string resourceInterface;
56 std::cout <<" resourceURI: ";
57 std::cin >> resourceURI;
58 std::cout <<" resourceTypeName: ";
59 std::cin >> resourceTypeName;
60 std::cout <<" resourceInterface: ";
61 std::cin >> resourceInterface;
63 m_resourceUri = resourceURI;
65 OCStackResult ret = OCPlatform::registerResource(m_resourceHandle,
72 if (OC_STACK_OK != ret)
74 cout << "Resource creation was unsuccessful\n";
78 m_publishedResourceHandles.push_back(m_resourceHandle);
79 cout << "registerResource is called." << endl;
84 cout << " 1:: add resource type\n";
85 cout << " 2:: add resource interface\n";
88 std::cin >> selectedMenu;
94 std::cout << "Add Resource Type" << std::endl;
95 std::cout <<" resourceTypeName: ";
96 std::cin >> inputString;
97 OCPlatform::bindTypeToResource(m_resourceHandle, inputString);
100 std::cout << "Add Resource Interface" << std::endl;
101 std::cout <<" resourceInterface: ";
102 std::cin >> inputString;
103 OCPlatform::bindInterfaceToResource(m_resourceHandle, inputString);
106 cout << "Invalid option" << endl;
111 void publishResource()
114 * Publish Resource of Resource-Server to RD.
117 OCStackResult result = RDClient::Instance().publishResourceToRD(rdAddress, connectivityType,
118 m_publishedResourceHandles, &onPublish);
119 if (OC_STACK_OK != result)
121 cout << "Resource publish was unsuccessful\n";
125 void deleteResource()
128 * Delete Resource with Resource Handle.
129 * Don't need to include resource handle,
130 * if resource-server want to delete all resources from RD.
131 * Ex.) OCPlatform::deleteResourceFromRD(rdAddress, connectivityType, &onDelete);
133 OCStackResult result = RDClient::Instance().deleteResourceFromRD(rdAddress, connectivityType,
134 m_publishedResourceHandles, &onDelete);
135 if (OC_STACK_OK != result)
137 cout << "Resource delete was unsuccessful\n";
142 void onDelete(const int& eCode)
144 cout << "Received Delete Resource Response From RD\n";
147 if (OC_STACK_RESOURCE_DELETED == eCode)
149 cout << "Resource delete was successful\n";
153 std::cout << "onDelete Response error: " << eCode << std::endl;
157 catch(std::exception& e)
159 std::cout << "Exception: " << e.what() << " in onDelete" << std::endl;
163 void onPublish(const OCRepresentation& rep, const int& eCode)
165 cout << endl <<"Received Publish Resource Response From RD\n";
169 if (OC_STACK_RESOURCE_CHANGED == eCode)
171 cout << "=========== Published Resource ===========" << endl;
172 if (rep.hasAttribute("di"))
174 std::cout << " di: " << rep.getValue<std::string>("di") << std::endl;
177 // Published Resource is included as the child resource.
178 std::vector<OCRepresentation> children = rep.getChildren();
180 for (auto oit = children.begin(); oit != children.end(); ++oit)
183 oit->getValue("href", m_href);
184 cout << " href : " << m_href << "\n";
186 cout << " resource type : \n";
187 for(const std::string& type : oit->getResourceTypes())
189 cout << " " << type << "\n";
192 cout << " resource interface : \n";
193 for(const std::string& type : oit->getResourceInterfaces())
195 cout << " " << type << "\n";
199 oit->getValue("ins", m_ins);
200 cout << " ins : " << m_ins << "\n";
202 cout << "=========================================" << endl;
206 std::cout << "onPublish Response error: " << eCode << std::endl;
210 catch(std::exception& e)
212 std::cout << "Exception: " << e.what() << " in onPublish" << std::endl;
216 static void printUsage()
218 std::cout<<"Usage: rdserver <coap+tcp://10.11.12.13:5683>\n";
221 static FILE* client_open(const char* /*path*/, const char *mode)
223 return fopen(SVR_DB_FILE_NAME, mode);
226 int main(int argc, char* argv[])
228 ostringstream requestURI;
240 OCPersistentStorage ps {client_open, fread, fwrite, fclose, unlink, NULL, NULL};
241 PlatformConfig config
242 { OC::ServiceType::InProc, ModeType::Both, "0.0.0.0", 0, OC::QualityOfService::LowQos, &ps};
246 OCPlatform::Configure(config);
251 std::cout << "Register resources" << std::endl;
253 myResource.registerResource();
257 cout << "================= MENU =================" << endl;
258 cout << "0 :: Quit" << endl;
259 cout << "1 :: UPDATE RESOURCE" << endl;
260 cout << "2 :: PUBLISH RESOURCE TO RD" << endl;
261 cout << "3 :: DELETE RESOURCE FROM RD" << endl;
262 cout << "========================================" << endl;
263 std::cin >> selectedMenu;
265 switch (selectedMenu)
271 std::cout << "Update resources" << std::endl;
272 myResource.updateResource();
275 std::cout << "Publish resources to RD" << std::endl;
276 myResource.publishResource();
279 std::cout << "Delete resources from RD" << std::endl;
280 myResource.deleteResource();
283 cout << "Invalid option" << endl;
288 catch (OCException& e)
290 cerr << "Exception in main: "<< e.what();