X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=resource%2Fcsdk%2Fstack%2Fsamples%2Flinux%2Fsecure%2Focclientbasicops.cpp;h=d6ce3071be5c0d474de1acb7712ae85da2531133;hb=refs%2Ftags%2Faccepted%2Ftizen%2Funified%2F20171010.063815;hp=d56a79073005b9f68d2547ca27898e6d6e815598;hpb=610012a40924b391912156baee9d4f6d0ce9f7ee;p=platform%2Fupstream%2Fiotivity.git diff --git a/resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp b/resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp index d56a790..d6ce307 100644 --- a/resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp +++ b/resource/csdk/stack/samples/linux/secure/occlientbasicops.cpp @@ -18,42 +18,54 @@ // //-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +#include "iotivity_config.h" #include #include #include #include +#ifdef HAVE_UNISTD_H #include +#endif +#ifdef HAVE_WINDOWS_H +#include +/** @todo stop-gap for naming issue. Windows.h does not like us to use ERROR */ +#ifdef ERROR +#undef ERROR +#endif +#endif #include #include +#include #include "ocstack.h" #include "logger.h" #include "occlientbasicops.h" #include "ocpayload.h" +#include "payload_logging.h" #include "oic_string.h" #include "common.h" #define TAG "occlientbasicops" -static int UNICAST_DISCOVERY = 0; -static int TEST_CASE = 0; -static int CONN_TYPE = 0; +static int UnicastDiscovery = 0; +static int TestCase = 0; +static int ConnType = 0; +static int DevOwner = 0; +static int WithTcp = 0; -static int IPV4_ADDR_SIZE = 24; -static char UNICAST_DISCOVERY_QUERY[] = "coap://%s/oic/res"; -static char MULTICAST_DISCOVERY_QUERY[] = "/oic/res"; +static char DISCOVERY_QUERY[] = "%s/oic/res"; OCConnectivityType discoveryReqConnType = CT_ADAPTER_IP; +static OCDevAddr endpoint; -static std::string coapServerIP; -static std::string coapServerPort; static std::string coapServerResource; static int coapSecureResource; static OCConnectivityType ocConnType; - //Secure Virtual Resource database for Iotivity Client application //It contains Client's Identity and the PSK credentials //of other devices which the client trusts -static char CRED_FILE[] = "oic_svr_db_client.json"; - +static char CRED_FILE_DEVOWNER[] = "oic_svr_db_client_devowner.dat"; +static char CRED_FILE_NONDEVOWNER[] = "oic_svr_db_client_nondevowner.dat"; +const char * OIC_RSRC_DOXM_URI = "/oic/sec/doxm"; +const char * OIC_RSRC_PSTAT_URI = "/oic/sec/pstat"; int gQuitFlag = 0; @@ -84,19 +96,26 @@ OCPayload* putPayload() static void PrintUsage() { - OC_LOG(INFO, TAG, "Usage : occlient -u <0|1> -t <1|2|3> -c <0|1>"); - OC_LOG(INFO, TAG, "-u <0|1> : Perform multicast/unicast discovery of resources"); - OC_LOG(INFO, TAG, "-t 1 : Discover Resources"); - OC_LOG(INFO, TAG, "-t 2 : Discover Resources and" + OIC_LOG(INFO, TAG, "Usage : occlient -u <0|1> -t <1|2|3> -c <0|1>"); + OIC_LOG(INFO, TAG, "-u <0|1> : Perform multicast/unicast discovery of resources"); + OIC_LOG(INFO, TAG, "-t 1 : Discover Resources"); + OIC_LOG(INFO, TAG, "-t 2 : Discover Resources and" " Initiate Nonconfirmable Get/Put/Post Requests"); - OC_LOG(INFO, TAG, "-t 3 : Discover Resources and Initiate Confirmable Get/Put/Post Requests"); - OC_LOG(INFO, TAG, "-c 0 : Default auto-selection"); - OC_LOG(INFO, TAG, "-c 1 : IPv4 Connectivity Type"); + OIC_LOG(INFO, TAG, "-t 3 : Discover Resources and Initiate Confirmable Get/Put/Post Requests"); + OIC_LOG(INFO, TAG, "-c 0 : Default auto-selection"); + OIC_LOG(INFO, TAG, "-c 1 : IP Connectivity Type"); + OIC_LOG(INFO, TAG, "-d 0 : Client as Non Device Owner"); + OIC_LOG(INFO, TAG, "-d 1 : Client as Device Owner"); + OIC_LOG(INFO, TAG, "-p 0 : Use UDP protocol"); + OIC_LOG(INFO, TAG, "-p 1 : Use TCP protocol"); } OCStackResult InvokeOCDoResource(std::ostringstream &query, - OCMethod method, OCQualityOfService qos, - OCClientResponseHandler cb, OCHeaderOption * options, uint8_t numOptions) + OCMethod method, + const OCDevAddr *dest, + OCQualityOfService qos, + OCClientResponseHandler cb, + OCHeaderOption * options, uint8_t numOptions) { OCStackResult ret; OCCallbackData cbData; @@ -105,230 +124,263 @@ OCStackResult InvokeOCDoResource(std::ostringstream &query, cbData.context = NULL; cbData.cd = NULL; - ret = OCDoResource(NULL, method, query.str().c_str(), 0, - (method == OC_REST_PUT || method == OC_REST_POST) ? putPayload() : NULL, - ocConnType, qos, &cbData, options, numOptions); + OCPayload* payload = (method == OC_REST_PUT || method == OC_REST_POST) ? putPayload() : NULL; + + ret = OCDoRequest(NULL, method, query.str().c_str(), dest, + payload, ocConnType, 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); + OIC_LOG_V(ERROR, TAG, "OCDoResource returns error %d with method %d", ret, method); } return ret; } -OCStackApplicationResult putReqCB(void* ctx, OCDoHandle handle, OCClientResponse * clientResponse) +OCStackApplicationResult putReqCB(void*, OCDoHandle, OCClientResponse * clientResponse) { - OC_LOG(INFO, TAG, "Callback Context for PUT recvd successfully"); + OIC_LOG(INFO, TAG, "Callback Context for PUT recvd successfully"); if(clientResponse) { - OC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); - OC_LOG_PAYLOAD(INFO, TAG, clientResponse->payload); - OC_LOG(INFO, TAG, PCF("=============> Put Response")); + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); + OIC_LOG(INFO, TAG, "=============> Put Response"); } return OC_STACK_DELETE_TRANSACTION; } -OCStackApplicationResult postReqCB(void *ctx, OCDoHandle handle, OCClientResponse *clientResponse) +OCStackApplicationResult postReqCB(void *, OCDoHandle, OCClientResponse *clientResponse) { - OC_LOG(INFO, TAG, "Callback Context for POST recvd successfully"); + OIC_LOG(INFO, TAG, "Callback Context for POST recvd successfully"); if(clientResponse) { - OC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); - OC_LOG_PAYLOAD(INFO, TAG, clientResponse->payload); - OC_LOG(INFO, TAG, PCF("=============> Post Response")); + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); + OIC_LOG(INFO, TAG, "=============> Post Response"); } return OC_STACK_DELETE_TRANSACTION; } -OCStackApplicationResult getReqCB(void* ctx, OCDoHandle handle, OCClientResponse * clientResponse) +OCStackApplicationResult getReqCB(void*, OCDoHandle, OCClientResponse * clientResponse) { - OC_LOG(INFO, TAG, "Callback Context for GET query recvd successfully"); + OIC_LOG(INFO, TAG, "Callback Context for GET query recvd successfully"); if(clientResponse) { - OC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); - OC_LOG_V(INFO, TAG, "SEQUENCE NUMBER: %d", clientResponse->sequenceNumber); - OC_LOG_PAYLOAD(INFO, TAG, clientResponse->payload); - OC_LOG(INFO, TAG, PCF("=============> Get Response")); + 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"); } return OC_STACK_DELETE_TRANSACTION; } // This is a function called back when a device is discovered -OCStackApplicationResult discoveryReqCB(void* ctx, OCDoHandle handle, +OCStackApplicationResult discoveryReqCB(void*, OCDoHandle, OCClientResponse * clientResponse) { - 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)); - OC_LOG_V(INFO, TAG, + OIC_LOG_V(INFO, TAG, "StackResult: %s", getResult(clientResponse->result)); + OIC_LOG_V(INFO, TAG, "Device =============> Discovered @ %s:%d", clientResponse->devAddr.addr, clientResponse->devAddr.port); if (clientResponse->result == OC_STACK_OK) { - OC_LOG_PAYLOAD(INFO, TAG, clientResponse->payload); + OIC_LOG_PAYLOAD(INFO, clientResponse->payload); ocConnType = clientResponse->connType; + endpoint = clientResponse->devAddr; if (parseClientResponse(clientResponse) != -1) { - switch(TEST_CASE) + switch(TestCase) { case TEST_NON_CON_OP: InitGetRequest(OC_LOW_QOS); InitPutRequest(OC_LOW_QOS); - //InitPostRequest(OC_LOW_QOS); + InitPostRequest(OC_LOW_QOS); break; case TEST_CON_OP: InitGetRequest(OC_HIGH_QOS); InitPutRequest(OC_HIGH_QOS); - //InitPostRequest(OC_HIGH_QOS); + InitPostRequest(OC_HIGH_QOS); break; } } } } - return (UNICAST_DISCOVERY) ? OC_STACK_DELETE_TRANSACTION : OC_STACK_KEEP_TRANSACTION ; + return (UnicastDiscovery) ? OC_STACK_DELETE_TRANSACTION : OC_STACK_KEEP_TRANSACTION ; } - int InitPutRequest(OCQualityOfService qos) { - OC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__); + OIC_LOG_V(INFO, TAG, "Executing %s", __func__); std::ostringstream query; - query << (coapSecureResource ? "coaps://" : "coap://") << coapServerIP - << ":" << coapServerPort << coapServerResource; - return (InvokeOCDoResource(query, OC_REST_PUT, + query << coapServerResource; + if(WithTcp) + { + endpoint.adapter = OC_ADAPTER_TCP; + } + endpoint.flags = (OCTransportFlags)(endpoint.flags|OC_SECURE); + return (InvokeOCDoResource(query, OC_REST_PUT, &endpoint, ((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__); + + OIC_LOG_V(INFO, TAG, "Executing %s", __func__); std::ostringstream query; - query << (coapSecureResource ? "coaps://" : "coap://") << coapServerIP - << ":" << coapServerPort << coapServerResource; + query << coapServerResource; + if(WithTcp) + { + endpoint.adapter = OC_ADAPTER_TCP; + } + endpoint.flags = (OCTransportFlags)(endpoint.flags|OC_SECURE); // First POST operation (to create an LED instance) - result = InvokeOCDoResource(query, OC_REST_POST, + result = InvokeOCDoResource(query, OC_REST_POST, &endpoint, ((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 LED instance) - result = InvokeOCDoResource(query, OC_REST_POST, + result = InvokeOCDoResource(query, OC_REST_POST, &endpoint, ((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/led - return (InvokeOCDoResource(query, OC_REST_POST, - ((qos == OC_HIGH_QOS) ? OC_HIGH_QOS: OC_LOW_QOS), - postReqCB, NULL, 0)); + // This POST operation will update the original resourced /a/led (as long as + // the server is set to max 2 /lcd resources) + result = InvokeOCDoResource(query, OC_REST_POST, &endpoint, + ((qos == OC_HIGH_QOS) ? OC_HIGH_QOS: OC_LOW_QOS), + postReqCB, NULL, 0); + if (OC_STACK_OK != result) + { + OIC_LOG(INFO, TAG, "Third POST call did not succeed"); + } + return result; } int InitGetRequest(OCQualityOfService qos) { - OC_LOG_V(INFO, TAG, "\n\nExecuting %s", __func__); + OIC_LOG_V(INFO, TAG, "Executing %s", __func__); std::ostringstream query; - query << (coapSecureResource ? "coaps://" : "coap://") << coapServerIP - << ":" << coapServerPort << coapServerResource; + query << coapServerResource; + if(WithTcp) + { + endpoint.adapter = OC_ADAPTER_TCP; + } + endpoint.flags = (OCTransportFlags)(endpoint.flags|OC_SECURE); - return (InvokeOCDoResource(query, OC_REST_GET, (qos == OC_HIGH_QOS)? - OC_HIGH_QOS:OC_LOW_QOS, getReqCB, NULL, 0)); + return (InvokeOCDoResource(query, OC_REST_GET, &endpoint, + ((qos == OC_HIGH_QOS)? OC_HIGH_QOS:OC_LOW_QOS), + getReqCB, NULL, 0)); } int InitDiscovery() { OCStackResult ret; - OCMethod method; OCCallbackData cbData; - char szQueryUri[MAX_URI_LENGTH] = { 0 }; + char queryUri[200]; + char ipaddr[100] = { '\0' }; - if (UNICAST_DISCOVERY) + if (UnicastDiscovery) { - char ipv4addr[IPV4_ADDR_SIZE]; - OC_LOG(INFO, TAG, "Enter IPv4 address:port of the Server hosting secure resource"\ - "(Ex: 11.12.13.14:1234)\n"); - if (fgets(ipv4addr, IPV4_ADDR_SIZE, stdin)) + OIC_LOG(INFO, TAG, "Enter IP address (with optional port) of the Server hosting resource\n"); + 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(ipaddr, sizeof (ipaddr), stdin)) { - //Strip newline char from ipv4addr - StripNewLineChar(ipv4addr); - snprintf(szQueryUri, sizeof(szQueryUri), UNICAST_DISCOVERY_QUERY, ipv4addr); + StripNewLineChar(ipaddr); //Strip newline char from ipaddr } else { - OC_LOG(ERROR, TAG, "!! Bad input for IPV4 address. !!"); + OIC_LOG(ERROR, TAG, "!! Bad input for IP address. !!"); return OC_STACK_INVALID_PARAM; } - method = OC_REST_GET; - } - else - { - //Send discovery request on Wifi and Ethernet interface - discoveryReqConnType = CT_DEFAULT; - OICStrcpy(szQueryUri, sizeof(szQueryUri), MULTICAST_DISCOVERY_QUERY); - method = OC_REST_DISCOVER; } + snprintf(queryUri, sizeof (queryUri), DISCOVERY_QUERY, ipaddr); cbData.cb = discoveryReqCB; cbData.context = NULL; cbData.cd = NULL; /* Start a discovery query*/ - OC_LOG_V(INFO, TAG, "Initiating %s Resource Discovery : %s\n", - (UNICAST_DISCOVERY) ? "Unicast" : "Multicast", - szQueryUri); + OIC_LOG_V(INFO, TAG, "Initiating %s Resource Discovery : %s\n", + (UnicastDiscovery) ? "Unicast" : "Multicast", + queryUri); - ret = OCDoResource(NULL, method, szQueryUri, 0, 0, - discoveryReqConnType, OC_LOW_QOS, - &cbData, NULL, 0); + ret = OCDoRequest(NULL, OC_REST_DISCOVER, queryUri, 0, 0, CT_DEFAULT, + 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; } -FILE* client_fopen(const char *path, const char *mode) +FILE* client_fopen_devowner(const char *path, const char *mode) { (void)path; - return fopen(CRED_FILE, mode); + return fopen(CRED_FILE_DEVOWNER, mode); } +FILE* client_fopen_nondevowner(const char *path, const char *mode) +{ + (void)path; + return fopen(CRED_FILE_NONDEVOWNER, mode); +} int main(int argc, char* argv[]) { int opt; struct timespec timeout; + OCPersistentStorage ps; - while ((opt = getopt(argc, argv, "u:t:c:")) != -1) + while ((opt = getopt(argc, argv, "u:t:c:d:p:")) != -1) { switch(opt) { case 'u': - UNICAST_DISCOVERY = atoi(optarg); + UnicastDiscovery = atoi(optarg); break; case 't': - TEST_CASE = atoi(optarg); + TestCase = atoi(optarg); break; case 'c': - CONN_TYPE = atoi(optarg); + ConnType = atoi(optarg); + break; + case 'd': + DevOwner = atoi(optarg); + break; + case 'p': + { + WithTcp = atoi(optarg); + if(WithTcp > 1) + { + PrintUsage(); + return -1; + } + } break; default: PrintUsage(); @@ -336,39 +388,37 @@ int main(int argc, char* argv[]) } } - if ((UNICAST_DISCOVERY != 0 && UNICAST_DISCOVERY != 1) || - (TEST_CASE < TEST_DISCOVER_REQ || TEST_CASE >= MAX_TESTS)|| - (CONN_TYPE < CT_ADAPTER_DEFAULT || CONN_TYPE >= MAX_CT)) + if ((UnicastDiscovery != 0 && UnicastDiscovery != 1) || + (TestCase < TEST_DISCOVER_REQ || TestCase >= MAX_TESTS)|| + (ConnType < CT_ADAPTER_DEFAULT || ConnType >= MAX_CT)) { PrintUsage(); return -1; } - if(CONN_TYPE == CT_ADAPTER_DEFAULT || CONN_TYPE == CT_IP) + if(ConnType == CT_ADAPTER_DEFAULT || ConnType == CT_IP) { discoveryReqConnType = CT_DEFAULT; } else { - OC_LOG(INFO, TAG, "Using Default Connectivity type"); + OIC_LOG(INFO, TAG, "Using Default Connectivity type"); PrintUsage(); } // Initialize Persistent Storage for SVR database - OCPersistentStorage ps = {}; - ps.open = client_fopen; - ps.read = fread; - ps.write = fwrite; - ps.close = fclose; - ps.unlink = unlink; + if (DevOwner) + ps = { client_fopen_devowner, fread, fwrite, fclose, unlink }; + else + ps = { client_fopen_nondevowner, fread, fwrite, fclose, unlink }; OCRegisterPersistentStorageHandler(&ps); /* Initialize OCStack*/ if (OCInit(NULL, 0, OC_CLIENT_SERVER) != OC_STACK_OK) { - OC_LOG(ERROR, TAG, "OCStack init error"); + OIC_LOG(ERROR, TAG, "OCStack init error"); return 0; } @@ -378,62 +428,70 @@ int main(int argc, char* argv[]) timeout.tv_nsec = 100000000L; // 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; } nanosleep(&timeout, NULL); } - 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 getPortTBServer(OCClientResponse * clientResponse) -{ - if(!clientResponse) return ""; - std::ostringstream ss; - ss << clientResponse->devAddr.port; - return ss.str(); -} - int parseClientResponse(OCClientResponse * clientResponse) { OCResourcePayload* res = ((OCDiscoveryPayload*)clientResponse->payload)->resources; // Initialize all global variables coapServerResource.clear(); - coapServerPort.clear(); - coapServerIP.clear(); coapSecureResource = 0; - while(res) + while (res) { coapServerResource.assign(res->uri); - OC_LOG_V(INFO, TAG, "Uri -- %s", coapServerResource.c_str()); - - if(res->secure) + OIC_LOG_V(INFO, TAG, "Uri -- %s", coapServerResource.c_str()); + if (0 == strcmp(coapServerResource.c_str(),OIC_RSRC_DOXM_URI)) + { + OIC_LOG(INFO,TAG,"Skip: doxm is secure virtual resource"); + res = res->next; + continue; + } + if (0 == strcmp(coapServerResource.c_str(),OIC_RSRC_PSTAT_URI)) + { + OIC_LOG(INFO,TAG,"Skip: pstat is secure virtual resource"); + res = res->next; + continue; + } + if (res->secure) { + if(WithTcp) + { +#ifdef TCP_ADAPTER + OIC_LOG_V(INFO,TAG,"SECUREPORT tcp: %d",res->tcpPort); + endpoint.port = res->tcpPort; +#endif + } + else + { + OIC_LOG_V(INFO,TAG,"SECUREPORT udp: %d",res->port); + endpoint.port = res->port; + } coapSecureResource = 1; } - OC_LOG_V(INFO, TAG, "Secure -- %s", coapSecureResource == 1 ? "YES" : "NO"); - - std::ostringstream ss; - ss << res->port; - coapServerPort = ss.str(); - std::cout<<"PORT: "<next; } - coapServerIP = clientResponse->devAddr.addr; - - if(coapServerPort.length() == 0 || coapServerPort == "0") - { - coapServerPort = getPortTBServer(clientResponse); - OC_LOG_V(INFO, TAG, "Hosting Server Port -- %s", coapServerPort.c_str()); - } - return 0; }