X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsamples%2Flinux%2FSimpleClientServer%2Focclient.cpp;h=f16adf4d2e5fa8dbdcbaacb6b68c27e2a418d494;hb=c315c87e07c4080ecd0ef488e7a1047bc3c509b2;hp=d3f4b2ade874cf884031cb754490c89bace4cc80;hpb=9965a87e82da3742a8ae5ef07734c9b5cbd23b6b;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/samples/linux/SimpleClientServer/occlient.cpp b/resource/csdk/stack/samples/linux/SimpleClientServer/occlient.cpp index d3f4b2a..f16adf4 100644 --- a/resource/csdk/stack/samples/linux/SimpleClientServer/occlient.cpp +++ b/resource/csdk/stack/samples/linux/SimpleClientServer/occlient.cpp @@ -18,44 +18,54 @@ // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include "iotivity_config.h" #include #include #include #include +#ifdef HAVE_UNISTD_H #include +#endif +#ifdef HAVE_WINDOWS_H +#include +#endif #include #include +#include #include "ocstack.h" #include "logger.h" #include "occlient.h" - +#include "ocpayload.h" +#include "payload_logging.h" +#include "common.h" + +#ifdef ROUTING_GATEWAY +/** + * Maximum number of gateway requests to form the routing table. + */ +#define MAX_NUM_GATEWAY_REQUEST 20 + +/** + * Sleep duration after every OCProcess(). + */ +#define SLEEP_DURATION 100000 +#endif // Tracking user input -static int UNICAST_DISCOVERY = 0; -static int TEST_CASE = 0; -static int CONNECTIVITY = 0; +static int UnicastDiscovery = 0; +static int TestCase = 0; +static int Connectivity = 0; -static const char * UNICAST_DEVICE_DISCOVERY_QUERY = "coap://%s/oic/d"; -static const char * MULTICAST_DEVICE_DISCOVERY_QUERY = "/oic/d"; -static const char * UNICAST_PLATFORM_DISCOVERY_QUERY = "coap://%s/oic/p"; -static const char * MULTICAST_PLATFORM_DISCOVERY_QUERY = "/oic/p"; +static const char *DEVICE_DISCOVERY_QUERY = "%s/oic/d"; +static const char *PLATFORM_DISCOVERY_QUERY = "%s/oic/p"; +static const char *RESOURCE_DISCOVERY_QUERY = "%s/oic/res"; -static const char * UNICAST_RESOURCE_DISCOVERY_QUERY = "coap://%s/oic/res"; -static const char * MULTICAST_RESOURCE_DISCOVERY_QUERY = "/oic/res"; //The following variable determines the interface protocol (IPv4, IPv6, etc) -//to be used for sending unicast messages. Default set to IPv4. -static OCConnectivityType OC_CONNTYPE = CT_ADAPTER_IP; -static std::string putPayload = "{\"oic\":[{\"rep\":{\"power\":15,\"state\":true}}]}"; -static std::string coapServerIP = "255.255.255.255"; -static std::string coapServerPort = "5683"; +//to be used for sending unicast messages. Default set to IP dual stack. +static OCConnectivityType ConnType = CT_ADAPTER_IP; +static OCDevAddr serverAddr; +static char discoveryAddr[100]; static std::string coapServerResource = "/a/light"; -// Size to hold IPV4_ADDRESS:PORT -static const int IPV4_ADDR_SIZE = 24; -//Use ipv4addr for both InitDiscovery and InitPlatformOrDeviceDiscovery -char ipv4addr[IPV4_ADDR_SIZE]; -void StripNewLineChar(char* str); - -// The handle for the observe registration -OCDoHandle gObserveDoHandle; + #ifdef WITH_PRESENCE // The handle for observe registration OCDoHandle gPresenceHandle; @@ -77,46 +87,63 @@ void handleSigInt(int signum) } } +OCPayload* putPayload() +{ + OCRepPayload* payload = OCRepPayloadCreate(); + + if (!payload) + { + std::cout << "Failed to create put payload object"< -t <1..17> -c <0|1>"); - OC_LOG(INFO, TAG, "-u <0|1> : Perform multicast/unicast discovery of resources"); - OC_LOG(INFO, TAG, "-c 0 : Use Default connectivity(IP)"); - OC_LOG(INFO, TAG, "-c 1 : IP Connectivity Type"); - OC_LOG(INFO, TAG, "-t 1 : Discover Resources"); - OC_LOG(INFO, TAG, "-t 2 : Discover Resources and Initiate Nonconfirmable Get Request"); - OC_LOG(INFO, TAG, "-t 3 : Discover Resources and Initiate Nonconfirmable Get Request" + OIC_LOG(INFO, TAG, "Usage : occlient -u <0|1> -t <1..20> -c <0|1>"); + OIC_LOG(INFO, TAG, "-u <0|1> : Perform multicast/unicast discovery of resources"); + OIC_LOG(INFO, TAG, "-c 0 : Use Default connectivity(IP)"); + OIC_LOG(INFO, TAG, "-c 1 : IP Connectivity Type"); + OIC_LOG(INFO, TAG, "-t 1 : Discover Resources"); + OIC_LOG(INFO, TAG, "-t 2 : Discover Resources and Initiate Nonconfirmable Get Request"); + OIC_LOG(INFO, TAG, "-t 3 : Discover Resources and Initiate Nonconfirmable Get Request" " with query filter."); - OC_LOG(INFO, TAG, "-t 4 : Discover Resources and Initiate Nonconfirmable Put Requests"); - OC_LOG(INFO, TAG, "-t 5 : Discover Resources and Initiate Nonconfirmable Post Requests"); - OC_LOG(INFO, TAG, "-t 6 : Discover Resources and Initiate Nonconfirmable Delete Requests"); - OC_LOG(INFO, TAG, "-t 7 : Discover Resources and Initiate Nonconfirmable Observe Requests"); - OC_LOG(INFO, TAG, "-t 8 : Discover Resources and Initiate Nonconfirmable Get Request "\ + OIC_LOG(INFO, TAG, "-t 4 : Discover Resources and Initiate Nonconfirmable Put Requests"); + OIC_LOG(INFO, TAG, "-t 5 : Discover Resources and Initiate Nonconfirmable Post Requests"); + OIC_LOG(INFO, TAG, "-t 6 : Discover Resources and Initiate Nonconfirmable Delete Requests"); + OIC_LOG(INFO, TAG, "-t 7 : Discover Resources and Initiate Nonconfirmable Observe Requests"); + OIC_LOG(INFO, TAG, "-t 8 : Discover Resources and Initiate Nonconfirmable Get Request "\ "for a resource which is unavailable"); - OC_LOG(INFO, TAG, "-t 9 : Discover Resources and Initiate Confirmable Get Request"); - OC_LOG(INFO, TAG, "-t 10 : Discover Resources and Initiate Confirmable Post Request"); - OC_LOG(INFO, TAG, "-t 11 : Discover Resources and Initiate Confirmable Delete Requests"); - OC_LOG(INFO, TAG, "-t 12 : Discover Resources and Initiate Confirmable Observe Requests"\ + OIC_LOG(INFO, TAG, "-t 9 : Discover Resources and Initiate Confirmable Get Request"); + OIC_LOG(INFO, TAG, "-t 10 : Discover Resources and Initiate Confirmable Post Request"); + OIC_LOG(INFO, TAG, "-t 11 : Discover Resources and Initiate Confirmable Delete Requests"); + OIC_LOG(INFO, TAG, "-t 12 : Discover Resources and Initiate Confirmable Observe Requests"\ " and cancel with Low QoS"); #ifdef WITH_PRESENCE - OC_LOG(INFO, TAG, "-t 13 : Discover Resources and Initiate Nonconfirmable presence"); - OC_LOG(INFO, TAG, "-t 14 : Discover Resources and Initiate Nonconfirmable presence with "\ + OIC_LOG(INFO, TAG, "-t 13 : Discover Resources and Initiate Nonconfirmable presence"); + OIC_LOG(INFO, TAG, "-t 14 : Discover Resources and Initiate Nonconfirmable presence with "\ "filter"); - OC_LOG(INFO, TAG, "-t 15 : Discover Resources and Initiate Nonconfirmable presence with "\ + OIC_LOG(INFO, TAG, "-t 15 : Discover Resources and Initiate Nonconfirmable presence with "\ "2 filters"); - OC_LOG(INFO, TAG, "-t 16 : Discover Resources and Initiate Nonconfirmable multicast presence."); + OIC_LOG(INFO, TAG, "-t 16 : Discover Resources and Initiate Nonconfirmable multicast presence."); #endif - OC_LOG(INFO, TAG, "-t 17 : Discover Resources and Initiate Nonconfirmable Observe Requests "\ + OIC_LOG(INFO, TAG, "-t 17 : Discover Resources and Initiate Nonconfirmable Observe Requests "\ "then cancel immediately with High QOS"); - OC_LOG(INFO, TAG, "-t 18 : Discover Resources and Initiate Nonconfirmable Get Request and "\ + OIC_LOG(INFO, TAG, "-t 18 : Discover Resources and Initiate Nonconfirmable Get Request and "\ "add vendor specific header options"); - OC_LOG(INFO, TAG, "-t 19 : Discover Platform"); - OC_LOG(INFO, TAG, "-t 20 : Discover Devices"); + OIC_LOG(INFO, TAG, "-t 19 : Discover Platform"); + OIC_LOG(INFO, TAG, "-t 20 : Discover Devices"); } OCStackResult InvokeOCDoResource(std::ostringstream &query, + OCDevAddr *remoteAddr, OCMethod method, OCQualityOfService qos, OCClientResponseHandler cb, @@ -131,17 +158,16 @@ OCStackResult InvokeOCDoResource(std::ostringstream &query, cbData.context = (void*)DEFAULT_CONTEXT_VALUE; cbData.cd = NULL; - ret = OCDoResource(&handle, method, query.str().c_str(), 0, - (method == OC_REST_PUT) ? putPayload.c_str() : NULL, - (OC_CONNTYPE), qos, &cbData, options, numOptions); + OCPayload* payload = (method == OC_REST_PUT) ? putPayload() : NULL; + + ret = OCDoRequest(&handle, method, query.str().c_str(), remoteAddr, + payload, (ConnType), qos, &cbData, options, numOptions); + + OCPayloadDestroy(payload); if (ret != OC_STACK_OK) { - OC_LOG_V(ERROR, TAG, "OCDoResource returns error %d with method %d", ret, method); - } - else if (method == OC_REST_OBSERVE || method == OC_REST_OBSERVE_ALL) - { - gObserveDoHandle = handle; + OIC_LOG_V(ERROR, TAG, "OCDoResource returns error %d with method %d", ret, method); } #ifdef WITH_PRESENCE else if (method == OC_REST_PRESENCE) @@ -153,97 +179,102 @@ OCStackResult InvokeOCDoResource(std::ostringstream &query, return ret; } -OCStackApplicationResult putReqCB(void* ctx, OCDoHandle handle, OCClientResponse * clientResponse) +OCStackApplicationResult putReqCB(void* ctx, OCDoHandle /*handle*/, + OCClientResponse * clientResponse) { - if(ctx == (void*)DEFAULT_CONTEXT_VALUE) + if (ctx == (void*)DEFAULT_CONTEXT_VALUE) { - OC_LOG(INFO, TAG, "Callback Context for PUT recvd successfully"); + OIC_LOG(INFO, TAG, "Callback Context for PUT recvd successfully"); } - if(clientResponse) + if (clientResponse) { - OC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); - OC_LOG_V(INFO, TAG, "JSON = %s =============> Put Response", - clientResponse->resJSONPayload); + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); + OIC_LOG(INFO, TAG, ("=============> Put Response")); } else { - OC_LOG_V(INFO, TAG, "putReqCB received Null clientResponse"); + OIC_LOG_V(INFO, TAG, "putReqCB received Null clientResponse"); } return OC_STACK_DELETE_TRANSACTION; } -OCStackApplicationResult postReqCB(void *ctx, OCDoHandle handle, OCClientResponse *clientResponse) +OCStackApplicationResult postReqCB(void *ctx, OCDoHandle /*handle*/, + OCClientResponse *clientResponse) { - if(ctx == (void*)DEFAULT_CONTEXT_VALUE) + if (ctx == (void*)DEFAULT_CONTEXT_VALUE) { - OC_LOG(INFO, TAG, "Callback Context for POST recvd successfully"); + OIC_LOG(INFO, TAG, "Callback Context for POST recvd successfully"); } - if(clientResponse) + if (clientResponse) { - OC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); - OC_LOG_V(INFO, TAG, "JSON = %s =============> Post Response", - clientResponse->resJSONPayload); + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); + OIC_LOG(INFO, TAG, ("=============> Post Response")); } else { - OC_LOG_V(INFO, TAG, "postReqCB received Null clientResponse"); + OIC_LOG_V(INFO, TAG, "postReqCB received Null clientResponse"); } return OC_STACK_DELETE_TRANSACTION; } OCStackApplicationResult deleteReqCB(void *ctx, - OCDoHandle handle, OCClientResponse *clientResponse) + OCDoHandle /*handle*/, + OCClientResponse *clientResponse) { - if(ctx == (void*)DEFAULT_CONTEXT_VALUE) + if (ctx == (void*)DEFAULT_CONTEXT_VALUE) { - OC_LOG(INFO, TAG, "Callback Context for DELETE recvd successfully"); + OIC_LOG(INFO, TAG, "Callback Context for DELETE recvd successfully"); } - if(clientResponse) + if (clientResponse) { - OC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); - OC_LOG_V(INFO, TAG, "JSON = %s =============> Delete Response", - clientResponse->resJSONPayload); + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); + OIC_LOG(INFO, TAG, ("=============> Delete Response")); } else { - OC_LOG_V(INFO, TAG, "deleteReqCB received Null clientResponse"); + OIC_LOG_V(INFO, TAG, "deleteReqCB received Null clientResponse"); } return OC_STACK_DELETE_TRANSACTION; } -OCStackApplicationResult getReqCB(void* ctx, OCDoHandle handle, OCClientResponse * clientResponse) +OCStackApplicationResult getReqCB(void* ctx, OCDoHandle /*handle*/, + OCClientResponse * clientResponse) { - if(clientResponse == NULL) + if (clientResponse == NULL) { - OC_LOG(INFO, TAG, "getReqCB received NULL clientResponse"); + OIC_LOG(INFO, TAG, "getReqCB received NULL clientResponse"); return OC_STACK_DELETE_TRANSACTION; } - if(ctx == (void*)DEFAULT_CONTEXT_VALUE) + if (ctx == (void*)DEFAULT_CONTEXT_VALUE) { - OC_LOG(INFO, TAG, "Callback Context for GET query recvd successfully"); + OIC_LOG(INFO, TAG, "Callback Context for GET query recvd successfully"); } - OC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); - OC_LOG_V(INFO, TAG, "SEQUENCE NUMBER: %d", clientResponse->sequenceNumber); - OC_LOG_V(INFO, TAG, "JSON = %s =============> Get Response", clientResponse->resJSONPayload); + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); + OIC_LOG_V(INFO, TAG, "SEQUENCE NUMBER: %d", clientResponse->sequenceNumber); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); + OIC_LOG(INFO, TAG, ("=============> Get Response")); - if(clientResponse->numRcvdVendorSpecificHeaderOptions > 0) + if (clientResponse->numRcvdVendorSpecificHeaderOptions > 0) { - OC_LOG (INFO, TAG, "Received vendor specific options"); + OIC_LOG (INFO, TAG, "Received vendor specific options"); uint8_t i = 0; OCHeaderOption * rcvdOptions = clientResponse->rcvdVendorSpecificHeaderOptions; for( i = 0; i < clientResponse->numRcvdVendorSpecificHeaderOptions; i++) { - if(((OCHeaderOption)rcvdOptions[i]).protocolID == OC_COAP_ID) + if (((OCHeaderOption)rcvdOptions[i]).protocolID == OC_COAP_ID) { - OC_LOG_V(INFO, TAG, "Received option with OC_COAP_ID and ID %u with", + OIC_LOG_V(INFO, TAG, "Received option with OC_COAP_ID and ID %u with", ((OCHeaderOption)rcvdOptions[i]).optionID ); - OC_LOG_BUFFER(INFO, TAG, ((OCHeaderOption)rcvdOptions[i]).optionData, + OIC_LOG_BUFFER(INFO, TAG, ((OCHeaderOption)rcvdOptions[i]).optionData, MAX_HEADER_OPTION_DATA_LENGTH); } } @@ -251,117 +282,148 @@ OCStackApplicationResult getReqCB(void* ctx, OCDoHandle handle, OCClientResponse return OC_STACK_DELETE_TRANSACTION; } -OCStackApplicationResult obsReqCB(void* ctx, OCDoHandle handle, OCClientResponse * clientResponse) +OCStackApplicationResult obsReqCB(void* ctx, OCDoHandle handle, + OCClientResponse * clientResponse) { - if(ctx == (void*)DEFAULT_CONTEXT_VALUE) + if (ctx == (void*)DEFAULT_CONTEXT_VALUE) { - OC_LOG(INFO, TAG, "Callback Context for OBS query recvd successfully"); + OIC_LOG(INFO, TAG, "Callback Context for OBS query recvd successfully"); } - if(clientResponse) + if (clientResponse) { - OC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); - OC_LOG_V(INFO, TAG, "SEQUENCE NUMBER: %d", clientResponse->sequenceNumber); - OC_LOG_V(INFO, TAG, "Callback Context for OBSERVE notification recvd successfully %d", - gNumObserveNotifies); - OC_LOG_V(INFO, TAG, "JSON = %s =============> Obs Response", - clientResponse->resJSONPayload); - gNumObserveNotifies++; - if (gNumObserveNotifies == 15) //large number to test observing in DELETE case. + if (clientResponse->sequenceNumber <= MAX_SEQUENCE_NUMBER) { - if(TEST_CASE == TEST_OBS_REQ_NON || TEST_CASE == TEST_OBS_REQ_CON) + if (clientResponse->sequenceNumber == OC_OBSERVE_REGISTER) { - if (OCCancel (gObserveDoHandle, OC_LOW_QOS, NULL, 0) != OC_STACK_OK) - { - OC_LOG(ERROR, TAG, "Observe cancel error"); - } - return OC_STACK_DELETE_TRANSACTION; + OIC_LOG(INFO, TAG, "This also serves as a registration confirmation."); } - else if(TEST_CASE == TEST_OBS_REQ_NON_CANCEL_IMM) + + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); + OIC_LOG_V(INFO, TAG, "SEQUENCE NUMBER: %d", clientResponse->sequenceNumber); + OIC_LOG_V(INFO, TAG, "Callback Context for OBSERVE notification recvd successfully %d", + gNumObserveNotifies); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); + OIC_LOG(INFO, TAG, ("=============> Obs Response")); + gNumObserveNotifies++; + + if (gNumObserveNotifies > 15) //large number to test observing in DELETE case. { - if (OCCancel (gObserveDoHandle, OC_HIGH_QOS, NULL, 0) != OC_STACK_OK) + if (TestCase == TEST_OBS_REQ_NON || TestCase == TEST_OBS_REQ_CON) + { + OIC_LOG(ERROR, TAG, "Cancelling with LOW QOS"); + if (OCCancel (handle, OC_LOW_QOS, NULL, 0) != OC_STACK_OK) + { + OIC_LOG(ERROR, TAG, "Observe cancel error"); + } + return OC_STACK_DELETE_TRANSACTION; + } + else if (TestCase == TEST_OBS_REQ_NON_CANCEL_IMM) { - OC_LOG(ERROR, TAG, "Observe cancel error"); + OIC_LOG(ERROR, TAG, "Cancelling with HIGH QOS"); + if (OCCancel (handle, OC_HIGH_QOS, NULL, 0) != OC_STACK_OK) + { + OIC_LOG(ERROR, TAG, "Observe cancel error"); + } } } } - if(clientResponse->sequenceNumber == OC_OBSERVE_REGISTER) - { - OC_LOG(INFO, TAG, "This also serves as a registration confirmation"); - } - else if(clientResponse->sequenceNumber == OC_OBSERVE_DEREGISTER) - { - OC_LOG(INFO, TAG, "This also serves as a deregistration confirmation"); - return OC_STACK_DELETE_TRANSACTION; - } - else if(clientResponse->sequenceNumber == OC_OBSERVE_NO_OPTION) + else { - OC_LOG(INFO, TAG, "This also tells you that registration/deregistration failed"); + OIC_LOG(INFO, TAG, "No observe option header is returned in the response."); + OIC_LOG(INFO, TAG, "For a registration request, it means the registration failed"); return OC_STACK_DELETE_TRANSACTION; } } else { - OC_LOG_V(INFO, TAG, "obsReqCB received Null clientResponse"); + OIC_LOG_V(INFO, TAG, "obsReqCB received Null clientResponse"); } return OC_STACK_KEEP_TRANSACTION; } #ifdef WITH_PRESENCE -OCStackApplicationResult presenceCB(void* ctx, OCDoHandle handle, OCClientResponse * clientResponse) +OCStackApplicationResult presenceCB(void* ctx, OCDoHandle /*handle*/, + OCClientResponse * clientResponse) { if (ctx == (void*) DEFAULT_CONTEXT_VALUE) { - OC_LOG(INFO, TAG, "Callback Context for Presence recvd successfully"); + OIC_LOG(INFO, TAG, "Callback Context for Presence recvd successfully"); } if (clientResponse) { - OC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); - OC_LOG_V(INFO, TAG, "NONCE NUMBER: %u", clientResponse->sequenceNumber); - OC_LOG_V(INFO, TAG, "Callback Context for Presence notification recvd successfully %d", + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); + OIC_LOG_V(INFO, TAG, "Callback Context for Presence notification recvd successfully %d", gNumPresenceNotifies); - OC_LOG_V(INFO, TAG, "JSON = %s =============> Presence Response", - clientResponse->resJSONPayload); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); + OIC_LOG(INFO, TAG, ("=============> Presence Response")); gNumPresenceNotifies++; if (gNumPresenceNotifies == 20) { if (OCCancel(gPresenceHandle, OC_LOW_QOS, NULL, 0) != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "Presence cancel error"); + OIC_LOG(ERROR, TAG, "Presence cancel error"); } return OC_STACK_DELETE_TRANSACTION; } } else { - OC_LOG_V(INFO, TAG, "presenceCB received Null clientResponse"); + OIC_LOG_V(INFO, TAG, "presenceCB received Null clientResponse"); } return OC_STACK_KEEP_TRANSACTION; } #endif // 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) { if (ctx == (void*) DEFAULT_CONTEXT_VALUE) { - OC_LOG(INFO, TAG, "Callback Context for DISCOVER query recvd successfully"); + OIC_LOG(INFO, TAG, "Callback Context for DISCOVER query recvd successfully"); } if (clientResponse) { - OC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); std::string connectionType = getConnectivityType (clientResponse->connType); - OC_LOG_V(INFO, TAG, "Discovered on %s", connectionType.c_str()); - OC_LOG_V(INFO, TAG, - "Device =============> Discovered %s @ %s:%d", - clientResponse->resJSONPayload, clientResponse->devAddr.addr, clientResponse->devAddr.port); + OIC_LOG_V(INFO, TAG, "Discovered on %s", connectionType.c_str()); + OIC_LOG_V(INFO, TAG, + "Device =============> Discovered @ %s:%d", + clientResponse->devAddr.addr, + clientResponse->devAddr.port); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); + + ConnType = clientResponse->connType; + serverAddr = clientResponse->devAddr; + + OCDiscoveryPayload *payload = (OCDiscoveryPayload*) clientResponse->payload; + if (!payload) + { + return OC_STACK_DELETE_TRANSACTION; + } - parseClientResponse(clientResponse); + OCResourcePayload *resource = (OCResourcePayload*) payload->resources; + int found = 0; + while (resource) + { + if(resource->uri && strcmp(resource->uri, coapServerResource.c_str()) == 0) + { + found = 1; + break; + } + resource = resource->next; + } - switch(TEST_CASE) + if(!found) + { + OIC_LOG_V (INFO, TAG, "No %s in payload", coapServerResource.c_str()); + return OC_STACK_KEEP_TRANSACTION; + } + + switch(TestCase) { case TEST_GET_REQ_NON: InitGetRequest(OC_LOW_QOS, 0, 0); @@ -421,93 +483,89 @@ OCStackApplicationResult discoveryReqCB(void* ctx, OCDoHandle handle, } else { - OC_LOG_V(INFO, TAG, "discoveryReqCB received Null clientResponse"); + OIC_LOG_V(INFO, TAG, "discoveryReqCB received Null clientResponse"); } return OC_STACK_KEEP_TRANSACTION; } -OCStackApplicationResult PlatformDiscoveryReqCB (void* ctx, OCDoHandle handle, - OCClientResponse * clientResponse) +OCStackApplicationResult PlatformDiscoveryReqCB(void* ctx, + OCDoHandle /*handle*/, + OCClientResponse * clientResponse) { if (ctx == (void*) DEFAULT_CONTEXT_VALUE) { - OC_LOG(INFO, TAG, "Callback Context for Platform DISCOVER query recvd successfully"); + OIC_LOG(INFO, TAG, "Callback Context for Platform DISCOVER query recvd successfully"); } - if(clientResponse) + if (clientResponse) { - //OC_LOG truncates the response as it is too long. - fprintf(stderr, "Discovery response: \n %s\n", clientResponse->resJSONPayload); - fflush(stderr); + OIC_LOG(INFO, TAG, ("Discovery Response:")); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); } else { - OC_LOG_V(INFO, TAG, "PlatformDiscoveryReqCB received Null clientResponse"); + OIC_LOG_V(INFO, TAG, "PlatformDiscoveryReqCB received Null clientResponse"); } - return (UNICAST_DISCOVERY) ? OC_STACK_DELETE_TRANSACTION : OC_STACK_KEEP_TRANSACTION; + return (UnicastDiscovery) ? OC_STACK_DELETE_TRANSACTION : OC_STACK_KEEP_TRANSACTION; } -OCStackApplicationResult DeviceDiscoveryReqCB (void* ctx, OCDoHandle handle, - OCClientResponse * clientResponse) +OCStackApplicationResult DeviceDiscoveryReqCB(void* ctx, OCDoHandle /*handle*/, + OCClientResponse * clientResponse) { if (ctx == (void*) DEFAULT_CONTEXT_VALUE) { - OC_LOG(INFO, TAG, "Callback Context for Device DISCOVER query recvd successfully"); + OIC_LOG(INFO, TAG, "Callback Context for Device DISCOVER query recvd successfully"); } - if(clientResponse) + if (clientResponse) { - //OC_LOG truncates the response as it is too long. - fprintf(stderr, "Discovery response: \n %s\n", clientResponse->resJSONPayload); - fflush(stderr); + OIC_LOG(INFO, TAG, ("Discovery Response:")); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); } else { - OC_LOG_V(INFO, TAG, "PlatformDiscoveryReqCB received Null clientResponse"); + OIC_LOG_V(INFO, TAG, "PlatformDiscoveryReqCB received Null clientResponse"); } - return (UNICAST_DISCOVERY) ? OC_STACK_DELETE_TRANSACTION : OC_STACK_KEEP_TRANSACTION; + return (UnicastDiscovery) ? OC_STACK_DELETE_TRANSACTION : OC_STACK_KEEP_TRANSACTION; } #ifdef WITH_PRESENCE int InitPresence() { OCStackResult result = OC_STACK_OK; - OC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__); + OIC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__); std::ostringstream query; std::ostringstream querySuffix; - query << "coap://" << coapServerIP << ":" << coapServerPort << OC_PRESENCE_URI; - if(TEST_CASE == TEST_OBS_PRESENCE) + query << OC_RSRVD_PRESENCE_URI; + if (TestCase == TEST_OBS_PRESENCE) { - result = InvokeOCDoResource(query, OC_REST_PRESENCE, OC_LOW_QOS, - presenceCB, NULL, 0); + result = InvokeOCDoResource(query, &serverAddr, OC_REST_PRESENCE, + OC_LOW_QOS, presenceCB, NULL, 0); } - if(TEST_CASE == TEST_OBS_PRESENCE_WITH_FILTER || TEST_CASE == TEST_OBS_PRESENCE_WITH_FILTERS) + if (TestCase == TEST_OBS_PRESENCE_WITH_FILTER || TestCase == TEST_OBS_PRESENCE_WITH_FILTERS) { querySuffix.str(""); querySuffix << query.str() << "?rt=core.led"; - result = InvokeOCDoResource(querySuffix, OC_REST_PRESENCE, OC_LOW_QOS, - presenceCB, NULL, 0); + result = InvokeOCDoResource(querySuffix, &serverAddr, OC_REST_PRESENCE, + OC_LOW_QOS, presenceCB, NULL, 0); } - if(TEST_CASE == TEST_OBS_PRESENCE_WITH_FILTERS) + if (TestCase == TEST_OBS_PRESENCE_WITH_FILTERS) { - if(result == OC_STACK_OK) + if (result == OC_STACK_OK) { querySuffix.str(""); querySuffix << query.str() << "?rt=core.fan"; - result = InvokeOCDoResource(querySuffix, OC_REST_PRESENCE, OC_LOW_QOS, + result = InvokeOCDoResource(querySuffix, &serverAddr, OC_REST_PRESENCE, OC_LOW_QOS, presenceCB, NULL, 0); } } - if(TEST_CASE == TEST_OBS_MULTICAST_PRESENCE) + if (TestCase == TEST_OBS_MULTICAST_PRESENCE) { - if(result == OC_STACK_OK) + if (result == OC_STACK_OK) { - std::ostringstream multicastPresenceQuery; - multicastPresenceQuery.str(""); - multicastPresenceQuery << "coap://" << OC_MULTICAST_PREFIX << OC_PRESENCE_URI; - result = InvokeOCDoResource(multicastPresenceQuery, OC_REST_PRESENCE, OC_LOW_QOS, + result = InvokeOCDoResource(query, NULL, OC_REST_PRESENCE, OC_LOW_QOS, presenceCB, NULL, 0); } } @@ -517,59 +575,60 @@ int InitPresence() int InitGetRequestToUnavailableResource(OCQualityOfService qos) { - OC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__); std::ostringstream query; - query << "coap://" << coapServerIP << ":" << coapServerPort << "/SomeUnknownResource"; - return (InvokeOCDoResource(query, OC_REST_GET, (qos == OC_HIGH_QOS)? OC_HIGH_QOS:OC_LOW_QOS, + query << "/SomeUnknownResource"; + OIC_LOG_V(INFO, TAG, "\nExecuting %s with query %s", __func__, query.str().c_str()); + return (InvokeOCDoResource(query, &serverAddr, OC_REST_GET, (qos == OC_HIGH_QOS)? OC_HIGH_QOS:OC_LOW_QOS, getReqCB, NULL, 0)); } int InitObserveRequest(OCQualityOfService qos) { - OC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__); std::ostringstream query; - query << "coap://" << coapServerIP << ":" << coapServerPort << coapServerResource; - return (InvokeOCDoResource(query, - OC_REST_OBSERVE, (qos == OC_HIGH_QOS)? OC_HIGH_QOS:OC_LOW_QOS, obsReqCB, NULL, 0)); + query << coapServerResource; + OIC_LOG_V(INFO, TAG, "\nExecuting %s with query %s", __func__, query.str().c_str()); + return (InvokeOCDoResource(query, &serverAddr, OC_REST_OBSERVE, + (qos == OC_HIGH_QOS)? OC_HIGH_QOS:OC_LOW_QOS, obsReqCB, NULL, 0)); } int InitPutRequest(OCQualityOfService qos) { - OC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__); std::ostringstream query; - query << "coap://" << coapServerIP << ":" << coapServerPort << coapServerResource; - return (InvokeOCDoResource(query, OC_REST_PUT, (qos == OC_HIGH_QOS)? OC_HIGH_QOS:OC_LOW_QOS, + query << coapServerResource; + OIC_LOG_V(INFO, TAG, "\nExecuting %s with query %s", __func__, query.str().c_str()); + return (InvokeOCDoResource(query, &serverAddr, OC_REST_PUT, (qos == OC_HIGH_QOS)? OC_HIGH_QOS:OC_LOW_QOS, putReqCB, NULL, 0)); } int InitPostRequest(OCQualityOfService qos) { OCStackResult result; - OC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__); + std::ostringstream query; - query << "coap://" << coapServerIP << ":" << coapServerPort << coapServerResource; + query << coapServerResource; + OIC_LOG_V(INFO, TAG, "\nExecuting %s with query %s", __func__, query.str().c_str()); // First POST operation (to create an Light instance) - result = InvokeOCDoResource(query, OC_REST_POST, + result = InvokeOCDoResource(query, &serverAddr, OC_REST_POST, ((qos == OC_HIGH_QOS) ? OC_HIGH_QOS: OC_LOW_QOS), postReqCB, NULL, 0); if (OC_STACK_OK != result) { // Error can happen if for example, network connectivity is down - OC_LOG(INFO, TAG, "First POST call did not succeed"); + OIC_LOG(INFO, TAG, "First POST call did not succeed"); } // Second POST operation (to create an Light instance) - result = InvokeOCDoResource(query, OC_REST_POST, + result = InvokeOCDoResource(query, &serverAddr, OC_REST_POST, ((qos == OC_HIGH_QOS) ? OC_HIGH_QOS: OC_LOW_QOS), postReqCB, NULL, 0); if (OC_STACK_OK != result) { - OC_LOG(INFO, TAG, "Second POST call did not succeed"); + OIC_LOG(INFO, TAG, "Second POST call did not succeed"); } // This POST operation will update the original resourced /a/light - return (InvokeOCDoResource(query, OC_REST_POST, + return (InvokeOCDoResource(query, &serverAddr, OC_REST_POST, ((qos == OC_HIGH_QOS) ? OC_HIGH_QOS: OC_LOW_QOS), postReqCB, NULL, 0)); } @@ -578,9 +637,9 @@ void* RequestDeleteDeathResourceTask(void* myqos) { sleep (30);//long enough to give the server time to finish deleting the resource. std::ostringstream query; - query << "coap://" << coapServerIP << ":" << coapServerPort << coapServerResource; + query << coapServerResource; - OC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__); + OIC_LOG_V(INFO, TAG, "\nExecuting %s with query %s", __func__, query.str().c_str()); // Second DELETE operation to delete the resource that might have been removed already. OCQualityOfService qos; @@ -593,13 +652,13 @@ void* RequestDeleteDeathResourceTask(void* myqos) qos = OC_HIGH_QOS; } - OCStackResult result = InvokeOCDoResource(query, OC_REST_DELETE, + OCStackResult result = InvokeOCDoResource(query, &serverAddr, OC_REST_DELETE, qos, deleteReqCB, NULL, 0); if (OC_STACK_OK != result) { - OC_LOG(INFO, TAG, "Second DELETE call did not succeed"); + OIC_LOG(INFO, TAG, "Second DELETE call did not succeed"); } return NULL; @@ -609,18 +668,18 @@ int InitDeleteRequest(OCQualityOfService qos) { OCStackResult result; std::ostringstream query; - query << "coap://" << coapServerIP << ":" << coapServerPort << coapServerResource; + query << coapServerResource; - OC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__); + OIC_LOG_V(INFO, TAG, "\nExecuting %s with query %s", __func__, query.str().c_str()); // First DELETE operation - result = InvokeOCDoResource(query, OC_REST_DELETE, + result = InvokeOCDoResource(query, &serverAddr, OC_REST_DELETE, qos, deleteReqCB, NULL, 0); if (OC_STACK_OK != result) { // Error can happen if for example, network connectivity is down - OC_LOG(INFO, TAG, "First DELETE call did not succeed"); + OIC_LOG(INFO, TAG, "First DELETE call did not succeed"); } else { @@ -629,89 +688,81 @@ int InitDeleteRequest(OCQualityOfService qos) pthread_create (&threadId, NULL, RequestDeleteDeathResourceTask, (void*)qos); } - OC_LOG_V(INFO, TAG, "\n\nExit %s", __func__); + OIC_LOG_V(INFO, TAG, "\n\nExit %s", __func__); return result; } -int InitGetRequest(OCQualityOfService qos, uint8_t withVendorSpecificHeaderOptions, bool getWithQuery) +int InitGetRequest(OCQualityOfService qos, uint8_t withVendorSpecificHeaderOptions, + bool getWithQuery) { OCHeaderOption options[MAX_HEADER_OPTIONS]; - OC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__); std::ostringstream query; - query << "coap://" << coapServerIP << ":" << coapServerPort << coapServerResource; + query << coapServerResource; // ocserver is written to only process "power= MAX_TESTS) || - (CONNECTIVITY < CT_ADAPTER_DEFAULT || CONNECTIVITY >= MAX_CT)) + if ((UnicastDiscovery != 0 && UnicastDiscovery != 1) || + (TestCase < TEST_DISCOVER_REQ || TestCase >= MAX_TESTS) || + (Connectivity < CT_ADAPTER_DEFAULT || Connectivity >= MAX_CT)) { PrintUsage(); return -1; } - /* Initialize OCStack*/ - if (OCInit(NULL, 0, OC_CLIENT) != OC_STACK_OK) + if (OCInit1(OC_CLIENT, OC_DEFAULT_FLAGS, OC_DEFAULT_FLAGS) != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack init error"); + OIC_LOG(ERROR, TAG, "OCStack init error"); return 0; } - if(CONNECTIVITY == CT_ADAPTER_DEFAULT || CONNECTIVITY == CT_IP) +#ifdef ROUTING_GATEWAY + /* + * Before invoking Discover resource, we process the gateway requests + * and form the routing table. + */ + for (int index = 0; index < MAX_NUM_GATEWAY_REQUEST; index++) { - OC_CONNTYPE = CT_ADAPTER_IP; + if (OC_STACK_OK != OCProcess()) + { + OIC_LOG(ERROR, TAG, "OCStack process error"); + return 0; + } + usleep(SLEEP_DURATION); + } +#endif + if (Connectivity == CT_ADAPTER_DEFAULT || Connectivity == CT_IP) + { + ConnType = CT_ADAPTER_IP; } else { - OC_LOG(INFO, TAG, "Default Connectivity type selected..."); + OIC_LOG(INFO, TAG, "Default Connectivity type selected..."); PrintUsage(); } - if (UNICAST_DISCOVERY) + discoveryAddr[0] = '\0'; + + if (UnicastDiscovery) { - OC_LOG(INFO, TAG, "Enter IP address with port number of the Server hosting resource"); - OC_LOG(INFO, TAG, "as follows - eg: 192.168.0.15:45454 (IP:Port) \n"); + OIC_LOG(INFO, TAG, "Enter IP address of server with optional port number"); + OIC_LOG(INFO, TAG, "IPv4: 192.168.0.15:45454\n"); + OIC_LOG(INFO, TAG, "IPv6: [fe80::20c:29ff:fe1b:9c5]:45454\n"); - if (fgets(ipv4addr, IPV4_ADDR_SIZE, stdin)) + if (fgets(discoveryAddr, sizeof (discoveryAddr), stdin)) { //Strip newline char from ipv4addr - StripNewLineChar(ipv4addr); + StripNewLineChar(discoveryAddr); } else { - OC_LOG(ERROR, TAG, "!! Bad input for IPV4 address. !!"); + OIC_LOG(ERROR, TAG, "!! Bad input for IP address. !!"); return OC_STACK_INVALID_PARAM; } } - if(UNICAST_DISCOVERY == 0 && TEST_CASE == TEST_DISCOVER_DEV_REQ) + if (UnicastDiscovery == 0 && TestCase == TEST_DISCOVER_DEV_REQ) { InitDeviceDiscovery(OC_LOW_QOS); } - else if(UNICAST_DISCOVERY == 0 && TEST_CASE == TEST_DISCOVER_PLATFORM_REQ) + else if (UnicastDiscovery == 0 && TestCase == TEST_DISCOVER_PLATFORM_REQ) { InitPlatformDiscovery(OC_LOW_QOS); } @@ -873,58 +911,30 @@ int main(int argc, char* argv[]) } // 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); +#ifndef ROUTING_GATEAWAY + sleep(1); +#endif } - 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 getIPAddrTBServer(OCClientResponse * clientResponse) -{ - if (!clientResponse) - { - return ""; - } - if (!clientResponse->addr) - { - return ""; - } - - return std::string(clientResponse->devAddr.addr); -} - -std::string getPortTBServer(OCClientResponse * clientResponse) -{ - if (!clientResponse) - { - return ""; - } - if (!clientResponse->addr) - { - return ""; - } - std::ostringstream ss; - ss << clientResponse->devAddr.port; - return ss.str(); -} - std::string getConnectivityType (OCConnectivityType connType) { switch (connType & CT_MASK_ADAPTER) @@ -948,17 +958,3 @@ std::string getConnectivityType (OCConnectivityType connType) return "Incorrect connectivity"; } } - -std::string getQueryStrForGetPut(OCClientResponse * clientResponse) -{ - - return "/a/light"; -} - -void parseClientResponse(OCClientResponse * clientResponse) -{ - coapServerIP = getIPAddrTBServer(clientResponse); - coapServerPort = getPortTBServer(clientResponse); - coapServerResource = getQueryStrForGetPut(clientResponse); -} -