X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsamples%2Flinux%2FSimpleClientServer%2Focclientcoll.cpp;h=506318176fd217059714ed5a00926a123fb61ed6;hb=refs%2Ftags%2Faccepted%2Ftizen%2Funified%2F20171010.063815;hp=0f9c40ac355f5e5ea5b651e6226cde3dd034e568;hpb=b029953884356f976a4bdf560a6693bc6bcc115a;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/samples/linux/SimpleClientServer/occlientcoll.cpp b/resource/csdk/stack/samples/linux/SimpleClientServer/occlientcoll.cpp index 0f9c40a..5063181 100644 --- a/resource/csdk/stack/samples/linux/SimpleClientServer/occlientcoll.cpp +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/occlientcoll.cpp @@ -18,21 +18,30 @@ // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include "iotivity_config.h" #include #include #include #include +#ifdef HAVE_UNISTD_H #include +#endif +#ifdef HAVE_WINDOWS_H +#include +#endif #include #include #include +#include +#include "ocpayload.h" +#include "payload_logging.h" #include "logger.h" -const char *getResult(OCStackResult result); -std::string getIPAddrTBServer(OCClientResponse * clientResponse); -std::string getPortTBServer(OCClientResponse * clientResponse); -std::string getQueryStrForGetPut(const char * responsePayload); +#include "common.h" +#include "oic_string.h" -#define TAG PCF("occlient") +std::string getQueryStrForGetPut(); + +#define TAG ("occlient") #define DEFAULT_CONTEXT_VALUE 0x99 #ifndef MAX_LENGTH_IPv4_ADDR #define MAX_LENGTH_IPv4_ADDR 16 @@ -50,10 +59,23 @@ typedef enum TEST_UNKNOWN_RESOURCE_GET_DEFAULT, TEST_UNKNOWN_RESOURCE_GET_BATCH, TEST_UNKNOWN_RESOURCE_GET_LINK_LIST, + TEST_GET_EMPTY, + TEST_GET_NULL, MAX_TESTS } CLIENT_TEST; -unsigned static int TEST = TEST_INVALID; +/** + * List of connectivity types that can be initiated from the client + * Required for user input validation + */ +typedef enum { + CT_ADAPTER_DEFAULT = 0, + CT_IP, + MAX_CT +} CLIENT_ConnectivityType_TYPE; + +unsigned static int TestType = TEST_INVALID; +unsigned static int ConnectivityType = 0; typedef struct { @@ -72,14 +94,15 @@ testToTextMap queryInterface[] = { {"?if=oic.if.baseline", TEST_PUT_DEFAULT}, {"?if=oic.if.b", TEST_PUT_BATCH}, {"?if=oic.if.ll", TEST_PUT_LINK_LIST}, + {"", TEST_GET_EMPTY}, + {NULL, TEST_GET_NULL}, }; -static std::string putPayload = "{\"state\":\"off\",\"power\":\"0\"}"; //The following variable determines the interface protocol (IP, etc) //to be used for sending unicast messages. Default set to IP. -static OCConnectivityType OC_CONNTYPE = CT_ADAPTER_IP; -static const char * MULTICAST_RESOURCE_DISCOVERY_QUERY = "/oic/res"; +static OCConnectivityType ConnType = CT_ADAPTER_IP; +static const char * RESOURCE_DISCOVERY_QUERY = "/oic/res"; // The handle for the observe registration OCDoHandle gObserveDoHandle; @@ -104,101 +127,128 @@ int InitPutRequest(OCClientResponse * clientResponse); int InitGetRequest(OCClientResponse * clientResponse); int InitDiscovery(); +OCPayload* putPayload() +{ + OCRepPayload* payload = OCRepPayloadCreate(); + + if(!payload) + { + std::cout << "Failed to create put payload object"< -c "); - OC_LOG(INFO, TAG, "-c <0|1> : IPv4/IPv6 (IPv6 not currently supported)"); - OC_LOG(INFO, TAG, "Test Case 1 : Discover Resources && Initiate GET Request on an "\ + OIC_LOG(INFO, TAG, "Usage : occlientcoll -t -c "); + OIC_LOG(INFO, TAG, "-c 0 : Default auto-selection"); + OIC_LOG(INFO, TAG, "-c 1 : IP Connectivity Type"); + OIC_LOG(INFO, TAG, "Test Case 1 : Discover Resources && Initiate GET Request on an "\ "available resource using default interface."); - OC_LOG(INFO, TAG, "Test Case 2 : Discover Resources && Initiate GET Request on an "\ + OIC_LOG(INFO, TAG, "Test Case 2 : Discover Resources && Initiate GET Request on an "\ "available resource using batch interface."); - OC_LOG(INFO, TAG, "Test Case 3 : Discover Resources && Initiate GET Request on an "\ + OIC_LOG(INFO, TAG, "Test Case 3 : Discover Resources && Initiate GET Request on an "\ "available resource using link list interface."); - OC_LOG(INFO, TAG, "Test Case 4 : Discover Resources && Initiate GET & PUT Request on an "\ + OIC_LOG(INFO, TAG, "Test Case 4 : Discover Resources && Initiate GET & PUT Request on an "\ "available resource using default interface."); - OC_LOG(INFO, TAG, "Test Case 5 : Discover Resources && Initiate GET & PUT Request on an "\ + OIC_LOG(INFO, TAG, "Test Case 5 : Discover Resources && Initiate GET & PUT Request on an "\ "available resource using batch interface."); - OC_LOG(INFO, TAG, "Test Case 6 : Discover Resources && Initiate GET & PUT Request on an "\ + OIC_LOG(INFO, TAG, "Test Case 6 : Discover Resources && Initiate GET & PUT Request on an "\ "available resource using link list interface."); - OC_LOG(INFO, TAG, "Test Case 7 : Discover Resources && Initiate GET Request on an "\ + OIC_LOG(INFO, TAG, "Test Case 7 : Discover Resources && Initiate GET Request on an "\ "unavailable resource using default interface."); - OC_LOG(INFO, TAG, "Test Case 8 : Discover Resources && Initiate GET Request on an "\ + OIC_LOG(INFO, TAG, "Test Case 8 : Discover Resources && Initiate GET Request on an "\ "unavailable resource using batch interface."); - OC_LOG(INFO, TAG, "Test Case 9 : Discover Resources && Initiate GET Request on an "\ + OIC_LOG(INFO, TAG, "Test Case 9 : Discover Resources && Initiate GET Request on an "\ "unavailable resource using link list interface."); + OIC_LOG(INFO, TAG, "Test Case 10 : Discover Resources && Initiate GET Request on an "\ + "empty resource."); + OIC_LOG(INFO, TAG, "Test Case 11 : Discover Resources && Initiate GET Request on an "\ + "NULL resource."); + } -OCStackApplicationResult putReqCB(void* ctx, OCDoHandle handle, OCClientResponse * clientResponse) +OCStackApplicationResult putReqCB(void* ctx, OCDoHandle /*handle*/, + OCClientResponse * clientResponse) { if(clientResponse == NULL) { - OC_LOG(INFO, TAG, "The clientResponse is NULL"); + OIC_LOG(INFO, TAG, "The clientResponse is NULL"); return OC_STACK_DELETE_TRANSACTION; } if(ctx == (void*)DEFAULT_CONTEXT_VALUE) { - OC_LOG_V(INFO, TAG, "Callback Context for PUT query recvd successfully"); - OC_LOG_V(INFO, TAG, "JSON = %s =============> Discovered", clientResponse->resJSONPayload); + OIC_LOG_V(INFO, TAG, "Callback Context for PUT query recvd successfully"); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); } return OC_STACK_KEEP_TRANSACTION; } -OCStackApplicationResult getReqCB(void* ctx, OCDoHandle handle, OCClientResponse * clientResponse) +OCStackApplicationResult getReqCB(void* ctx, OCDoHandle /*handle*/, + OCClientResponse * clientResponse) { - OC_LOG_V(INFO, TAG, "StackResult: %s", + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); if(ctx == (void*)DEFAULT_CONTEXT_VALUE) { - OC_LOG_V(INFO, TAG, "SEQUENCE NUMBER: %d", clientResponse->sequenceNumber); + OIC_LOG_V(INFO, TAG, "SEQUENCE NUMBER: %d", clientResponse->sequenceNumber); if(clientResponse->sequenceNumber == 0) { - OC_LOG_V(INFO, TAG, "Callback Context for GET query recvd successfully"); - OC_LOG_V(INFO, TAG, "Fnd' Rsrc': %s", clientResponse->resJSONPayload); + OIC_LOG_V(INFO, TAG, "Callback Context for GET query recvd successfully"); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); } else { - OC_LOG_V(INFO, TAG, "Callback Context for Get recvd successfully %d", + OIC_LOG_V(INFO, TAG, "Callback Context for Get recvd successfully %d", gNumObserveNotifies); - OC_LOG_V(INFO, TAG, "Fnd' Rsrc': %s", clientResponse->resJSONPayload); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload);; gNumObserveNotifies++; if (gNumObserveNotifies == 3) { if (OCCancel (gObserveDoHandle, OC_LOW_QOS, NULL, 0) != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "Observe cancel error"); + OIC_LOG(ERROR, TAG, "Observe cancel error"); } } } } - if(TEST == TEST_PUT_DEFAULT || TEST == TEST_PUT_BATCH || TEST == TEST_PUT_LINK_LIST) + if(TestType == TEST_PUT_DEFAULT || TestType == TEST_PUT_BATCH || TestType == TEST_PUT_LINK_LIST) { InitPutRequest(clientResponse); } return OC_STACK_KEEP_TRANSACTION; } - // This is a function called back when a device is discovered -OCStackApplicationResult discoveryReqCB(void* ctx, OCDoHandle handle, - OCClientResponse * clientResponse) +OCStackApplicationResult discoveryReqCB(void* ctx, OCDoHandle /*handle*/, + OCClientResponse * clientResponse) { - OC_LOG(INFO, TAG, + OIC_LOG(INFO, TAG, "Entering discoveryReqCB (Application Layer CB)"); - OC_LOG_V(INFO, TAG, "StackResult: %s", + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); if (ctx == (void*) DEFAULT_CONTEXT_VALUE) { - OC_LOG_V(INFO, TAG, "Callback Context recvd successfully"); + OIC_LOG_V(INFO, TAG, "Callback Context recvd successfully"); } - OC_LOG_V(INFO, TAG, - "Device =============> Discovered %s @ %d.%d.%d.%d:%d", - clientResponse->resJSONPayload, clientResponse->devAddr.addr, clientResponse->devAddr.port); + OIC_LOG_V(INFO, TAG, + "Device =============> Discovered @ %s:%d", + clientResponse->devAddr.addr, + clientResponse->devAddr.port); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); + + ConnType = clientResponse->connType; - if(TEST == TEST_UNKNOWN_RESOURCE_GET_DEFAULT || TEST == TEST_UNKNOWN_RESOURCE_GET_BATCH ||\ - TEST == TEST_UNKNOWN_RESOURCE_GET_LINK_LIST) + if(TestType == TEST_UNKNOWN_RESOURCE_GET_DEFAULT || TestType == TEST_UNKNOWN_RESOURCE_GET_BATCH ||\ + TestType == TEST_UNKNOWN_RESOURCE_GET_LINK_LIST) { InitGetRequestToUnavailableResource(clientResponse); } @@ -215,17 +265,17 @@ int InitGetRequestToUnavailableResource(OCClientResponse * clientResponse) OCStackResult ret; OCCallbackData cbData; std::ostringstream getQuery; - getQuery << "coap://" << clientResponse->devAddr.addr << ":" << - clientResponse->devAddr.port << "/SomeUnknownResource"; + getQuery << "/SomeUnknownResource"; cbData.cb = getReqCB; cbData.context = (void*)DEFAULT_CONTEXT_VALUE; cbData.cd = NULL; - ret = OCDoResource(NULL, OC_REST_GET, getQuery.str().c_str(), 0, 0, OC_CONNTYPE, OC_LOW_QOS, - &cbData, NULL, 0); + ret = OCDoRequest(NULL, OC_REST_GET, getQuery.str().c_str(), + &clientResponse->devAddr, 0, ConnType, OC_LOW_QOS, + &cbData, NULL, 0); if (ret != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack resource error"); + OIC_LOG(ERROR, TAG, "OCStack resource error"); } return ret; } @@ -237,19 +287,21 @@ int InitObserveRequest(OCClientResponse * clientResponse) OCCallbackData cbData; OCDoHandle handle; std::ostringstream obsReg; - obsReg << "coap://" << clientResponse->devAddr.addr << ":" << - clientResponse->devAddr.addr << - getQueryStrForGetPut(clientResponse->resJSONPayload); + obsReg << getQueryStrForGetPut(); cbData.cb = getReqCB; cbData.context = (void*)DEFAULT_CONTEXT_VALUE; cbData.cd = NULL; - OC_LOG_V(INFO, TAG, "OBSERVE payload from client = %s ", putPayload.c_str()); - - ret = OCDoResource(&handle, OC_REST_OBSERVE, obsReg.str().c_str(), 0, 0, OC_CONNTYPE, - OC_LOW_QOS, &cbData, NULL, 0); + OIC_LOG_V(INFO, TAG, "OBSERVE payload from client ="); + OCPayload* payload = putPayload(); + OIC_LOG_PAYLOAD(INFO, payload); + OCPayloadDestroy(payload); + + ret = OCDoRequest(&handle, OC_REST_OBSERVE, obsReg.str().c_str(), + &clientResponse->devAddr, 0, ConnType, + OC_LOW_QOS, &cbData, NULL, 0); if (ret != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack resource error"); + OIC_LOG(ERROR, TAG, "OCStack resource error"); } else { @@ -267,17 +319,23 @@ int InitPutRequest(OCClientResponse * clientResponse) std::ostringstream getQuery; getQuery << "coap://" << clientResponse->devAddr.addr << ":" << clientResponse->devAddr.port << - "/a/room" << queryInterface[TEST].text; + "/a/room" << queryInterface[TestType].text; cbData.cb = putReqCB; cbData.context = (void*)DEFAULT_CONTEXT_VALUE; cbData.cd = NULL; - OC_LOG_V(INFO, TAG, "PUT payload from client = %s ", putPayload.c_str()); + OIC_LOG_V(INFO, TAG, "PUT payload from client = "); + OCPayload* payload = putPayload(); + OIC_LOG_PAYLOAD(INFO, payload); + + ret = OCDoRequest(NULL, OC_REST_PUT, getQuery.str().c_str(), + &clientResponse->devAddr, payload, ConnType, + OC_LOW_QOS, &cbData, NULL, 0); + + OCPayloadDestroy(payload); - ret = OCDoResource(NULL, OC_REST_PUT, getQuery.str().c_str(), 0, putPayload.c_str(), - OC_CONNTYPE, OC_LOW_QOS, &cbData, NULL, 0); if (ret != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack resource error"); + OIC_LOG(ERROR, TAG, "OCStack resource error"); } return ret; } @@ -290,21 +348,19 @@ int InitGetRequest(OCClientResponse * clientResponse) //* Make a GET query*/ std::ostringstream getQuery; - getQuery << "coap://" << clientResponse->devAddr.addr << ":" << - clientResponse->devAddr.port << - "/a/room" << queryInterface[TEST].text; + getQuery << "/a/room" << queryInterface[TestType].text; std::cout << "Get Query: " << getQuery.str() << std::endl; cbData.cb = getReqCB; cbData.context = (void*)DEFAULT_CONTEXT_VALUE; cbData.cd = NULL; - ret = OCDoResource(NULL, OC_REST_GET, - getQuery.str().c_str(), 0, 0, OC_CONNTYPE, OC_LOW_QOS, - &cbData, NULL, 0); + ret = OCDoRequest(NULL, OC_REST_GET, getQuery.str().c_str(), + &clientResponse->devAddr, 0, ConnType, OC_LOW_QOS, + &cbData, NULL, 0); if (ret != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack resource error"); + OIC_LOG(ERROR, TAG, "OCStack resource error"); } return ret; } @@ -314,19 +370,19 @@ int InitDiscovery() OCStackResult ret; OCCallbackData cbData; /* Start a discovery query*/ - char szQueryUri[64] = { 0 }; + char szQueryUri[MAX_QUERY_LENGTH] = { 0 }; - strcpy(szQueryUri, MULTICAST_RESOURCE_DISCOVERY_QUERY); + OICStrcpy(szQueryUri, sizeof(szQueryUri), RESOURCE_DISCOVERY_QUERY); cbData.cb = discoveryReqCB; cbData.context = (void*)DEFAULT_CONTEXT_VALUE; cbData.cd = NULL; - ret = OCDoResource(NULL, OC_REST_DISCOVER, szQueryUri, 0, 0, CT_DEFAULT, - OC_LOW_QOS, - &cbData, NULL, 0); + ret = OCDoRequest(NULL, OC_REST_DISCOVER, szQueryUri, NULL, 0, ConnType, + OC_LOW_QOS, + &cbData, NULL, 0); if (ret != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack resource error"); + OIC_LOG(ERROR, TAG, "OCStack resource error"); } return ret; } @@ -340,17 +396,18 @@ int main(int argc, char* argv[]) switch (opt) { case 't': - TEST = atoi(optarg); + TestType = atoi(optarg); break; case 'c': - OC_CONNTYPE = CT_ADAPTER_IP; + ConnectivityType = atoi(optarg); break; default: PrintUsage(); return -1; } } - if (TEST <= TEST_INVALID || TEST >= MAX_TESTS) + if ((TestType <= TEST_INVALID || TestType >= MAX_TESTS) || + ConnectivityType >= MAX_CT) { PrintUsage(); return -1; @@ -359,40 +416,46 @@ int main(int argc, char* argv[]) /* Initialize OCStack*/ if (OCInit(NULL, 0, OC_CLIENT) != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack init error"); + OIC_LOG(ERROR, TAG, "OCStack init error"); return 0; } + if(ConnectivityType == CT_ADAPTER_DEFAULT || ConnectivityType == CT_IP) + { + ConnType = CT_ADAPTER_IP; + } + else + { + OIC_LOG(INFO, TAG, "Default Connectivity type selected..."); + ConnType = CT_ADAPTER_IP; + } + InitDiscovery(); // Break from loop with Ctrl+C - OC_LOG(INFO, TAG, "Entering occlient main loop..."); + OIC_LOG(INFO, TAG, "Entering occlient main loop..."); signal(SIGINT, handleSigInt); while (!gQuitFlag) { if (OCProcess() != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack process error"); + OIC_LOG(ERROR, TAG, "OCStack process error"); return 0; } sleep(2); - } OC_LOG(INFO, TAG, "Exiting occlient main loop..."); + } OIC_LOG(INFO, TAG, "Exiting occlient main loop..."); if (OCStop() != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack stop error"); + OIC_LOG(ERROR, TAG, "OCStack stop error"); } return 0; } -std::string getQueryStrForGetPut(const char * responsePayload) +std::string getQueryStrForGetPut() { - - std::string jsonPayload(responsePayload); - return "/a/room"; } -