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 OCPlatform::registerResource(m_resourceHandle, resourceURI, resourceTypeName,
70 m_publishedResourceHandles.push_back(m_resourceHandle);
71 cout << "registerResource is called." << endl;
76 cout << " 1:: add resource type\n";
77 cout << " 2:: add resource interface\n";
80 std::cin >> selectedMenu;
86 std::cout << "Add Resource Type" << std::endl;
87 std::cout <<" resourceTypeName: ";
88 std::cin >> inputString;
89 OCPlatform::bindTypeToResource(m_resourceHandle, inputString);
92 std::cout << "Add Resource Interface" << std::endl;
93 std::cout <<" resourceInterface: ";
94 std::cin >> inputString;
95 OCPlatform::bindInterfaceToResource(m_resourceHandle, inputString);
98 cout << "Invalid option" << endl;
103 void publishResource()
106 * Publish Resource of Resource-Server to RD.
109 OCStackResult result = RDClient::Instance().publishResourceToRD(rdAddress, connectivityType,
110 m_publishedResourceHandles, &onPublish);
111 if (OC_STACK_OK != result)
113 cout << "Resource publish was unsuccessful\n";
117 void deleteResource()
120 * Delete Resource with Resource Handle.
121 * Don't need to include resource handle,
122 * if resource-server want to delete all resources from RD.
123 * Ex.) OCPlatform::deleteResourceFromRD(rdAddress, connectivityType, &onDelete);
125 OCStackResult result = RDClient::Instance().deleteResourceFromRD(rdAddress, connectivityType,
126 m_publishedResourceHandles, &onDelete);
127 if (OC_STACK_OK != result)
129 cout << "Resource delete was unsuccessful\n";
134 void onDelete(const int& eCode)
136 cout << "Received Delete Resource Response From RD\n";
139 if (OC_STACK_RESOURCE_DELETED == eCode)
141 cout << "Resource delete was successful\n";
145 std::cout << "onDelete Response error: " << eCode << std::endl;
149 catch(std::exception& e)
151 std::cout << "Exception: " << e.what() << " in onDelete" << std::endl;
155 void onPublish(const OCRepresentation& rep, const int& eCode)
157 cout << endl <<"Received Publish Resource Response From RD\n";
161 if (OC_STACK_RESOURCE_CHANGED == eCode)
163 cout << "=========== Published Resource ===========" << endl;
164 if (rep.hasAttribute("di"))
166 std::cout << " di: " << rep.getValue<std::string>("di") << std::endl;
169 // Published Resource is included as the child resource.
170 std::vector<OCRepresentation> children = rep.getChildren();
172 for (auto oit = children.begin(); oit != children.end(); ++oit)
175 oit->getValue("href", m_href);
176 cout << " href : " << m_href << "\n";
178 cout << " resource type : \n";
179 for(const std::string& type : oit->getResourceTypes())
181 cout << " " << type << "\n";
184 cout << " resource interface : \n";
185 for(const std::string& type : oit->getResourceInterfaces())
187 cout << " " << type << "\n";
191 oit->getValue("ins", m_ins);
192 cout << " ins : " << m_ins << "\n";
194 cout << "=========================================" << endl;
198 std::cout << "onPublish Response error: " << eCode << std::endl;
202 catch(std::exception& e)
204 std::cout << "Exception: " << e.what() << " in onPublish" << std::endl;
208 static void printUsage()
210 std::cout<<"Usage: rdserver <coap+tcp://10.11.12.13:5683>\n";
213 static FILE* client_open(const char* /*path*/, const char *mode)
215 return fopen(SVR_DB_FILE_NAME, mode);
218 int main(int argc, char* argv[])
220 ostringstream requestURI;
232 OCPersistentStorage ps {client_open, fread, fwrite, fclose, unlink };
233 PlatformConfig config
234 { OC::ServiceType::InProc, ModeType::Both, "0.0.0.0", 0, OC::QualityOfService::LowQos, &ps};
238 OCPlatform::Configure(config);
243 std::cout << "Register resources" << std::endl;
245 myResource.registerResource();
249 cout << "================= MENU =================" << endl;
250 cout << "0 :: Quit" << endl;
251 cout << "1 :: UPDATE RESOURCE" << endl;
252 cout << "2 :: PUBLISH RESOURCE TO RD" << endl;
253 cout << "3 :: DELETE RESOURCE FROM RD" << endl;
254 cout << "========================================" << endl;
255 std::cin >> selectedMenu;
257 switch (selectedMenu)
263 std::cout << "Update resources" << std::endl;
264 myResource.updateResource();
267 std::cout << "Publish resources to RD" << std::endl;
268 myResource.publishResource();
271 std::cout << "Delete resources from RD" << std::endl;
272 myResource.deleteResource();
275 cout << "Invalid option" << endl;
280 catch (OCException& e)
282 cerr << "Exception in main: "<< e.what();