/**
******************************************************************************
* @file es-wifi.c
* @author MCD Application Team
* @date 2018-06-06
* @brief This file provides a set of functions to manage the es-wifi module.
******************************************************************************
* @attention
*
*
© Copyright (c) 2017 STMicroelectronics International N.V.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted, provided that the following conditions are met:
*
* 1. Redistribution of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of STMicroelectronics nor the names of other
* contributors to this software may be used to endorse or promote products
* derived from this software without specific written permission.
* 4. This software, including modifications and/or derivative works of this
* software, must execute solely and exclusively on microcontroller or
* microprocessor devices manufactured by or for STMicroelectronics.
* 5. Redistribution and use of this software other than as permitted under
* this license is void and will automatically terminate your rights under
* this license.
*
* THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
* PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
* RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
* SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
******************************************************************************
*/
/* Includes ------------------------------------------------------------------*/
#include "es_wifi.h"
#define DEBUG printf("%s:%d :",__FILE__,__LINE__);printf
#define AT_OK_STRING "\r\nOK\r\n> "
#define AT_OK_STRING_LEN (sizeof(AT_OK_STRING) - 1)
#define AT_ERROR_STRING "\r\nERROR"
#define AT_DELIMETER_STRING "\r\n> "
#define AT_DELIMETER_LEN 4
// This is version 3.5.2.5, with the byte order reversed for easy comparison
#define UPDATED_SCAN_PARAMETERS_FW_REV (0x05020503)
#define CHARISHEXNUM(x) (((x) >= '0' && (x) <= '9') || \
((x) >= 'a' && (x) <= 'f') || \
((x) >= 'A' && (x) <= 'F'))
#define CHARISNUM(x) ((x) >= '0' && (x) <= '9')
#define CHAR2NUM(x) ((x) - '0')
/* Private function prototypes -----------------------------------------------*/
static uint8_t Hex2Num(char a);
static uint32_t ParseHexNumber(char* ptr, uint8_t* cnt);
static uint32_t ParseHexNumber(char* ptr, uint8_t* cnt);
static void ParseMAC(char* ptr, uint8_t* arr);
static void ParseIP(char* ptr, uint8_t* arr);
static ES_WIFI_SecurityType_t ParseSecurity(char* ptr);
#if (ES_WIFI_USE_UART == 1)
static void AT_ParseUARTConfig(char *pdata, ES_WIFI_UARTConfig_t *pConfig);
#endif
static void AT_ParseSystemConfig(char *pdata, ES_WIFI_SystemConfig_t *pConfig);
static void AT_ParseConnSettings(char *pdata, ES_WIFI_Network_t *NetSettings);
static void AT_ParseTransportSettings(char *pdata, ES_WIFI_Transport_t *TransportSettings);
static void AT_ParseIsConnected(char *pdata, uint8_t *isConnected);
static ES_WIFI_Status_t AT_ExecuteCommand(ES_WIFIObject_t *Obj, uint8_t* cmd, uint8_t *pdata);
uint32_t HAL_GetTick(void);
/* Private functions ---------------------------------------------------------*/
/**
* @brief Convert char in Hex format to integer.
* @param a: character to convert
* @retval integer value.
*/
static uint8_t Hex2Num(char a)
{
if (a >= '0' && a <= '9') { /* Char is num */
return a - '0';
} else if (a >= 'a' && a <= 'f') { /* Char is lowercase character A - Z (hex) */
return (a - 'a') + 10;
} else if (a >= 'A' && a <= 'F') { /* Char is uppercase character A - Z (hex) */
return (a - 'A') + 10;
}
return 0;
}
/**
* @brief Extract a hex number from a string.
* @param ptr: pointer to string
* @param cnt: pointer to the number of parsed digit
* @retval Hex value.
*/
static uint32_t ParseHexNumber(char* ptr, uint8_t* cnt)
{
uint32_t sum = 0;
uint8_t i = 0;
while (CHARISHEXNUM(*ptr)) { /* Parse number */
sum <<= 4;
sum += Hex2Num(*ptr);
ptr++;
i++;
}
if (cnt != NULL) { /* Save number of characters used for number */
*cnt = i;
}
return sum; /* Return number */
}
/**
* @brief Parses and returns number from string.
* @param ptr: pointer to string
* @param cnt: pointer to the number of parsed digit
* @retval integer value.
*/
static int32_t ParseNumber(char* ptr, uint8_t* cnt)
{
uint8_t minus = 0, i = 0;
int32_t sum = 0;
if (*ptr == '-') { /* Check for minus character */
minus = 1;
ptr++;
i++;
}
while (CHARISNUM(*ptr)) { /* Parse number */
sum = 10 * sum + CHAR2NUM(*ptr);
ptr++;
i++;
}
if (cnt != NULL) { /* Save number of characters used for number */
*cnt = i;
}
if (minus) { /* Minus detected */
return 0 - sum;
}
return sum; /* Return number */
}
/**
* @brief Parses and returns MAC address.
* @param ptr: pointer to string
* @param arr: pointer to MAC array
* @retval None.
*/
static void ParseMAC(char* ptr, uint8_t* arr)
{
uint8_t hexnum = 0, hexcnt;
while(* ptr) {
hexcnt = 1;
if(*ptr != ':')
{
arr[hexnum++] = ParseHexNumber(ptr, &hexcnt);
}
ptr = ptr + hexcnt;
}
}
/**
* @brief Parses and returns IP address.
* @param ptr: pointer to string
* @param arr: pointer to IP array
* @retval None.
*/
static void ParseIP(char* ptr, uint8_t* arr)
{
uint8_t hexnum = 0, hexcnt;
while(* ptr) {
hexcnt = 1;
if(*ptr != '.')
{
arr[hexnum++] = ParseNumber(ptr, &hexcnt);
}
ptr = ptr + hexcnt;
}
}
/**
* @brief Parses Security type.
* @param ptr: pointer to string
* @retval Encryption type.
*/
static ES_WIFI_SecurityType_t ParseSecurity(char* ptr)
{
if(strstr(ptr,"Open")) return ES_WIFI_SEC_OPEN;
else if(strstr(ptr,"WEP")) return ES_WIFI_SEC_WEP;
else if(strstr(ptr,"WPA WPA2")) return ES_WIFI_SEC_WPA_WPA2;
else if(strstr(ptr,"WPA2 TKIP")) return ES_WIFI_SEC_WPA2_TKIP;
else if(strstr(ptr,"WPA2")) return ES_WIFI_SEC_WPA2;
else if(strstr(ptr,"WPA")) return ES_WIFI_SEC_WPA;
else return ES_WIFI_SEC_UNKNOWN;
}
/**
* @brief Parses ES module informations and save them in the handle.
* @param Obj: pointer to module handle
* @param ptr: pointer to string
* @retval None.
*/
static void AT_ParseInfo(ES_WIFIObject_t *Obj,uint8_t *pdata)
{
char *ptr;
uint8_t num = 0;
ptr = strtok((char *)pdata + 2, ",");
while (ptr != NULL){
switch (num++) {
case 0:
strncpy((char *)Obj->Product_ID, ptr, ES_WIFI_PRODUCT_ID_SIZE);
break;
case 1:
strncpy((char *)Obj->FW_Rev, ptr, ES_WIFI_FW_REV_SIZE );
break;
case 2:
strncpy((char *)Obj->API_Rev, ptr, ES_WIFI_API_REV_SIZE);
break;
case 3:
strncpy((char *)Obj->Stack_Rev, ptr, ES_WIFI_STACK_REV_SIZE);
break;
case 4:
strncpy((char *)Obj->RTOS_Rev, ptr, ES_WIFI_RTOS_REV_SIZE);
break;
case 5:
Obj->CPU_Clock = ParseNumber(ptr, NULL);
break;
case 6:
ptr = strtok(ptr, "\r");
strncpy((char *)Obj->Product_Name, ptr, ES_WIFI_PRODUCT_NAME_SIZE);
break;
default: break;
}
ptr = strtok(NULL, ",");
}
}
/**
* @brief Parses Access point configuration.
* @param APs: Access points structure
* @param ptr: pointer to string
* @retval None.
*/
static void AT_ParseAP(char *pdata, ES_WIFI_APs_t *APs)
{
uint8_t num = 0;
char *ptr;
APs->nbr = 0;
ptr = strtok(pdata + 2, ",");
while ((ptr != NULL) && (APs->nbr < ES_WIFI_MAX_DETECTED_AP)) {
switch (num++) {
case 0: /* Ignore index */
case 4: /* Ignore Max Rate */
case 5: /* Ignore Network Type */
case 7: /* Ignore Radio Band */
break;
case 1:
ptr[strlen(ptr) - 1] = 0;
strncpy((char *)APs->AP[APs->nbr].SSID, ptr+ 1, ES_WIFI_MAX_SSID_NAME_SIZE + 1);
break;
case 2:
ParseMAC(ptr, APs->AP[APs->nbr].MAC);
break;
case 3:
APs->AP[APs->nbr].RSSI = ParseNumber(ptr, NULL);
break;
case 6:
APs->AP[APs->nbr].Security = ParseSecurity(ptr);
break;
case 8:
APs->AP[APs->nbr].Channel = ParseNumber(ptr, NULL);
APs->nbr++;
num = 1;
break;
default:
break;
}
ptr = strtok(NULL, ",");
}
}
uint32_t ReverseByteOrder32bit(uint8_t * buf)
{
return ((buf[0] << 0) | (buf[1] << 8) | (buf[2] << 16) | (buf[3] << 24));
}
/**
* @brief Parses FW revision
* @param ver: version array (4 position 8-bit array)
* @param pdata: pointer to string
* @retval None.
*/
static void AT_ParseFWRev(char *pdata, uint8_t *ver)
{
uint8_t num = 0;
char *ptr;
ptr = strtok(pdata + 1, ".");
while ((ptr != NULL) && (num < 4)) {
switch (num) {
case 0:
case 1:
case 2:
case 3:
{
ver[num] = atoi(ptr);
break;
}
default:
break;
}
num++;
ptr = strtok(NULL, ".");
}
}
/**
* @brief Parses Access point configuration.
* @param APs: Access points structure
* @param ptr: pointer to string
* @retval None.
*/
static void AT_ParseSingleAP(char *pdata, ES_WIFI_AP_t *AP)
{
uint8_t num = 0;
char *ptr;
ptr = strtok(pdata + 2, ",");
while (ptr != NULL) {
switch (num++) {
case 0: /* Ignore index */
case 4: /* Ignore Max Rate */
case 5: /* Ignore Network Type */
case 7: /* Ignore Radio Band */
break;
case 1:
ptr[strlen(ptr) - 1] = 0;
strncpy((char *)AP->SSID, ptr+ 1, ES_WIFI_MAX_SSID_NAME_SIZE + 1);
break;
case 2:
ParseMAC(ptr, AP->MAC);
break;
case 3:
AP->RSSI = ParseNumber(ptr, NULL);
break;
case 6:
AP->Security = ParseSecurity(ptr);
break;
case 8:
AP->Channel = ParseNumber(ptr, NULL);
num = 1;
break;
default:
break;
}
ptr = strtok(NULL, ",");
}
}
#if (ES_WIFI_USE_UART == 1)
/**
* @brief Parses UART configuration.
* @param APs: UART Config structure
* @param ptr: pointer to string
* @retval None.
*/
static void AT_ParseUARTConfig(char *pdata, ES_WIFI_UARTConfig_t *pConfig)
{
uint8_t num = 0;
char *ptr;
ptr = strtok(pdata + 2, ",");
while (ptr != NULL) {
switch (num++) {
case 0:
pConfig->Port = ParseNumber(ptr, NULL);
break;
case 1:
pConfig->BaudRate = ParseNumber(ptr, NULL);
break;
case 2:
pConfig->DataWidth = ParseNumber(ptr, NULL);
break;
case 3:
pConfig->Parity = ParseNumber(ptr, NULL);
break;
case 4:
pConfig->StopBits = ParseNumber(ptr, NULL);
break;
case 5:
pConfig->Mode = ParseNumber(ptr, NULL);
break;
default:
break;
}
ptr = strtok(NULL, ",");
}
}
#endif
/**
* @brief Parses System configuration.
* @param APs: System Config structure
* @param ptr: pointer to string
* @retval None.
*/
static void AT_ParseSystemConfig(char *pdata, ES_WIFI_SystemConfig_t *pConfig)
{
uint8_t num = 0;
char *ptr;
ptr = strtok(pdata + 2, ",");
while (ptr != NULL) {
switch (num++) {
case 0:
pConfig->Configuration = ParseNumber(ptr, NULL);
break;
case 1:
pConfig->WPSPin = ParseNumber(ptr, NULL);
break;
case 2:
pConfig->VID = ParseNumber(ptr, NULL);
break;
case 3:
pConfig->PID = ParseNumber(ptr, NULL);
break;
case 4:
ParseMAC(ptr, pConfig->MAC);
break;
case 5:
ParseIP(ptr, pConfig->AP_IPAddress);
break;
case 6:
pConfig->PS_Mode = ParseNumber(ptr, NULL);
break;
case 7:
pConfig->RadioMode = ParseNumber(ptr, NULL);
break;
case 8:
pConfig->CurrentBeacon = ParseNumber(ptr, NULL);
break;
case 9:
pConfig->PrevBeacon = ParseNumber(ptr, NULL);
break;
case 10:
pConfig->ProductName = ParseNumber(ptr, NULL);
break;
default:
break;
}
ptr = strtok(NULL, ",");
}
}
/**
* @brief Parses WIFI connection settings.
* @param NetSettings: settings
* @param pdata: pointer to data
* @retval None.
*/
static void AT_ParseConnSettings(char *pdata, ES_WIFI_Network_t *NetSettings)
{
uint8_t num = 0;
char *ptr;
ptr = strtok(pdata + 2, ",");
while (ptr != NULL) {
switch (num++) {
case 0:
strncpy((char *)NetSettings->SSID, ptr, ES_WIFI_MAX_SSID_NAME_SIZE + 1);
break;
case 1:
strncpy((char *)NetSettings->pswd, ptr, ES_WIFI_MAX_PSWD_NAME_SIZE + 1);
break;
case 2:
NetSettings->Security = (ES_WIFI_SecurityType_t)ParseNumber(ptr, NULL);
break;
case 3:
NetSettings->DHCP_IsEnabled = ParseNumber(ptr, NULL);
break;
case 4:
NetSettings->IP_Ver = (ES_WIFI_IPVer_t)ParseNumber(ptr, NULL);
break;
case 5:
ParseIP(ptr, NetSettings->IP_Addr);
break;
case 6:
ParseIP(ptr, NetSettings->IP_Mask);
break;
case 7:
ParseIP(ptr, NetSettings->Gateway_Addr);
break;
case 8:
ParseIP(ptr, NetSettings->DNS1);
break;
case 9:
ParseIP(ptr, NetSettings->DNS2);
break;
case 10:
NetSettings->JoinRetries = ParseNumber(ptr, NULL);
break;
case 11:
NetSettings->AutoConnect = ParseNumber(ptr, NULL);
break;
default:
break;
}
ptr = strtok(NULL, ",");
if ((ptr != NULL) && (ptr[-1] == ','))
{ /* Ignore empty fields */
num++;
}
}
}
/**
* @brief Parses WIFI transport settings.
* @param TransportSettings: settings
* @param pdata: pointer to data
* @retval None.
*/
static void AT_ParseTransportSettings(char *pdata, ES_WIFI_Transport_t *TransportSettings)
{
uint8_t num = 0;
char *ptr;
ptr = strtok(pdata + 2, ",");
while (ptr != NULL) {
switch (num++) {
case 0:
TransportSettings->Protocol = (ES_WIFI_ConnType_t) ParseNumber(ptr, NULL);
break;
case 1:
ParseIP(ptr, TransportSettings->Local_IP_Addr);
break;
case 2:
TransportSettings->Local_Port = ParseNumber(ptr, NULL);
break;
case 3:
ParseIP(ptr, TransportSettings->Remote_IP_Addr);
break;
case 4:
TransportSettings->Remote_Port = ParseNumber(ptr, NULL);
break;
case 5:
TransportSettings->TCP_Server = ParseNumber(ptr, NULL);
break;
case 6:
TransportSettings->UDP_Server = ParseNumber(ptr, NULL);
break;
case 7:
TransportSettings->TCP_Backlogs = ParseNumber(ptr, NULL);
break;
case 8:
TransportSettings->Accept_Loop = ParseNumber(ptr, NULL);
break;
case 9:
TransportSettings->Read_Mode = ParseNumber(ptr, NULL);
break;
default:
break;
}
ptr = strtok(NULL, ",");
if ((ptr != NULL) && (ptr[-1] == ','))
{ /* Ignore empty fields */
num++;
}
}
}
/**
* @brief Parses the connection status
* @param pdata: pointer to data
* @param isConnected: pointer to result
* @retval None.
*/
static void AT_ParseIsConnected(char *pdata, uint8_t *isConnected)
{
*isConnected = (pdata[2] == '1') ? 1 : 0;
}
/**
* @brief Execute AT command.
* @param Obj: pointer to module handle
* @param cmd: pointer to command string
* @param pdata: pointer to returned data
* @retval Operation Status.
*/
static ES_WIFI_Status_t AT_ExecuteCommand(ES_WIFIObject_t *Obj, uint8_t* cmd, uint8_t *pdata)
{
int ret = 0;
int16_t recv_len = 0;
LOCK_WIFI();
ret = Obj->fops.IO_Send(cmd, strlen((char*)cmd), Obj->Timeout);
if( ret > 0)
{
recv_len = Obj->fops.IO_Receive(pdata, ES_WIFI_DATA_SIZE, Obj->Timeout);
if((recv_len > 0) && (recv_len < ES_WIFI_DATA_SIZE))
{
*(pdata + recv_len) = 0;
if(strstr((char *)pdata, AT_OK_STRING))
{
UNLOCK_WIFI();
return ES_WIFI_STATUS_OK;
}
else if(strstr((char *)pdata, AT_ERROR_STRING))
{
UNLOCK_WIFI();
return ES_WIFI_STATUS_UNEXPECTED_CLOSED_SOCKET;
}
}
if (recv_len == ES_WIFI_ERROR_STUFFING_FOREVER )
{
UNLOCK_WIFI();
return ES_WIFI_STATUS_MODULE_CRASH;
}
}
UNLOCK_WIFI();
return ES_WIFI_STATUS_IO_ERROR;
}
/**
* @brief Execute AT command with data.
* @param Obj: pointer to module handle
* @param cmd: pointer to command string
* @param pcmd_data: pointer to binary data
* @param len: binary data length
* @param pdata: pointer to returned data
* @retval Operation Status.
*/
static ES_WIFI_Status_t AT_RequestSendData(ES_WIFIObject_t *Obj, uint8_t* cmd, uint8_t *pcmd_data, uint16_t len, uint8_t *pdata)
{
int16_t send_len = 0;
int16_t recv_len = 0;
uint16_t cmd_len = 0;
uint16_t n ;
LOCK_WIFI();
cmd_len = strlen((char*)cmd);
/* can send only even number of byte on first send */
if (cmd_len & 1) return ES_WIFI_STATUS_ERROR;
n=Obj->fops.IO_Send(cmd, cmd_len, Obj->Timeout);
if (n == cmd_len)
{
send_len = Obj->fops.IO_Send(pcmd_data, len, Obj->Timeout);
if (send_len == len)
{
recv_len = Obj->fops.IO_Receive(pdata, 0, Obj->Timeout);
if (recv_len > 0)
{
*(pdata+recv_len) = 0;
if(strstr((char *)pdata, AT_OK_STRING))
{
UNLOCK_WIFI();
return ES_WIFI_STATUS_OK;
}
else if(strstr((char *)pdata, AT_ERROR_STRING))
{
UNLOCK_WIFI();
return ES_WIFI_STATUS_UNEXPECTED_CLOSED_SOCKET;
}
else
{
UNLOCK_WIFI();
return ES_WIFI_STATUS_ERROR;
}
}
UNLOCK_WIFI();
if (recv_len == ES_WIFI_ERROR_STUFFING_FOREVER )
{
return ES_WIFI_STATUS_MODULE_CRASH;
}
return ES_WIFI_STATUS_ERROR;
}
else
{
return ES_WIFI_STATUS_ERROR;
}
}
return ES_WIFI_STATUS_IO_ERROR;
}
/**
* @brief Parses Received data.
* @param Obj: pointer to module handle
* @param cmd:command formatted string
* @param pdata: payload
* @param Reqlen : requested Data length.
* @param ReadData : pointer to received data length.
* @retval Operation Status.
*/
static ES_WIFI_Status_t AT_RequestReceiveData(ES_WIFIObject_t *Obj, uint8_t* cmd, char *pdata, uint16_t Reqlen, uint16_t *ReadData)
{
int len;
uint8_t *p=Obj->CmdData;
LOCK_WIFI();
if(Obj->fops.IO_Send(cmd, strlen((char*)cmd), Obj->Timeout) > 0)
{
len = Obj->fops.IO_Receive(p, 0 , Obj->Timeout);
if ((p[0]!='\r') || (p[1]!='\n'))
{
return ES_WIFI_STATUS_IO_ERROR;
}
len-=2;
p+=2;
if (len >= AT_OK_STRING_LEN)
{
while(len && (p[len-1]==0x15)) len--;
p[len] = '\0';
if(strstr( (char*) p + len - AT_OK_STRING_LEN, AT_OK_STRING))
{
*ReadData = len - AT_OK_STRING_LEN;
if (*ReadData > Reqlen)
{
*ReadData = Reqlen;
}
memcpy(pdata, p, *ReadData);
UNLOCK_WIFI();
return ES_WIFI_STATUS_OK;
}
else if(memcmp((char *)p + len - AT_DELIMETER_LEN , AT_DELIMETER_STRING, AT_DELIMETER_LEN) == 0)
{
*ReadData = 0;
UNLOCK_WIFI();
return ES_WIFI_STATUS_UNEXPECTED_CLOSED_SOCKET;
}
UNLOCK_WIFI();
*ReadData = 0;
return ES_WIFI_STATUS_UNEXPECTED_CLOSED_SOCKET;
}
if (len == ES_WIFI_ERROR_STUFFING_FOREVER )
{
UNLOCK_WIFI();
return ES_WIFI_STATUS_MODULE_CRASH;
}
}
UNLOCK_WIFI();
return ES_WIFI_STATUS_IO_ERROR;
}
/**
* @brief Initialize WIFI module.
* @param Obj: pointer to module handle
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_Init(ES_WIFIObject_t *Obj)
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
Obj->Timeout = ES_WIFI_TIMEOUT;
if (Obj->fops.IO_Init(ES_WIFI_INIT) == 0)
{
LOCK_WIFI();
ret = AT_ExecuteCommand(Obj,(uint8_t*)"I?\r\n", Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
AT_ParseInfo (Obj, Obj->CmdData);
}
UNLOCK_WIFI();
}
return ret;
}
/**
* @brief Return ProductID.
* @param Obj: pointer to module handle
* @param productID: pointer productID
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_GetProductID(ES_WIFIObject_t *Obj, uint8_t *productID)
{
strncpy((char *)productID, (char *)Obj->Product_ID, ES_WIFI_PRODUCT_ID_SIZE);
return ES_WIFI_STATUS_OK;
}
/**
* @brief Return Firmware Revision.
* @param Obj: pointer to module handle
* @param productID: pointer Revision
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_GetFWRevID(ES_WIFIObject_t *Obj, uint8_t *FWRev)
{
strncpy((char *)FWRev, (char *)Obj->FW_Rev, ES_WIFI_FW_REV_SIZE);
return ES_WIFI_STATUS_OK;
}
/**
* @brief Return product Name.
* @param Obj: pointer to module handle
* @param productID: pointer product Name
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_GetProductName(ES_WIFIObject_t *Obj, uint8_t *productName)
{
strncpy((char *)productName, (char *)Obj->Product_Name, ES_WIFI_PRODUCT_NAME_SIZE);
return ES_WIFI_STATUS_OK;
}
/**
* @brief Return API revision.
* @param Obj: pointer to module handle
* @param productID: pointer API revision.
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_GetAPIRev(ES_WIFIObject_t *Obj, uint8_t *APIRev)
{
strncpy((char *)APIRev, (char *)Obj->API_Rev, ES_WIFI_API_REV_SIZE);
return ES_WIFI_STATUS_OK;
}
/**
* @brief Return Stack Revision.
* @param Obj: pointer to module handle
* @param productID: pointer Stack Revision
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_GetStackRev(ES_WIFIObject_t *Obj, uint8_t *StackRev)
{
strncpy((char *)StackRev, (char *)Obj->Stack_Rev, ES_WIFI_STACK_REV_SIZE);
return ES_WIFI_STATUS_OK;
}
/**
* @brief Return RTOS Revision
* @param Obj: pointer to module handle
* @param productID: pointer RTOS Revision
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_GetRTOSRev(ES_WIFIObject_t *Obj, uint8_t *RTOSRev)
{
strncpy((char *)RTOSRev, (char *)Obj->RTOS_Rev, ES_WIFI_RTOS_REV_SIZE);
return ES_WIFI_STATUS_OK;
}
/**
* @brief Initialize WIFI module.
* @param Obj: pointer to module handle
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_RegisterBusIO(ES_WIFIObject_t *Obj, IO_Init_Func IO_Init,
IO_DeInit_Func IO_DeInit,
IO_Delay_Func IO_Delay,
IO_Send_Func IO_Send,
IO_Receive_Func IO_Receive)
{
if(!Obj || !IO_Init || !IO_DeInit || !IO_Send || !IO_Receive)
{
return ES_WIFI_STATUS_ERROR;
}
Obj->fops.IO_Init = IO_Init;
Obj->fops.IO_DeInit = IO_DeInit;
Obj->fops.IO_Send = IO_Send;
Obj->fops.IO_Receive = IO_Receive;
Obj->fops.IO_Delay = IO_Delay;
return ES_WIFI_STATUS_OK;
}
/**
* @brief Change default Timeout.
* @param Obj: pointer to module handle
* @param Timeout: Timeout in mS
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_SetTimeout(ES_WIFIObject_t *Obj, uint32_t Timeout)
{
Obj->Timeout = Timeout;
return ES_WIFI_STATUS_OK;
}
/**
* @brief List all detected APs.
* @param Obj: pointer to module handle
* @param APs: pointer Access points structure
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_ListAccessPoints(ES_WIFIObject_t *Obj, ES_WIFI_APs_t *APs)
{
ES_WIFI_Status_t ret;
int send_len;
int16_t recv_len = 0;
uint8_t version[4] = { 0 };
LOCK_WIFI();
sprintf((char*)Obj->CmdData, Obj->FW_Rev);
AT_ParseFWRev(Obj->CmdData, version);
if (ReverseByteOrder32bit(version) >= UPDATED_SCAN_PARAMETERS_FW_REV)
{
APs->nbr = 0;
sprintf((char*)Obj->CmdData,"F0=2\r");
send_len = Obj->fops.IO_Send(Obj->CmdData, strlen((char*)Obj->CmdData), Obj->Timeout);
if (send_len == 5)
{
do
{
recv_len = Obj->fops.IO_Receive(Obj->CmdData, ES_WIFI_DATA_SIZE, Obj->Timeout);
if((recv_len > 0) && (recv_len < ES_WIFI_DATA_SIZE))
{
*(Obj->CmdData + recv_len) = 0;
if(strstr((char *)Obj->CmdData, AT_OK_STRING))
{
UNLOCK_WIFI();
return ES_WIFI_STATUS_OK;
}
else if(strstr((char *)Obj->CmdData, AT_ERROR_STRING))
{
UNLOCK_WIFI();
return ES_WIFI_STATUS_UNEXPECTED_CLOSED_SOCKET;
}
}
if (recv_len == ES_WIFI_ERROR_STUFFING_FOREVER )
{
UNLOCK_WIFI();
return ES_WIFI_STATUS_MODULE_CRASH;
}
if (APs->nbr < ES_WIFI_MAX_DETECTED_AP)
{
AT_ParseSingleAP((char *)Obj->CmdData, &(APs->AP[APs->nbr]));
APs->nbr++;
}
sprintf((char*)Obj->CmdData,"MR\r");
send_len = Obj->fops.IO_Send(Obj->CmdData, strlen((char*)Obj->CmdData), Obj->Timeout);
} while (send_len == 3);
}
UNLOCK_WIFI();
return ES_WIFI_STATUS_IO_ERROR;
}
else
{
ret = AT_ExecuteCommand(Obj,(uint8_t*)"F0\r", Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
AT_ParseAP((char *)Obj->CmdData, APs);
}
UNLOCK_WIFI();
return ret;
}
}
/**
* @brief Join an Access point.
* @param Obj: pointer to module handle
* @param Ssid: the access point id.
* @param Password: the Access point password.
* @param SecType: Security type.
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_Connect(ES_WIFIObject_t *Obj, const char* SSID,
const char* Password,
ES_WIFI_SecurityType_t SecType)
{
ES_WIFI_Status_t ret;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"C1=%s\r", SSID);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"C2=%s\r", Password);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
Obj->Security = SecType;
sprintf((char*)Obj->CmdData,"C3=%d\r", (uint8_t)SecType);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"C0\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
Obj->NetSettings.IsConnected = 1;
}
}
}
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief Check whether the module is connected to an access point.
* @retval Operation Status.
*/
uint8_t ES_WIFI_IsConnected(ES_WIFIObject_t *Obj)
{
ES_WIFI_Status_t ret ;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"CS\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
AT_ParseIsConnected((char *)Obj->CmdData, &(Obj->NetSettings.IsConnected));
}
UNLOCK_WIFI();
return Obj->NetSettings.IsConnected;
}
/**
* @brief Disconnect from a network.
* @param Obj: pointer to module handle
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_Disconnect(ES_WIFIObject_t *Obj)
{
ES_WIFI_Status_t ret;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"CD\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
UNLOCK_WIFI();
return ret;
}
/**
* @brief Return network settings.
* @param Obj: pointer to module handle
* @param Pointer to network setting structure.
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_GetNetworkSettings(ES_WIFIObject_t *Obj)
{
ES_WIFI_Status_t ret;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"C?\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
AT_ParseConnSettings((char *)Obj->CmdData, &Obj->NetSettings);
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief Configure and activate SoftAP.
* @param Obj: pointer to module handle
* @param ApConfig : Pointer to AP config structure.
* @param ip : AP IP address
* @param mac : AP MAC address
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_ActivateAP(ES_WIFIObject_t *Obj, ES_WIFI_APConfig_t *ApConfig)
{
ES_WIFI_Status_t ret;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"AS=0,%s\r", ApConfig->SSID);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"A1=%c\r", (int)ApConfig->Security + '0');
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"A2=%s\r", ApConfig->Pass);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"AC=%d\r", ApConfig->Channel);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"AT=%d\r", ApConfig->MaxConnections);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"A0\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
if(strstr((char *)Obj->CmdData, "[AP ]"))
{
ret = ES_WIFI_STATUS_OK;
}
}
}
}
}
}
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief Get AP notification.
* @param Obj: pointer to module handle
* @param ip : Assigned ip address.
* @param ip : joind device mac address.
* @retval AP State.
*/
ES_WIFI_APState_t ES_WIFI_WaitAPStateChange(ES_WIFIObject_t *Obj)
{
ES_WIFI_APState_t ret = ES_WIFI_AP_NONE;
char *ptr;
LOCK_WIFI();
#if (ES_WIFI_USE_UART == 1)
if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
{
if(strstr((char *)Obj->CmdData, AT_ERROR_STRING))
{
UNLOCK_WIFI();
return ES_WIFI_AP_ERROR;
}
#else
do
{
sprintf((char*)Obj->CmdData,"MR\r");
if(AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData) != ES_WIFI_STATUS_OK)
{
UNLOCK_WIFI();
return ES_WIFI_AP_ERROR;
}
#endif
else if(strstr((char *)Obj->CmdData, "[AP DHCP]"))
{
ptr = strtok((char *)Obj->CmdData + 2, " ");
ptr = strtok(NULL, " ");
ptr = strtok(NULL, " ");
ptr = strtok(NULL, " ");
ParseMAC((char *)ptr, Obj->APSettings.MAC_Addr);
ptr = strtok(NULL, " ");
ptr = strtok(NULL, "\r");
ParseIP((char *)ptr, Obj->APSettings.IP_Addr);
ret = ES_WIFI_AP_ASSIGNED;
#if (ES_WIFI_USE_SPI == 1)
break;
#endif
}
else if(strstr((char *)Obj->CmdData, "[JOIN ]"))
{
ptr = strtok((char *)Obj->CmdData + 12, ",");
strncpy((char *)Obj->APSettings.SSID, ptr, ES_WIFI_MAX_SSID_NAME_SIZE );
ptr = strtok(NULL, ",");
ParseIP((char *)ptr, Obj->APSettings.IP_Addr);
ret = ES_WIFI_AP_JOINED;
#if (ES_WIFI_USE_SPI == 1)
break;
#endif
}
#if (ES_WIFI_USE_UART == 1)
}
#else
UNLOCK_WIFI();
Obj->fops.IO_Delay(100);
LOCK_WIFI();
} while (1);
#endif
UNLOCK_WIFI();
return ret;
}
/**
* @brief retrn the MAC address of the es module.
* @param Obj: pointer to module handle
* @param mac: pointer to the MAC address array.
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_GetMACAddress(ES_WIFIObject_t *Obj, uint8_t *mac)
{
ES_WIFI_Status_t ret ;
char *ptr;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"Z5\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
ptr = strtok((char *)(Obj->CmdData + 2), "\r\n");
ParseMAC(ptr, mac) ;
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief retrn the IP address of the es module.
* @param Obj: pointer to module handle
* @param mac: pointer to the IP address array.
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_GetIPAddress(ES_WIFIObject_t *Obj, uint8_t *ipaddr)
{
memcpy(ipaddr, Obj->NetSettings.IP_Addr, 4);
return ES_WIFI_STATUS_OK;
}
/**
* @brief Set the MAC address of the es module.
* @param Obj: pointer to module handle
* @param mac: pointer to the MAC address array.
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_SetMACAddress(ES_WIFIObject_t *Obj, uint8_t *mac)
{
ES_WIFI_Status_t ret ;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"Z4=%X:%X:%X:%X:%X:%X\r",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5] );
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"Z1\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief Reset To factory defaults.
* @param Obj: pointer to module handle
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_ResetToFactoryDefault(ES_WIFIObject_t *Obj)
{
ES_WIFI_Status_t ret ;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"Z0\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
UNLOCK_WIFI();
return ret;
}
/**
* @brief Reset the module.
* @param Obj: pointer to module handle
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_ResetModule(ES_WIFIObject_t *Obj)
{
int ret;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"ZR\r");
ret = Obj->fops.IO_Send(Obj->CmdData, strlen((char*)Obj->CmdData), Obj->Timeout);
#if (ES_WIFI_USE_UART == 0)
if (ret==3)
{
// Fake received needed in case of SPI to unlock SPI and deselect NSS
Obj->fops.IO_Receive(Obj->CmdData, 0, 1);
}
#endif
UNLOCK_WIFI();
return (ret > 0) ? ES_WIFI_STATUS_OK : ES_WIFI_STATUS_ERROR;
}
/**
* @brief Hard Reset the module.
* @param Obj: pointer to module handle
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_HardResetModule(ES_WIFIObject_t *Obj)
{
int ret;
LOCK_WIFI();
ret = Obj->fops.IO_Init(ES_WIFI_RESET);
UNLOCK_WIFI();
return (ret > 0) ? ES_WIFI_STATUS_OK : ES_WIFI_STATUS_ERROR;
}
/**
* @brief Set Product Name.
* @param Obj: pointer to module handle
* @param ProductName : pointer to product name string
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_SetProductName(ES_WIFIObject_t *Obj, uint8_t *ProductName)
{
ES_WIFI_Status_t ret ;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"ZN=%s\r",ProductName);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"Z1\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
UNLOCK_WIFI();
return ret;
}
#if (ES_WIFI_USE_FIRMWAREUPDATE == 1)
/**
* @brief OTA Firmware Upgrade.
* @param Obj: pointer to module handle
* @param Upgrade link path
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_OTA_Upgrade(ES_WIFIObject_t *Obj, uint8_t *link)
{
ES_WIFI_Status_t ret ;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"Z0=%d\r%s",strlen((char *)link), (char *)link);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
UNLOCK_WIFI();
return ret;
}
#endif
#if (ES_WIFI_USE_UART == 1)
/**
* @brief Set UART Baud Rate.
* @param Obj: pointer to module handle
* @param UART BAud rate
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_SetUARTBaudRate(ES_WIFIObject_t *Obj, uint16_t BaudRate)
{
ES_WIFI_Status_t ret ;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"U2=%d\r", BaudRate);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"U0\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief Get UART Configuration.
* @param Obj: pointer to module handle
* @param pointer to UART config structure
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_GetUARTConfig(ES_WIFIObject_t *Obj, ES_WIFI_UARTConfig_t *pconf)
{
ES_WIFI_Status_t ret ;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"U?\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
AT_ParseUARTConfig((char *)Obj->CmdData, pconf);
}
UNLOCK_WIFI();
return ret;
}
#endif
/**
* @brief Get System Configuration.
* @param Obj: pointer to module handle
* @param pointer to System config structure
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_GetSystemConfig(ES_WIFIObject_t *Obj, ES_WIFI_SystemConfig_t *pconf)
{
ES_WIFI_Status_t ret ;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"Z?\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
AT_ParseSystemConfig((char *)Obj->CmdData, pconf);
}
UNLOCK_WIFI();
return ret;
}
#if (ES_WIFI_USE_PING == 1)
/**
* @brief Ping an IP address.
* @param Obj: pointer to module handle
* @param Ping: ping structure.
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_Ping(ES_WIFIObject_t *Obj, uint8_t *address, uint16_t count, uint16_t interval_ms)
{
ES_WIFI_Status_t ret;
uint8_t responseIpAddress[4];
int rtt, valuesRead = 0, responseStart = 0;
uint16_t responsesParsed = 0;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"T1=%d.%d.%d.%d\r", address[0],address[1],
address[2],address[3]);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"T2=%d\r", count);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"T3=%d\r", interval_ms);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"T0=\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
/* If the T0 command is successfully executed, the Inventek module
* returns one of the following:
*
* Success - \r\nIP0.IP1.IP2.IP3,RTT\r\nOK\r\n>
* Timeout - \r\nIP0.IP1.IP2.IP3,Timeout\r\nOK\r\n>
*
* Where IP0..IP3 are the octacts of the IP address pinged and RTT is
* the round trip time.
*
* Example success response - \r\n8.8.8.8,48\r\nOK\r\n>
* Example timeout response - \r\n192.168.1.1,Timeout\r\nOK\r\n>
*
* The "\r\nIP0.IP1.IP2.IP3,RTT" part is repeated in the response
* the number of ping count times (specified with the T2 command).
*
* The following check tries to read the 4 IP octacts and the RTT
* value from the response - if we are able to successfully read all
* the 5 values (i.e. sscanf returns 5), it is a success response. We
* will not be able to read the RTT value in case of timeout as sscanf
* will not be able to parse "Timeout" as integer. As a result,
* valuesRead will not be 5 and it will be detected as timeout.
*/
/* Assume timeout unless we find a successful response. */
ret = ES_WIFI_STATUS_TIMEOUT;
do
{
/* Parse the first response. */
valuesRead = sscanf((char*)&(Obj->CmdData[responseStart]),
"\r\n%hhu.%hhu.%hhu.%hhu,%d",
&responseIpAddress[0],
&responseIpAddress[1],
&responseIpAddress[2],
&responseIpAddress[3],
&rtt);
if(valuesRead == 5 &&
responseIpAddress[0] == address[0] &&
responseIpAddress[1] == address[1] &&
responseIpAddress[2] == address[2] &&
responseIpAddress[3] == address[3])
{
/* We found a successful ping response and so we can stop. */
ret = ES_WIFI_STATUS_OK;
break;
}
else
{
/* Move past the \r at the beginning of the current response so
* that the loop below gets to the next \r which marks the start
* of the next response. */
responseStart++;
/* Current ping response was not a successful ping - move to the
* beginning of the next response. */
while(Obj->CmdData[responseStart] != '\0' && Obj->CmdData[responseStart] != '\r')
{
responseStart++;
}
}
responsesParsed++;
} while(responsesParsed < count);
}
}
}
}
UNLOCK_WIFI();
return ret;
}
#endif
/**
* @brief DNS Lookup to get IP address .
* @param Obj: pointer to module handle
* @param url: Domain Name.
* @param ipaddress: IP address.
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_DNS_LookUp(ES_WIFIObject_t *Obj, const char *url, uint8_t *ipaddress)
{
ES_WIFI_Status_t ret;
char *ptr;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"D0=%s\r", url);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
ptr = strtok((char *)Obj->CmdData + 2, "\r");
ParseIP(ptr, ipaddress);
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief Configure and Start a Client connection.
* @param Obj: pointer to module handle
* @param conn: pointer to the connection structure
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_StartClientConnection(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_OK;
if (conn->RemotePort == 0) return ES_WIFI_STATUS_ERROR;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if (ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
if (ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P2=%d\r", conn->LocalPort);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
if (ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P4=%d\r", conn->RemotePort);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
if ((ret == ES_WIFI_STATUS_OK) && ((conn->Type == ES_WIFI_TCP_CONNECTION) || (conn->Type == ES_WIFI_TCP_SSL_CONNECTION)))
{
sprintf((char*)Obj->CmdData,"P3=%d.%d.%d.%d\r", conn->RemoteIP[0],conn->RemoteIP[1],
conn->RemoteIP[2],conn->RemoteIP[3]);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
if ((ret == ES_WIFI_STATUS_OK) && (conn->Type == ES_WIFI_TCP_SSL_CONNECTION))
{
sprintf((char*)Obj->CmdData,"P9=2\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
if (ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P6=1\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief Stop Client connection.
* @param Obj: pointer to module handle
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_StopClientConnection(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
{
ES_WIFI_Status_t ret;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if (ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P6=0\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
UNLOCK_WIFI();
return ret;
}
#if (ES_WIFI_USE_AWS == 1)
/**
* @brief Configure and Start a AWS Client connection.
* @param Obj: pointer to module handle
* @param conn: pointer to the connection structure
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_StartAWSClientConnection(ES_WIFIObject_t *Obj, ES_WIFI_AWS_Conn_t *conn)
{
ES_WIFI_Status_t ret;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P4=%d\r", conn->RemotePort);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"PM=0,%s\r", conn->PublishTopic);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"PM=1,%s\r", conn->SubscribeTopic);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"PM=2,%d\r", conn->MQTTMode);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"PM=5,%s\r", conn->ClientID);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"PM\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P6=1\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
}
}
}
}
}
}
}
}
UNLOCK_WIFI();
return ret;
}
#endif
/**
* @brief Configure and Start a Server.
* @param Obj: pointer to module handle
* @param conn: pointer to the connection structure
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_StartServerSingleConn(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_OK;
LOCK_WIFI();
#if (ES_WIFI_USE_UART == 1)
char *ptr;
#endif
sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret != ES_WIFI_STATUS_OK)
{
UNLOCK_WIFI();
return ret;
}
if ((conn->Type != ES_WIFI_UDP_CONNECTION) && (conn->Type != ES_WIFI_UDP_LITE_CONNECTION))
{
sprintf((char*)Obj->CmdData,"PK=1,3000\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P8=%d\r", conn->Backlog);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if (ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P2=%d\r", conn->LocalPort);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if (ret == ES_WIFI_STATUS_OK)
{
// multi accept mode
sprintf((char*)Obj->CmdData,"P5=11\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
#if (ES_WIFI_USE_UART == 1)
// should normally send out of the band
if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
{
if(strstr((char *)Obj->CmdData, "Accepted"))
{
ptr = strtok((char *)Obj->CmdData + 2, " ");
ptr = strtok(NULL, " ");
ptr = strtok(NULL, " ");
ptr = strtok(NULL, ":");
ParseIP((char *)ptr, conn->RemoteIP);
ret = ES_WIFI_STATUS_OK;
}
}
#endif
}
}
}
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief Wait for a client connection to the Server.
* @param Obj: pointer to module handle
* @param conn: pointer to the connection structure
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_WaitServerConnection(ES_WIFIObject_t *Obj,uint32_t timeout,ES_WIFI_Conn_t *conn)
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_OK;
uint32_t t;
uint32_t tlast;
uint32_t tstart;
char *ptr;
tstart=HAL_GetTick();
tlast=tstart+timeout;
if (tlast < tstart )
{
tstart=0;
}
do
{
#if (ES_WIFI_USE_UART == 0)
// mandatory to flush MR async messages
memset(Obj->CmdData,0,sizeof(Obj->CmdData));
sprintf((char*)Obj->CmdData,"MR\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
if((strstr((char *)Obj->CmdData, "[SOMA]")) && (strstr((char *)Obj->CmdData, "[EOMA]")))
{
if(strstr((char *)Obj->CmdData, "Accepted"))
{
// flushing out the MR messages
}
else if(!strstr((char *)Obj->CmdData,"[SOMA][EOMA]"))
{
DEBUG("Bad MR stntax msg %s\n", Obj->CmdData);
UNLOCK_WIFI();
return ES_WIFI_STATUS_ERROR;
}
}
}
else
{
DEBUG("MR command failed %s\n", Obj->CmdData);
UNLOCK_WIFI();
return ES_WIFI_STATUS_ERROR;
}
#endif
memset(Obj->CmdData,0,sizeof(Obj->CmdData));
sprintf((char*)Obj->CmdData,"P?\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
if(strncmp((char *)Obj->CmdData, "\r\n0,0.0.0.0,",12)!=0)
{
ptr = strtok((char *)Obj->CmdData + 2, ",");
ptr = strtok(0, ","); //port
ParseIP((char *)ptr, conn->RemoteIP);
ptr = strtok(0, ","); //port
conn->LocalPort=ParseNumber(ptr,0);
ptr = strtok(0, ","); //ip
ptr = strtok(0, ","); //remote port
conn->RemotePort=ParseNumber(ptr,0);
UNLOCK_WIFI();
return ES_WIFI_STATUS_OK;
}
}
else
{
DEBUG("P? command failed %s\n", Obj->CmdData);
UNLOCK_WIFI();
return ES_WIFI_STATUS_ERROR;
}
UNLOCK_WIFI();
Obj->fops.IO_Delay(100);
LOCK_WIFI();
t = HAL_GetTick();
}
while ((timeout==0) ||((t < tlast) || (t < tstart)));
return ES_WIFI_STATUS_TIMEOUT;
}
/**
* @brief Close current server connection.
* @param Obj: pointer to module handle
* @param socket: server socket
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_CloseServerConnection(ES_WIFIObject_t *Obj, int socket)
{
ES_WIFI_Status_t ret;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"P0=%d\r", socket);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret != ES_WIFI_STATUS_OK)
{
DEBUG(" Can not select socket %s\n", Obj->CmdData);
UNLOCK_WIFI();
return ret;
}
sprintf((char*)Obj->CmdData,"P5=10\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret != ES_WIFI_STATUS_OK)
{
DEBUG(" Open next failed %s\n", Obj->CmdData);
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief Stop a Server.
* @param Obj: pointer to module handle
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_StopServerSingleConn(ES_WIFIObject_t *Obj, int socket)
{
ES_WIFI_Status_t ret;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"P0=%d\r", socket);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret != ES_WIFI_STATUS_OK)
{
DEBUG("Selecting socket failed: %s\n", Obj->CmdData);
UNLOCK_WIFI();
return ret;
}
sprintf((char*)Obj->CmdData,"P5=0\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret != ES_WIFI_STATUS_OK)
{
DEBUG("Stopping server failed %s\n", Obj->CmdData);
UNLOCK_WIFI();
return ret;
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief Configure and Start a Server.
* @param Obj: pointer to module handle
* @param conn: pointer to the connection structure
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_StartServerMultiConn(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"PK=1,3000\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P2=%d\r", conn->LocalPort);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P8=6\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P5=1\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
#if (ES_WIFI_USE_UART == 1)
if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
{
if(strstr((char *)Obj->CmdData, "Accepted"))
{
ret = ES_WIFI_STATUS_OK;
}
}
#endif
}
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P7=1\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
}
}
}
}
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief Stop a Server.
* @param Obj: pointer to module handle
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_StopServerMultiConn(ES_WIFIObject_t *Obj)
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
LOCK_WIFI();
/* close the socket handle for the current request. */
sprintf((char*)Obj->CmdData,"P7=2\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
/*Get the next request out of the queue */
sprintf((char*)Obj->CmdData,"P7=3\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
#if (ES_WIFI_USE_UART == 1)
if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
{
if(strstr((char *)Obj->CmdData, "Accepted"))
{
ret = ES_WIFI_STATUS_OK;
}
}
#else
do
{
sprintf((char*)Obj->CmdData,"MR\r");
if(AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData) == ES_WIFI_STATUS_OK)
{
if(strstr((char *)Obj->CmdData, "Accepted"))
{
ret = ES_WIFI_STATUS_OK;
break;
}
}
else
{
break;
}
UNLOCK_WIFI();
Obj->fops.IO_Delay(100);
LOCK_WIFI();
}
while(1);
#endif
}
}
UNLOCK_WIFI();
return ret;
}
/**
* @brief Send an amount data over WIFI.
* @param Obj: pointer to module handle
* @param Socket: number of the socket
* @param pdata: pointer to data
* @param len : length of the data to be sent
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_SendData(ES_WIFIObject_t *Obj, uint8_t Socket, uint8_t *pdata, uint16_t Reqlen , uint16_t *SentLen , uint32_t Timeout)
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
LOCK_WIFI();
if(Reqlen >= ES_WIFI_PAYLOAD_SIZE ) Reqlen= ES_WIFI_PAYLOAD_SIZE;
*SentLen = Reqlen;
sprintf((char*)Obj->CmdData,"P0=%d\r", Socket);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"S2=%lu\r",Timeout);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char *)Obj->CmdData,"S3=%04d\r",Reqlen);
ret = AT_RequestSendData(Obj, Obj->CmdData, pdata, Reqlen, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
if(strstr((char *)Obj->CmdData,"-1\r\n"))
{
DEBUG("Send Data detect error %s\n", (char *)Obj->CmdData);
ret = ES_WIFI_STATUS_ERROR;
}
}
else
{
DEBUG("Send Data command failed\n");
}
}
else
{
DEBUG("S2 command failed\n");
}
}
else
{
DEBUG("P0 command failed\n");
}
if (ret == ES_WIFI_STATUS_ERROR)
{
*SentLen = 0;
}
UNLOCK_WIFI();
return ret;
}
ES_WIFI_Status_t ES_WIFI_SendDataTo(ES_WIFIObject_t *Obj, uint8_t Socket, uint8_t *pdata, uint16_t Reqlen , uint16_t *SentLen, uint32_t Timeout, uint8_t *IPaddr, uint16_t Port)
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
LOCK_WIFI();
sprintf((char*)Obj->CmdData,"P0=%d\r", Socket);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if (ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P2=%d\r", /*LocalPort*/ 56830 ); // WARN: Does not work!
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
// ? Are we sure that the Firmware can change the packet destination without stopping the socket?
if (ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P4=%d\r", Port);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
if (ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"P3=%d.%d.%d.%d\r", IPaddr[0], IPaddr[1], IPaddr[2], IPaddr[3]);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
if (ret == ES_WIFI_STATUS_OK)
{
if(Reqlen >= ES_WIFI_PAYLOAD_SIZE )
{
Reqlen= ES_WIFI_PAYLOAD_SIZE;
}
}
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData, "S2=%lu\r", Timeout);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char *)Obj->CmdData, "S3=%04d\r", Reqlen);
ret = AT_RequestSendData(Obj, Obj->CmdData, pdata, Reqlen, Obj->CmdData);
}
if(ret == ES_WIFI_STATUS_OK)
{
char *ptr = strstr((char *)Obj->CmdData,"-1\r\n");
if(ptr != NULL)
{
if (ptr < (char *) &Obj->CmdData[sizeof(Obj->CmdData)])
{
ret = ES_WIFI_STATUS_ERROR;
}
else
{
ret = ES_WIFI_STATUS_IO_ERROR;
}
}
}
if (ret == ES_WIFI_STATUS_OK)
{
*SentLen = Reqlen;
}
else
{
DEBUG("Send error:\n%s\n", Obj->CmdData);
*SentLen = 0;
}
UNLOCK_WIFI();
return ret;
}
int issue15=0;
/**
* @brief Receive an amount data over WIFI.
* @param Obj: pointer to module handle
* @param Socket: number of the socket
* @param pdata: pointer to data
* @param len : pointer to the length of the data to be received
* @retval Operation Status.
*/
ES_WIFI_Status_t ES_WIFI_ReceiveData(ES_WIFIObject_t *Obj, uint8_t Socket, uint8_t *pdata, uint16_t Reqlen, uint16_t *Receivedlen, uint32_t Timeout)
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
LOCK_WIFI();
if(Reqlen <= ES_WIFI_PAYLOAD_SIZE )
{
sprintf((char*)Obj->CmdData,"P0=%d\r", Socket);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"R1=%d\r", Reqlen);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"R2=%lu\r", Timeout);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"R0\r");
ret = AT_RequestReceiveData(Obj, Obj->CmdData, (char *)pdata, Reqlen, Receivedlen);
if (ret != ES_WIFI_STATUS_OK)
{
DEBUG("AT_RequestReceiveData failed\n");
}
}
else
{
DEBUG("setting timeout failed\n");
}
}
else
{
DEBUG("setting requested len failed\n");
*Receivedlen = 0;
}
}
else
{
DEBUG("setting socket for read failed\n");
issue15++;
}
}
UNLOCK_WIFI();
return ret;
}
ES_WIFI_Status_t ES_WIFI_ReceiveDataFrom(ES_WIFIObject_t *Obj, uint8_t Socket, uint8_t *pdata, uint16_t Reqlen, uint16_t *Receivedlen, uint32_t Timeout, uint8_t *IPaddr, uint16_t *pPort)
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
*Receivedlen = 0;
LOCK_WIFI();
if (Reqlen <= ES_WIFI_PAYLOAD_SIZE )
{
sprintf((char*)Obj->CmdData, "P0=%d\r", Socket);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"R1=%d\r", Reqlen);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
else
{
DEBUG("P0 failed.\n");
}
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"R2=%lu\r", Timeout);
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
}
else
{
DEBUG("R1 failed.\n");
}
if(ret == ES_WIFI_STATUS_OK)
{
sprintf((char*)Obj->CmdData,"R0\r");
ret = AT_RequestReceiveData(Obj, Obj->CmdData, (char *)pdata, Reqlen, Receivedlen);
}
else
{
DEBUG("R2 failed.\n");
}
if (ret == ES_WIFI_STATUS_OK)
{
if (*Receivedlen > Reqlen)
{
DEBUG("AT_RequestReceiveData overflow\n.");
ret = ES_WIFI_STATUS_ERROR;
}
else
{
if (*Receivedlen > 0)
{
/* Get the peer addr */
sprintf((char*)Obj->CmdData,"P?\r");
ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
if (ret == ES_WIFI_STATUS_OK)
{
ES_WIFI_Transport_t TransportSettings;
memset(&TransportSettings, 0, sizeof(TransportSettings));
AT_ParseTransportSettings((char *) Obj->CmdData, &TransportSettings);
memcpy(IPaddr, TransportSettings.Remote_IP_Addr, 4);
*pPort = TransportSettings.Remote_Port;
}
}
}
}
if (ret != ES_WIFI_STATUS_OK)
{
DEBUG("Read error:\n%s\n", Obj->CmdData);
*Receivedlen = 0;
}
UNLOCK_WIFI();
return ret;
}
ES_WIFI_Status_t ES_WIFI_StoreCreds( ES_WIFIObject_t *Obj,
ES_WIFI_CredsFunction_t credsFunction, uint8_t credSet,
uint8_t* ca, uint16_t caLength,
uint8_t* certificate, uint16_t certificateLength,
uint8_t* key, uint16_t keyLength )
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
LOCK_WIFI();
/* Set the credential set to use. */
sprintf( ( char* )( Obj->CmdData ),"PF=%d,%d\r", credsFunction, credSet );
ret = AT_ExecuteCommand( Obj, Obj->CmdData, Obj->CmdData );
if( ret == ES_WIFI_STATUS_OK )
{
/* Store rootCA. */
sprintf( ( char* )( Obj->CmdData ),"PG=%d,0,%04d\r", credSet, caLength );
ret = AT_RequestSendData( Obj, Obj->CmdData, ( uint8_t* ) ca, caLength, Obj->CmdData );
if( ret == ES_WIFI_STATUS_OK )
{
/* Store device certificate. */
sprintf( ( char* )( Obj->CmdData ),"PG=%d,1,%04d\r", credSet, certificateLength );
ret = AT_RequestSendData( Obj, Obj->CmdData, certificate, certificateLength, Obj->CmdData );
if( ret == ES_WIFI_STATUS_OK )
{
/* Store device key. */
sprintf( ( char* )( Obj->CmdData ),"PG=%d,2,%04d\r", credSet, keyLength );
ret = AT_RequestSendData( Obj, Obj->CmdData, key, keyLength, Obj->CmdData );
}
}
}
UNLOCK_WIFI();
return ret;
}
ES_WIFI_Status_t ES_WIFI_StoreCA( ES_WIFIObject_t *Obj,
ES_WIFI_CredsFunction_t credsFunction,
uint8_t credSet,
uint8_t* ca,
uint16_t caLength )
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
LOCK_WIFI();
/* Set the credential set to use. */
sprintf( ( char* )( Obj->CmdData ),"PF=%d,%d\r", credsFunction, credSet );
ret = AT_ExecuteCommand( Obj, Obj->CmdData, Obj->CmdData );
if( ret == ES_WIFI_STATUS_OK )
{
/* Store CA. */
sprintf( ( char* )( Obj->CmdData ),"PG=%d,0,%04d\r", credSet, caLength );
ret = AT_RequestSendData( Obj, Obj->CmdData, ca, caLength, Obj->CmdData );
}
UNLOCK_WIFI();
return ret;
}
ES_WIFI_Status_t ES_WIFI_StoreCertificate( ES_WIFIObject_t *Obj,
ES_WIFI_CredsFunction_t credsFunction,
uint8_t credSet,
uint8_t* certificate,
uint16_t certificateLength )
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
LOCK_WIFI();
/* Set the credential set to use. */
sprintf( ( char* )( Obj->CmdData ),"PF=%d,%d\r", credsFunction, credSet );
ret = AT_ExecuteCommand( Obj, Obj->CmdData, Obj->CmdData );
if( ret == ES_WIFI_STATUS_OK )
{
/* Store certificate. */
sprintf( ( char* )( Obj->CmdData ),"PG=%d,1,%04d\r", credSet, certificateLength );
ret = AT_RequestSendData( Obj, Obj->CmdData, certificate, certificateLength, Obj->CmdData );
}
UNLOCK_WIFI();
return ret;
}
ES_WIFI_Status_t ES_WIFI_StoreKey( ES_WIFIObject_t *Obj,
ES_WIFI_CredsFunction_t credsFunction,
uint8_t credSet,
uint8_t* key,
uint16_t keyLength )
{
ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
LOCK_WIFI();
/* Set the credential set to use. */
sprintf( ( char* )( Obj->CmdData ),"PF=%d,%d\r", credsFunction, credSet );
ret = AT_ExecuteCommand( Obj, Obj->CmdData, Obj->CmdData );
if( ret == ES_WIFI_STATUS_OK )
{
/* Store device key. */
sprintf( ( char* )( Obj->CmdData ),"PG=%d,2,%04d\r", credSet, keyLength );
ret = AT_RequestSendData( Obj, Obj->CmdData, key, keyLength, Obj->CmdData );
}
UNLOCK_WIFI();
return ret;
}
/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/