Okundu Omeni
/
wifi-https-ble-sm-uart-atcmd-5-13-1
this is using the mbed os version 5-13-1
Diff: source/WiFiManager.cpp
- Revision:
- 100:80ef4bc31b7a
- Parent:
- 99:05398b3184f8
- Child:
- 101:1cfd468e5009
--- a/source/WiFiManager.cpp Mon Apr 22 11:11:41 2019 +0000 +++ b/source/WiFiManager.cpp Mon Apr 22 18:34:31 2019 +0000 @@ -33,6 +33,7 @@ wifiCmd = WIFI_CMD_NONE; internet_config.connectionScheme = ALWAYS_CONNECTED; // set default connection scheme is_connected = false; + http_response = NULL; chunkNum = 0; socket = NULL; https_connection_active = false; @@ -123,15 +124,8 @@ queueATresponse(AT_CONFIG_RESP); break; case WIFI_CMD_INTERNET_CONFIG: - result = set_internet_config(); - if(result == true) - { - queueATresponse(AT_INTERNET_CONFIG_RESP); - } - else - { - sendATresponseString(AT_COMMAND_FAILED); - } + set_internet_config(); + queueATresponse(AT_INTERNET_CONFIG_RESP); wifiCmd = WIFI_CMD_NONE; break; case WIFI_CMD_NETWORK_STATUS: @@ -363,9 +357,30 @@ delete socket; } - +void WiFiManager::gethostbyname() +{ + nsapi_value_or_error_t value_or_error; + value_or_error = network->gethostbyname_async(internet_config.url, + callback(this, &WiFiManager::gethostbyname_callback), + NSAPI_UNSPEC); + if(value_or_error >= NSAPI_ERROR_OK) // success + { + printf("[WIFI-MAN] hostname translation successful value_or_error = %d\r\n", value_or_error); + //strcpy(responseString, UDDRP_WRITE_OK); + //printBufferInHex(responseBytes, HOSTNAME_RESPONSE_LEN); + //sendATresponseBytes(CONNECT_EVENT, HOSTNAME_RESPONSE_LEN); + } + else // -ve number means error + { + responseString = (char *) malloc(20); + printf("[WIFI-MAN] hostname translation failed\r\n"); + strcpy(responseString, UDDRP_ERROR); + sendATresponseString(AT_COMMAND_FAILED); + } -bool WiFiManager::set_internet_config() +} + +void WiFiManager::set_internet_config() { internet_config_t *internet_cfg = (internet_config_t *) data_msg->buffer; internet_config.peer_id = internet_cfg->peer_id; @@ -383,23 +398,7 @@ delete socket; socket = NULL; } - nsapi_value_or_error_t value_or_error; - value_or_error = network->gethostbyname_async(internet_config.url, - callback(this, &WiFiManager::gethostbyname_callback), - NSAPI_UNSPEC); - if(value_or_error >= NSAPI_ERROR_OK) // success - { - printf("[WIFI-MAN] hostname translation successful value_or_error = %d\r\n", value_or_error); - //strcpy(responseString, UDDRP_WRITE_OK); - return true; - } - else // -ve number means error - { - responseString = (char *) malloc(20); - printf("[WIFI-MAN] hostname translation failed\r\n"); - strcpy(responseString, UDDRP_ERROR); - return false; - } + _event_queue.call_in(10, this, &WiFiManager::gethostbyname); } @@ -614,16 +613,19 @@ responseBytes[i++] = IPv4_CONNECTION; // connect type IPv4 responseBytes[i++] = TCP_PROTOCOL; // Protocol = TCP memcpy(&responseBytes[i], address->get_ip_bytes(), 4); // remote IPv4 address + strcpy(internet_config.remote_IPv4Address, address->get_ip_address()); i +=4; - int port = address->get_port(); + uint16_t port = address->get_port(); + internet_config.remote_port = port; memcpy(&responseBytes[i], &port, 2); // remote IPv4 port # i +=2; if(is_connected) { // local IPv4 address int ipAddr[4]; - sscanf(network->get_ip_address(), "%d.%d.%d.%d", &ipAddr[0], &ipAddr[1], - &ipAddr[2], &ipAddr[3]); + strcpy(internet_config.local_IPv4Address, network->get_ip_address()); + sscanf(internet_config.local_IPv4Address, "%d.%d.%d.%d", &ipAddr[0], &ipAddr[1], + &ipAddr[2], &ipAddr[3]); responseBytes[i++] = (uint8_t) ipAddr[0]; responseBytes[i++] = (uint8_t) ipAddr[1]; responseBytes[i++] = (uint8_t) ipAddr[2]; @@ -638,9 +640,25 @@ // if unconnected set ip and port to zeroes memset(&responseBytes[i], 0x00, 6); } - sendATresponseBytes(CONNECT_EVENT, HOSTNAME_RESPONSE_LEN); + _event_queue.call_in(2, this, &WiFiManager::sendATresponseBytes, + CONNECT_EVENT, HOSTNAME_RESPONSE_LEN); } +void WiFiManager::sendSocketConnectionEvent() +{ + // + responseString = (char *) malloc(MAX_RESPONSE_STRING_LEN); + sprintf(responseString, "\r\n%s%d,%d,%d,%s,%d,%s,%d\r\n", PEER_CONNECTED_URC, + IP_PEER_HANDLE, + IPv4_CONNECTION, + TCP_PROTOCOL, + internet_config.local_IPv4Address, + DEFAULT_LOCAL_PORT, + internet_config.remote_IPv4Address, + internet_config.remote_port); + sendATresponseString(AT_EVENT); +} + nsapi_error_t WiFiManager::disconnect() { @@ -698,6 +716,7 @@ }while(queueResult == false || pos < bufLen); printf("[WIFI-MAN] response data queued - deleting data memory\r\n"); delete at_data_resp; + at_data_resp = NULL; } bool WiFiManager::copyResponseHdr2Queue() @@ -706,7 +725,12 @@ // create message pointer for response header generation char * msgPtr = (char *)at_data_resp->buffer; // do status line - printf("before getting HTTP status line\n"); + if(http_response == NULL) + { + printf("[WIFI-MAN] copy failed: response pointer NULL!!\r\n"); + return false; + } + printf("before getting HTTP status line http_response = 0x%08X\n", http_response); numChars = sprintf(msgPtr, "HTTP/1.1 %d %s\r\n", http_response->get_status_code(), http_response->get_status_message().c_str()); msgPtr += numChars; @@ -780,6 +804,7 @@ queueResult = queueWiFiDataResponse(*at_data_resp); }while(queueResult == false); delete at_data_resp; + at_data_resp = NULL; } @@ -838,6 +863,20 @@ printf("TLS connection successful for https site : %s\n", hostName); return true; } + + +void WiFiManager::updateRemotePeerDetails() +{ + printf("Updating internet_config... \r\n"); + nsapi_error_t error; + SocketAddress * address = new SocketAddress; + error = socket->getpeername(address); + strcpy(internet_config.remote_IPv4Address, address->get_ip_address()); + uint16_t port = address->get_port(); + internet_config.remote_port = port; + delete address; +} + #define TESTING_HTTPS //#define DONT_USE_TLS_SOCKET @@ -921,6 +960,11 @@ printf("data msg deleted \r\n"); return false; } + // update remote peer details after socket connection + updateRemotePeerDetails(); + // send socket connection event before proceeding to send https request + // give about 2 ms + _event_queue.call_in(2, this, &WiFiManager::sendSocketConnectionEvent); //printf("[create https] TLS connection successful for https site : %s\n", host); //printf("after call to createTLSconnection \n"); //print_memory_info(); @@ -1015,6 +1059,7 @@ delete https_request; // free the request & response memory printf("deleted https_request\r\n"); https_request = NULL; + http_response = NULL; return true; }