void send_response(const CAEndpoint_t *endpoint, const CAInfo_t *info) { printf("entering send_response\n"); printf("\n=============================================\n"); printf("\tselect message type\n"); printf("CON : 0\n"); printf("NON : 1\n"); printf("ACK : 2\n"); printf("RESET : 3\n"); printf("select : "); char buf[MAX_BUF_LEN] = { 0 }; if (CA_STATUS_OK != get_input_data(buf, MAX_BUF_LEN)) { return; } int messageType = buf[0] - '0'; if (0 > messageType || 3 < messageType) { printf("Invalid message type\n"); return; } int responseCode = 0 ; char responseCodeBuf[MAX_BUF_LEN] = { 0 }; if (CA_MSG_RESET != messageType) { printf("\n=============================================\n"); printf("\tselect response code\n"); printf("EMPTY : 0\n"); printf("SUCCESS : 200\n"); printf("CREATED : 201\n"); printf("DELETED : 202\n"); printf("VALID : 203\n"); printf("CHANGED : 204\n"); printf("CONTENT : 205\n"); printf("BAD_REQ : 400\n"); printf("BAD_OPT : 402\n"); printf("NOT_FOUND : 404\n"); printf("INTERNAL_SERVER_ERROR : 500\n"); printf("RETRANSMIT_TIMEOUT : 504\n"); printf("select : "); if (CA_STATUS_OK != get_input_data(responseCodeBuf, MAX_BUF_LEN)) { return; } responseCode = atoi(responseCodeBuf); } // create response data uint16_t messageId = (info != NULL) ? info->messageId : 0; CAURI_t resourceUri = (info != NULL) ? info->resourceUri : 0; CAInfo_t responseData = { .type = messageType, .messageId = messageId, .token = NULL, .tokenLength = 0, .options = NULL, .numOptions = 0, .payload = NULL, .payloadSize = 0, .resourceUri = resourceUri }; if(CA_MSG_RESET != messageType) { responseData.token = (info != NULL) ? info->token : NULL; responseData.tokenLength = (info != NULL) ? info->tokenLength : 0; if (endpoint->flags & CA_SECURE) { if(!responseData.resourceUri) { printf("resourceUri not available in SECURE\n"); return; } printf("Sending response on secure communication\n"); uint32_t length = sizeof(SECURE_INFO_DATA) + strlen(responseData.resourceUri); responseData.payload = (CAPayload_t) calloc(length, sizeof(char)); if (NULL == responseData.payload) { printf("Memory allocation fail\n"); return; } snprintf((char *) responseData.payload, length, SECURE_INFO_DATA, (const char *) responseData.resourceUri, g_local_secure_port); responseData.payloadSize = length; } else { printf("Sending response on non-secure communication\n"); bool useBigPayload = select_payload_type(); if (useBigPayload) { size_t payloadLength = 0; CAPayload_t binaryPayload = get_binary_payload(&payloadLength); if (NULL == binaryPayload) { free(binaryPayload); return; } responseData.payload = (CAPayload_t) malloc(payloadLength); if (NULL == responseData.payload) { printf("Memory allocation failed!"); free(binaryPayload); return; } memcpy(responseData.payload, binaryPayload, payloadLength); responseData.payloadSize = payloadLength; // memory free free(binaryPayload); } else { if(!responseData.resourceUri) { printf("resourceUri not available in NON-SECURE\n"); return; } uint32_t length = sizeof(NORMAL_INFO_DATA) + strlen(responseData.resourceUri); responseData.payload = (CAPayload_t) calloc(length, sizeof(char)); if (NULL == responseData.payload) { printf("Memory allocation fail\n"); return; } snprintf((char *) responseData.payload, length, NORMAL_INFO_DATA, (const char *) responseData.resourceUri); responseData.payloadSize = length; } } } CAResponseInfo_t responseInfo = { .result = responseCode, .info = responseData }; // send response (transportType from remoteEndpoint of request Info) CAResult_t res = CASendResponse(endpoint, &responseInfo); if (CA_STATUS_OK != res) { printf("Send response error\n"); } else { printf("Send response success\n"); } if (responseData.payload) { free(responseData.payload); } printf("=============================================\n"); } int get_secure_information(CAPayload_t payLoad) { printf("Entering get_secure_information\n"); if (!payLoad) { printf("Payload is NULL\n"); return -1; } char *subString = NULL; if (NULL == (subString = strstr((const char *) payLoad, "\"sec\":1"))) { printf("This is not secure resource\n"); return -1; } if (NULL == (subString = strstr((const char *) payLoad, "\"port\":"))) { printf("This secure resource does not have port information\n"); return -1; } char *startPos = strstr(subString, ":"); if (!startPos) { printf("Parsing failed !\n"); return -1; } char *endPos = strstr(startPos, "}"); if (!endPos) { printf("Parsing failed !\n"); return -1; } char portStr[6] = {0}; OICStrcpyPartial(portStr, sizeof(portStr), startPos + 1, (endPos - 1) - startPos); printf("secured port is: %s\n", portStr); return atoi(portStr); }
void send_request() { CATransportFlags_t flags = CA_DEFAULT_FLAGS; CAResult_t res = get_network_type(&flags); if (CA_STATUS_OK != res) { return; } printf("Do you want to send secure request ?.... enter (0/1): "); char secureRequest[MAX_BUF_LEN] = {0}; if (CA_STATUS_OK != get_input_data(secureRequest, MAX_BUF_LEN)) { return; } if (strcmp(secureRequest, "1") == 0) { printf("Enter the URI like below....\n"); printf("coaps://10.11.12.13:4545/resource_uri ( for IP secure)\n"); } else if (strcmp(secureRequest, "0") == 0) { printf("Enter the URI like below....\n"); printf("coap://10.11.12.13:4545/resource_uri ( for IP )\n"); printf("coap://10:11:12:13:45:45/resource_uri ( for BT )\n"); printf("coap+tcp://10:11:12:13:45:45/resource_uri ( for TCP )\n"); } else { printf("Input data is wrong value\n"); return; } char uri[MAX_BUF_LEN] = {'\0'}; if (CA_STATUS_OK != get_input_data(uri, MAX_BUF_LEN)) { return; } printf("URI : %s\n", uri); addressSet_t address = {{}, 0}; parsing_coap_uri(uri, &address, &flags); // create remote endpoint CAEndpoint_t *endpoint = NULL; res = CACreateEndpoint(flags, g_selected_nw_type, (const char*)address.ipAddress, address.port, &endpoint); if (CA_STATUS_OK != res || !endpoint) { printf("Failed to create remote endpoint, error code : %d\n", res); return; } printf("\n=============================================\n"); printf("0:CON, 1:NON\n"); printf("select message type : "); char buf[MAX_BUF_LEN] = { 0 }; if (CA_STATUS_OK != get_input_data(buf, MAX_BUF_LEN)) { CADestroyEndpoint(endpoint); return; } CAMessageType_t msgType = (buf[0] == '1') ? 1 : 0; // create token CAToken_t token = NULL; uint8_t tokenLength = CA_MAX_TOKEN_LEN; res = CAGenerateToken(&token, tokenLength); if ((CA_STATUS_OK != res) || (!token)) { printf("Token generate error, error code : %d\n", res); CADestroyEndpoint(endpoint); return; } // extract relative resourceuri from give uri char resourceURI[RESOURCE_URI_LENGTH + 1] = {0}; get_resource_uri(uri, resourceURI, RESOURCE_URI_LENGTH); printf("resourceURI : %s\n", resourceURI); // create request data CAInfo_t requestData = { .type = msgType, .messageId = 0, .token = token, .tokenLength = tokenLength, .options = NULL, .numOptions = 0, .payload = NULL, .payloadSize = 0, .resourceUri = (CAURI_t)resourceURI }; if (strcmp(secureRequest, "1") == 0) { size_t length = sizeof(SECURE_INFO_DATA) + strlen(resourceURI); requestData.payload = (CAPayload_t) calloc(length, sizeof(char)); if (NULL == requestData.payload) { printf("Memory allocation fail\n"); goto exit; } snprintf((char *) requestData.payload, length, SECURE_INFO_DATA, (const char *) resourceURI, g_local_secure_port); requestData.payloadSize = length; } else { bool useBigPayload = select_payload_type(); if (useBigPayload) { size_t payloadLength = 0; CAPayload_t binaryPayload = get_binary_payload(&payloadLength); if (!binaryPayload) { free(binaryPayload); goto exit; } requestData.payload = (CAPayload_t) malloc(payloadLength); if (NULL == requestData.payload) { printf("Memory allocation failed!"); free(binaryPayload); goto exit; } memcpy(requestData.payload, binaryPayload, payloadLength); requestData.payloadSize = payloadLength; // memory free free(binaryPayload); } else { size_t length = sizeof(NORMAL_INFO_DATA) + strlen(resourceURI); requestData.payload = (CAPayload_t) calloc(length, sizeof(char)); if (NULL == requestData.payload) { printf("Memory allocation fail\n"); goto exit; } snprintf((char *) requestData.payload, length, NORMAL_INFO_DATA, (const char *) resourceURI); requestData.payloadSize = length; } } CAHeaderOption_t* headerOpt = get_option_data(&requestData); CARequestInfo_t requestInfo = { .method = CA_GET, .info = requestData, .isMulticast = false }; // send request res = CASendRequest(endpoint, &requestInfo); if (CA_STATUS_OK != res) { printf("Could not send request : %d\n", res); } free(headerOpt); free(requestData.payload); exit: // cleanup CADestroyToken(token); CADestroyEndpoint(endpoint); printf("=============================================\n"); } void send_secure_request() { char uri[MAX_BUF_LEN]; char ipv4addr[CA_IPADDR_SIZE]; printf("\n=============================================\n"); printf("Enter IPv4 address of the source hosting secure resource (Ex: 11.12.13.14)\n"); if (CA_STATUS_OK != get_input_data(ipv4addr, CA_IPADDR_SIZE)) { return; } snprintf(uri, MAX_BUF_LEN, "%s%s:5684/a/light", COAPS_PREFIX, ipv4addr); // create remote endpoint CAEndpoint_t *endpoint = NULL; CAResult_t res = CACreateEndpoint(0, CA_ADAPTER_IP, ipv4addr, SECURE_DEFAULT_PORT, &endpoint); if (CA_STATUS_OK != res) { printf("Failed to create remote endpoint, error code: %d\n", res); goto exit; } // create token CAToken_t token = NULL; uint8_t tokenLength = CA_MAX_TOKEN_LEN; res = CAGenerateToken(&token, tokenLength); if (CA_STATUS_OK != res) { printf("Token generate error, error code : %d\n", res); goto exit; } // create request data CAInfo_t requestData = { .type = CA_MSG_NONCONFIRM, .messageId = 0, .token = token, .tokenLength = tokenLength, .options = NULL, .numOptions = 0, .payload = NULL, .payloadSize = 0, .resourceUri = NULL }; CARequestInfo_t requestInfo = { .method = CA_GET, .info = requestData, .isMulticast = false }; // send request CASendRequest(endpoint, &requestInfo); exit: // cleanup CADestroyToken(token); CADestroyEndpoint(endpoint); printf("=============================================\n"); } void send_request_all() { CATransportFlags_t flags = CA_DEFAULT_FLAGS; CAResult_t res = get_network_type(&flags); if (CA_STATUS_OK != res) { return; } printf("\n=============================================\n"); printf("ex) /a/light\n"); printf("resource uri : "); char resourceURI[MAX_BUF_LEN] = { 0 }; if (CA_STATUS_OK != get_input_data(resourceURI, MAX_BUF_LEN)) { return; } // create remote endpoint CAEndpoint_t *group = NULL; res = CACreateEndpoint(flags, g_selected_nw_type, NULL, 0, &group); if (CA_STATUS_OK != res) { printf("Create remote endpoint error, error code: %d\n", res); return; } // create token CAToken_t token = NULL; uint8_t tokenLength = CA_MAX_TOKEN_LEN; res = CAGenerateToken(&token, tokenLength); if ((CA_STATUS_OK != res) || (!token)) { printf("Token generate error!!\n"); CADestroyEndpoint(group); return; } // create request data CAPayload_t payload = (CAPayload_t) "TempJsonPayload"; size_t payloadSize = strlen((const char *) payload); CAInfo_t requestData = { .type = CA_MSG_NONCONFIRM, .messageId = 0, .token = token, .tokenLength = tokenLength, .options = NULL, .numOptions = 0, .payload = payload, .payloadSize = payloadSize, .resourceUri = (CAURI_t) resourceURI }; CARequestInfo_t requestInfo = { .method = CA_GET, .info = requestData, .isMulticast = true }; CAHeaderOption_t* headerOpt = get_option_data(&requestData); // send request res = CASendRequest(group, &requestInfo); if (CA_STATUS_OK != res) { printf("Could not send request to all\n"); CADestroyToken(token); } else { CADestroyToken(g_last_request_token); g_last_request_token = token; } free(headerOpt); // destroy remote endpoint CADestroyEndpoint(group); printf("=============================================\n"); } void send_notification() { CATransportFlags_t flags = CA_DEFAULT_FLAGS; CAResult_t res = get_network_type(&flags); if (CA_STATUS_OK != res) { return; } printf("\n=============================================\n"); printf("Enter the URI like below....\n"); printf("coap://10.11.12.13:4545/resource_uri ( for IP )\n"); printf("coap://10:11:12:13:45:45/resource_uri ( for BT )\n"); printf("coap+tcp://10:11:12:13:45:45/resource_uri ( for TCP )\n"); printf("uri : "); char uri[MAX_BUF_LEN] = { 0 }; if (CA_STATUS_OK != get_input_data(uri, MAX_BUF_LEN)) { return; } printf("\n=============================================\n"); printf("\tselect message type\n"); printf("CON : 0\n"); printf("NON : 1\n"); printf("ACK : 2\n"); printf("RESET : 3\n"); printf("select : "); char messageTypeBuf[MAX_BUF_LEN] = { 0 }; if (CA_STATUS_OK != get_input_data(messageTypeBuf, MAX_BUF_LEN)) { return; } int messageType = messageTypeBuf[0] - '0'; addressSet_t address = {{}, 0}; parsing_coap_uri(uri, &address, &flags); // create remote endpoint CAEndpoint_t *endpoint = NULL; res = CACreateEndpoint(flags, g_selected_nw_type, address.ipAddress, address.port, &endpoint); if (CA_STATUS_OK != res) { printf("Create remote endpoint error, error code: %d\n", res); return; } // create token CAToken_t token = NULL; uint8_t tokenLength = CA_MAX_TOKEN_LEN; res = CAGenerateToken(&token, tokenLength); if ((CA_STATUS_OK != res) || (!token)) { printf("Token generate error!!\n"); CADestroyEndpoint(endpoint); return; } // create response data CAPayload_t payload = (CAPayload_t) "TempNotificationData"; size_t payloadSize = strlen((const char *) payload); CAInfo_t requestData = { .type = messageType, .messageId = 0, .token = token, .tokenLength = tokenLength, .options = NULL, .numOptions = 0, .payload = payload, .payloadSize = payloadSize, .resourceUri = (CAURI_t) uri }; CARequestInfo_t requestInfo = { .method = CA_GET, .info = requestData }; // send request res = CASendRequest(endpoint, &requestInfo); if (CA_STATUS_OK != res) { printf("Send notification error, error code: %d\n", res); } else { printf("Send notification success\n"); } // destroy token CADestroyToken(token); // destroy remote endpoint CADestroyEndpoint(endpoint); printf("\n=============================================\n"); } void select_network() { printf("\n=============================================\n"); printf("\tselect network\n"); printf("IP : 0\n"); printf("GATT : 1\n"); printf("RFCOMM : 2\n"); printf("TCP : 4\n"); printf("select : "); char buf[MAX_BUF_LEN] = { 0 }; if (CA_STATUS_OK != get_input_data(buf, MAX_BUF_LEN)) { return; } int number = buf[0] - '0'; if (number < 0 || number > 4) { printf("Invalid network type\n"); return; } CAResult_t res = CASelectNetwork(1 << number); if (CA_STATUS_OK != res) { printf("Select network error\n"); } else { printf("Select network success\n"); } printf("=============================================\n"); }