this is using the mbed os version 5-13-1
Revision 99:05398b3184f8, committed 2019-04-22
- Comitter:
- ocomeni
- Date:
- Mon Apr 22 11:11:41 2019 +0000
- Parent:
- 98:65c2333a38b6
- Child:
- 100:80ef4bc31b7a
- Commit message:
- failing at internet url configuration and verification.
Changed in this revision
--- a/source/ATCmdManager.cpp Sun Apr 21 13:06:41 2019 +0000
+++ b/source/ATCmdManager.cpp Mon Apr 22 11:11:41 2019 +0000
@@ -41,7 +41,7 @@
_serial.set_baud(DEFAULT_BAUD_RATE);
_parser.debug_on(debug);
_parser.set_delimiter("\r\n");
- _parser.send("+STARTUP");
+ _parser.send("+STARTUP\r\n");
_parser.oob("AT\n", callback(this, &ATCmdManager::_oob_ok_hdlr));
_parser.oob("ATE0", callback(this, &ATCmdManager::_oob_echo_off));
_parser.oob("ATE1", callback(this, &ATCmdManager::_oob_echo_on));
@@ -124,15 +124,21 @@
at_resp = AT_RESP_NONE;
break;
case AT_CONNECT_RESP:
+ {
// AT_CONNECT_RESP response state
printf("\n [ATCMD MAN] WIFI CONNECT RESPONSE RECEIVED!!\r\n");
//_smutex.lock();
//sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP);
respStr = (char *) resp_data->buffer;
sendAtConfirmationFreeMpool(respStr);
+ char * urc = new char[20];
+ sprintf(urc, "\r\n%s=%d\r\n", NETWORK_UP_URC, WIFI_INTERFACE_ID);
+ sendAtEvent(urc);
+ delete urc;
//_smutex.unlock();
at_resp = AT_RESP_NONE;
break;
+ }
case AT_DISCONNECT_RESP:
// AT_DISCONNECT_RESP response state
//////_smutex.lock();
@@ -215,6 +221,14 @@
//_smutex.unlock();
at_resp = AT_RESP_NONE;
break;
+ case CONNECT_EVENT:
+ {
+ // Connect Event state
+ printf("\n [ATCMD MAN] CONNECT EVENT RECEIVED!!\r\n");
+ sendConnectEvent(resp_data->buffer, resp_data->dataLen);
+ at_resp = AT_RESP_NONE;
+ break;
+ }
case AT_COMMAND_FAILED:
{
// AT_HTTP_RESP response state
@@ -259,13 +273,13 @@
bool ATCmdManager::validate(edm_header_t edm_header)
{
if(edm_header.startByte != EDM_START_BYTE)return false; // unexpected start byte found!
- if(edm_header.payloadID != CONNECT_EVENT &&
- edm_header.payloadID != DISCONNECT_EVENT &&
- edm_header.payloadID != DATA_EVENT &&
- edm_header.payloadID != DATA_COMMAND &&
- edm_header.payloadID != AT_REQUEST &&
- edm_header.payloadID != AT_CONFIRMATION &&
- edm_header.payloadID != AT_EVENT
+ if(edm_header.payloadID != CONNECT_EVENT_ID &&
+ edm_header.payloadID != DISCONNECT_EVENT_ID &&
+ edm_header.payloadID != DATA_EVENT_ID &&
+ edm_header.payloadID != DATA_COMMAND_ID &&
+ edm_header.payloadID != AT_REQUEST_ID &&
+ edm_header.payloadID != AT_CONFIRMATION_ID &&
+ edm_header.payloadID != AT_EVENT_ID
)return false; // unexpected payload ID found!
if(edm_header.payloadLen > MAX_EDM_PAYLOAD_LEN ||
edm_header.payloadLen < MIN_EDM_PAYLOAD_LEN
@@ -413,7 +427,7 @@
start = Kernel::get_ms_count();
if(n == -1) break; // break if it times out
int pT;
- if(edm_hdr.payloadID < AT_REQUEST) //
+ if(edm_hdr.payloadID < AT_REQUEST_ID) //
{
n += _parser.read((char *)edm, 1);
edm_hdr.channel_id = (channel_id_t) edm[0];
@@ -434,7 +448,7 @@
edm_hdr.channel_id);
if(n == (EDM_HDR_LEN-pT) && validate(edm_hdr)) // if AT command use process oob to decode
{
- if(edm_hdr.payloadID == AT_REQUEST)
+ if(edm_hdr.payloadID == AT_REQUEST_ID)
{
//_parser.process_oob();
while (_parser.process_oob() && all) {
@@ -464,16 +478,16 @@
}
switch(edm_hdr.payloadID)
{
- case CONNECT_EVENT:
+ case CONNECT_EVENT_ID:
printf("Connection Event received!\n");
break;
- case DISCONNECT_EVENT:
+ case DISCONNECT_EVENT_ID:
printf("DISCONNECT_EVENT received!\n");
break;
- case DATA_EVENT:
+ case DATA_EVENT_ID:
printf("DATA_EVENT received!\n");
break;
- case DATA_COMMAND:
+ case DATA_COMMAND_ID:
{
printf("DATA_COMMAND received!\n");
sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP);
@@ -493,13 +507,13 @@
printf("\n Time Elapsed = %d\n", stop-start);
break;
}
- case AT_REQUEST:
+ case AT_REQUEST_ID:
printf("AT_REQUEST received!\n");
break;
- case AT_CONFIRMATION:
+ case AT_CONFIRMATION_ID:
printf("AT_CONFIRMATION received!\n");
break;
- case AT_EVENT:
+ case AT_EVENT_ID:
printf("AT_EVENT received!\n");
break;
default:
@@ -612,7 +626,7 @@
//_smutex.lock();
printf("\n Received EDM mode command!!\n");
if(_parser.scanf("%d", &dataMode) >0) {
- printf("\nATCmdParser: Data mode=%d\n", dataMode);
+ printf("\nATCmdParser: Data mode=%d\r\n", dataMode);
sendAtConfirmation(OK_RESP); //_parser.send(OK_RESP);
switch(dataMode)
{
@@ -1079,6 +1093,7 @@
if(evt.status == osEventMessage){
resp_data = (at_data_msg_t*)evt.value.p;
setNextResponse(resp_data->at_resp);
+ printf("[ATCMD MAN] dequeued data size = %d : at_resr = %d\n", resp_data->dataLen, resp_data->at_resp);
_event_queue.call_in(10, &print_heap_and_isr_stack_info);
//print_heap_and_isr_stack_info();
}
@@ -1120,16 +1135,36 @@
_parser.send(buf);
break;
case AT_EXT_DATA_MODE:
+ {
int len = strlen(buf);
outputEDMdata((const uint8_t *) buf, len, AT_MSG_ID, EVENT_MSG_TYPE, NO_CHANNEL);
break;
- //default:
- //_parser.send(buf);
- //break;
+ }
+ default:
+ _parser.send(buf);
+ break;
}
_smutex.unlock();
}
+
+void ATCmdManager::sendConnectEvent(const uint8_t *buf, int len)
+{
+ //_smutex.lock();
+ switch(dataMode){
+ case AT_CMD_DATA_MODE:
+ _parser.send((const char*) buf);
+ break;
+ case AT_STD_DATA_MODE:
+ _parser.send((const char*)buf);
+ break;
+ case AT_EXT_DATA_MODE:
+ outputEDMdata((const uint8_t *) buf, len, CONNECT_MSG_ID, EVENT_MSG_TYPE, WIFI_CHANNEL);
+ break;
+ }
+}
+
+
void ATCmdManager::outputEDMdata(const uint8_t *buf, int pLen,
edm_msg_id_t identifier, edm_msg_type_t type,
channel_id_t channel_id)
--- a/source/ATCmdManager.h Sun Apr 21 13:06:41 2019 +0000
+++ b/source/ATCmdManager.h Mon Apr 22 11:11:41 2019 +0000
@@ -120,6 +120,7 @@
void sendAtConfirmation(const char *buf);
void sendAtConfirmationFreeMpool(const char *buf);
void sendAtEvent(const char *buf);
+ void sendConnectEvent(const uint8_t *buf, int len);
/**
* Allows timeout to be changed between commands
--- a/source/WiFiManager.cpp Sun Apr 21 13:06:41 2019 +0000
+++ b/source/WiFiManager.cpp Mon Apr 22 11:11:41 2019 +0000
@@ -70,7 +70,7 @@
void WiFiManager::runMain(){
nsapi_error_t error;
- bool httpReqResult;
+ bool result;
printf("\r\n [WIFI MAN] Thread Id = %X\r\n", (uint32_t)ThisThread::get_id());
while(true){
dequeueWiFiCommands();
@@ -123,8 +123,15 @@
queueATresponse(AT_CONFIG_RESP);
break;
case WIFI_CMD_INTERNET_CONFIG:
- set_internet_config();
- queueATresponse(AT_INTERNET_CONFIG_RESP);
+ result = set_internet_config();
+ if(result == true)
+ {
+ queueATresponse(AT_INTERNET_CONFIG_RESP);
+ }
+ else
+ {
+ sendATresponseString(AT_COMMAND_FAILED);
+ }
wifiCmd = WIFI_CMD_NONE;
break;
case WIFI_CMD_NETWORK_STATUS:
@@ -140,8 +147,8 @@
case WIFI_CMD_SEND_HTTPS_REQ:
printf("before call to send http request \n");
print_memory_info();
- httpReqResult = createHttpsRequest();
- if(httpReqResult == false)
+ result = createHttpsRequest();
+ if(result == false)
{
sendATresponseString(AT_COMMAND_FAILED);
}
@@ -164,12 +171,11 @@
{
int strLen = strlen(responseString) + 1;
at_data_resp = new at_data_msg_t;
- // create message pointer for response header generation
- char * msgPtr = (char *)at_data_resp->buffer;
// set string length
at_data_resp->dataLen = strLen;
memcpy(at_data_resp->buffer, responseString, strLen);
free(responseString);
+ responseString = NULL;
// package and send on wifi data queue
at_data_resp->at_resp = at_cmd;
bool queueResult = true;
@@ -184,8 +190,38 @@
queueResult = queueWiFiDataResponse(*at_data_resp);
}while(queueResult == false);
delete at_data_resp;
+ at_data_resp = NULL;
}
+
+void WiFiManager::sendATresponseBytes(at_cmd_resp_t at_cmd, int len)
+{
+ at_data_resp = new at_data_msg_t;
+ // set string length
+ at_data_resp->dataLen = len;
+ memcpy(at_data_resp->buffer, responseBytes, len);
+ free(responseBytes);
+ responseBytes = NULL;
+ // package and send on wifi data queue
+ at_data_resp->at_resp = at_cmd;
+ bool queueResult = true;
+ int wait_count = 0;
+ do
+ {
+ if(!queueResult){
+ wait_count++;
+ wait_ms(10);
+ printf("ATCMD Queue full waited %d ms so far...\n", wait_count*10);
+ }
+ queueResult = queueWiFiDataResponse(*at_data_resp);
+ }while(queueResult == false);
+ delete at_data_resp;
+ at_data_resp = NULL;
+ printf("[WIFI-MAN] sendATresponseBytes completed successfully\r\n");
+}
+
+
+
bool WiFiManager::dequeueWiFiCommands(){
if(wifiCmd != WIFI_CMD_NONE) return false; // busy
osEvent evt = _aT2WiFiCmdQueue->get(0);
@@ -329,7 +365,7 @@
-void WiFiManager::set_internet_config()
+bool WiFiManager::set_internet_config()
{
internet_config_t *internet_cfg = (internet_config_t *) data_msg->buffer;
internet_config.peer_id = internet_cfg->peer_id;
@@ -340,8 +376,30 @@
printf("peer_id = %1d, url = %s, connScheme = %1d\n", internet_config.peer_id,
internet_config.url,
internet_config.connectionScheme);
- https_connection_active = false; // reset whenever any of the security credentials change
- delete socket;
+ if(https_connection_active)
+ {
+ https_connection_active = false; // reset whenever any of the security credentials change
+ socket->close(); // close socket before deleting memory
+ 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;
+ }
}
@@ -548,6 +606,42 @@
}
+void WiFiManager::gethostbyname_callback(nsapi_error_t result, SocketAddress *address)
+{
+ printf("gethostbyname_callback called... result = %d \r\n", result);
+ responseBytes = (uint8_t *) malloc(HOSTNAME_RESPONSE_LEN);
+ int i = 0;
+ responseBytes[i++] = IPv4_CONNECTION; // connect type IPv4
+ responseBytes[i++] = TCP_PROTOCOL; // Protocol = TCP
+ memcpy(&responseBytes[i], address->get_ip_bytes(), 4); // remote IPv4 address
+ i +=4;
+ int port = address->get_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]);
+ responseBytes[i++] = (uint8_t) ipAddr[0];
+ responseBytes[i++] = (uint8_t) ipAddr[1];
+ responseBytes[i++] = (uint8_t) ipAddr[2];
+ responseBytes[i++] = (uint8_t) ipAddr[3];
+ // local port number
+ responseBytes[i++] = 0;
+ responseBytes[i] = 0;
+ printBufferInHex(responseBytes, HOSTNAME_RESPONSE_LEN);
+ }
+ else
+ {
+ // if unconnected set ip and port to zeroes
+ memset(&responseBytes[i], 0x00, 6);
+ }
+ sendATresponseBytes(CONNECT_EVENT, HOSTNAME_RESPONSE_LEN);
+}
+
+
nsapi_error_t WiFiManager::disconnect()
{
nsapi_error_t error;
@@ -726,8 +820,9 @@
r = socket->set_root_ca_cert(SSL_CA_PEM);
if(r != NSAPI_ERROR_OK)
{
+ printf("TLS set_root_ca_cert failed!!\n");
socket->close();
- printf("TLS set_root_ca_cert failed!!\n");
+ printf("closing TLS socket!!\n");
return false;
}
printf("TLS set_root_ca_cert passed!!\n");
--- a/source/WiFiManager.h Sun Apr 21 13:06:41 2019 +0000
+++ b/source/WiFiManager.h Mon Apr 22 11:11:41 2019 +0000
@@ -50,6 +50,7 @@
bool https_connection_active;
TLSSocket* socket;
char* responseString; // response string formated for Box
+ uint8_t* responseBytes; // response bytes formated for Box
wifi_cmd_t wifiCmd;
//at_data_msg_t *at_data_resp;
int chunkNum;
@@ -79,7 +80,7 @@
void set_WIFI_PASSWORD(char * wifi_pass);
void set_WIFI_SECURITY(nsapi_security_t wifi_security);
void set_WIFI_CONFIG();
- void set_internet_config();
+ bool set_internet_config();
nsapi_error_t connect();
nsapi_error_t disconnect();
bool createHttpsRequest();
@@ -107,9 +108,11 @@
void printBufferInHex(uint8_t *buf, int pLen);
bool copyResponseHdr2Queue();
void sendATresponseString(at_cmd_resp_t);
+ void sendATresponseBytes(at_cmd_resp_t at_cmd, int len);
void getNetworkStatus();
void getWiFiStatus();
void status_callback_event(nsapi_event_t status, intptr_t param);
+ void gethostbyname_callback(nsapi_error_t result, SocketAddress *address);
/**
--- a/source/common_config.h Sun Apr 21 13:06:41 2019 +0000 +++ b/source/common_config.h Mon Apr 22 11:11:41 2019 +0000 @@ -15,13 +15,21 @@ #define WIFI_CONNECT_TIMEOUT_SECS 10 #define MAX_RESPONSE_STRING_LEN 512 // maximum response string length of 512 bytes #define DEFAULT_WIFI_CHANNEL 0 +#define DEFAULT_BTLE_CHANNEL 1 #define WIFI_LINK_ENABLED "+UUWLE:" +#define NETWORK_UP_URC "+UUNU" #define NETWORK_STATUS "+UNSTAT=" #define WIFI_NETWORK_STATUS "+UWSSTAT=" +#define UDDRP_ERROR "\r\nERROR\r\n" +#define UDDRP_WRITE_OK "\r\nOK\r\n" +#define HOSTNAME_RESPONSE_LEN 14 #define WIFI_STATION 1 #define WIFI_CONFIG_ID 0 #define WIFI_INTERFACE_ID 0 #define DEFAULT_DNS_ADDRESS "0.0.0.0" +#define TCP_PROTOCOL 0 +#define UDP_PROTOCOL 1 +#define IPv4_CONNECTION 0x02 #define PQDSZ 2 // size of Pool/Queue data structures typedef enum
--- a/source/common_types.h Sun Apr 21 13:06:41 2019 +0000
+++ b/source/common_types.h Mon Apr 22 11:11:41 2019 +0000
@@ -85,6 +85,8 @@
AT_HTTPS_RESP_DOWNLOAD,
AT_HTTP_RESP,
AT_HTTP_RESP_DOWNLOAD,
+ CONNECT_EVENT,
+ DATA_EVENT,
AT_COMMAND_FAILED
}at_cmd_resp_t;
@@ -125,13 +127,13 @@
typedef enum edm_payload_id
{
- CONNECT_EVENT = 0x0011,
- DISCONNECT_EVENT = 0x0021,
- DATA_EVENT = 0x0031,
- DATA_COMMAND = 0x0036,
- AT_REQUEST = 0x0044,
- AT_CONFIRMATION = 0x0045,
- AT_EVENT = 0x0041
+ CONNECT_EVENT_ID = 0x0011,
+ DISCONNECT_EVENT_ID = 0x0021,
+ DATA_EVENT_ID = 0x0031,
+ DATA_COMMAND_ID = 0x0036,
+ AT_REQUEST_ID = 0x0044,
+ AT_CONFIRMATION_ID = 0x0045,
+ AT_EVENT_ID = 0x0041
}edm_payload_id_t;
typedef enum conn_scheme
--- a/source/main-https.cpp Sun Apr 21 13:06:41 2019 +0000
+++ b/source/main-https.cpp Mon Apr 22 11:11:41 2019 +0000
@@ -409,6 +409,10 @@
int main() {
//print_all_thread_info();
//print_heap_and_isr_stack_info();
+#ifdef MBED_MAJOR_VERSION
+ printf("Mbed OS version %d.%d.%d\n\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
+#endif
+
reset_counter++;
print_memory_info();
printf("\r\n ++++++ PROGRAM STARTING -- reset count = %d ++++++ \r\n", reset_counter);