Changes on the code

Dependencies:   BSP_B-L475E-IOT01

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers es_wifi.c Source File

es_wifi.c

00001 /**
00002   ******************************************************************************
00003   * @file    es-wifi.c
00004   * @author  MCD Application Team
00005   * @version V1.8.0
00006   * @date    21-April-2017
00007   * @brief   This file provides a set of functions to manage the es-wifi module.
00008   ******************************************************************************
00009   * @attention
00010   *
00011   * <h2><center>&copy; Copyright © 2017 STMicroelectronics International N.V. 
00012   * All rights reserved.</center></h2>
00013   *
00014   * Redistribution and use in source and binary forms, with or without 
00015   * modification, are permitted, provided that the following conditions are met:
00016   *
00017   * 1. Redistribution of source code must retain the above copyright notice, 
00018   *    this list of conditions and the following disclaimer.
00019   * 2. Redistributions in binary form must reproduce the above copyright notice,
00020   *    this list of conditions and the following disclaimer in the documentation
00021   *    and/or other materials provided with the distribution.
00022   * 3. Neither the name of STMicroelectronics nor the names of other 
00023   *    contributors to this software may be used to endorse or promote products 
00024   *    derived from this software without specific written permission.
00025   * 4. This software, including modifications and/or derivative works of this 
00026   *    software, must execute solely and exclusively on microcontroller or
00027   *    microprocessor devices manufactured by or for STMicroelectronics.
00028   * 5. Redistribution and use of this software other than as permitted under 
00029   *    this license is void and will automatically terminate your rights under 
00030   *    this license. 
00031   *
00032   * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" 
00033   * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT 
00034   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 
00035   * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY
00036   * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT 
00037   * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00038   * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
00039   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 
00040   * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
00041   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
00042   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
00043   * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00044   *
00045   ******************************************************************************
00046   */
00047 /* Includes ------------------------------------------------------------------*/
00048 #include "es_wifi.h"
00049 
00050 #define AT_OK_STRING "\r\nOK\r\n> "
00051 #define AT_OK_STRING_LEN 8
00052 
00053 #define AT_ERROR_STRING "\r\nERROR"
00054 
00055 
00056 
00057 #define CHARISHEXNUM(x)                 (((x) >= '0' && (x) <= '9') || \
00058                                          ((x) >= 'a' && (x) <= 'f') || \
00059                                          ((x) >= 'A' && (x) <= 'F'))
00060 
00061 #define CHARISNUM(x)                    ((x) >= '0' && (x) <= '9')
00062 #define CHAR2NUM(x)                     ((x) - '0')
00063 /* Private function prototypes -----------------------------------------------*/
00064 static  uint8_t Hex2Num(char a);
00065 static uint32_t ParseHexNumber(char* ptr, uint8_t* cnt);
00066 static uint32_t ParseHexNumber(char* ptr, uint8_t* cnt);
00067 static void ParseMAC(char* ptr, uint8_t* arr);
00068 static void ParseIP(char* ptr, uint8_t* arr);
00069 static ES_WIFI_SecurityType_t ParseSecurity(char* ptr);
00070 #if (ES_WIFI_USE_UART == 1)
00071 static void AT_ParseUARTConfig(char *pdata, ES_WIFI_UARTConfig_t *pConfig);
00072 #endif
00073 static void AT_ParseSystemConfig(char *pdata, ES_WIFI_SystemConfig_t *pConfig);
00074 static void AT_ParseConnSettings(char *pdata, ES_WIFI_Network_t *NetSettings);
00075 static ES_WIFI_Status_t AT_ExecuteCommand(ES_WIFIObject_t *Obj, uint8_t* cmd, uint8_t *pdata);
00076 
00077 /* Private functions ---------------------------------------------------------*/
00078 /**
00079   * @brief  Convert char in Hex format to integer.
00080   * @param  a: character to convert
00081   * @retval integer value.
00082   */
00083 static  uint8_t Hex2Num(char a) 
00084 {
00085     if (a >= '0' && a <= '9') {                             /* Char is num */
00086         return a - '0';
00087     } else if (a >= 'a' && a <= 'f') {                      /* Char is lowercase character A - Z (hex) */
00088         return (a - 'a') + 10;
00089     } else if (a >= 'A' && a <= 'F') {                      /* Char is uppercase character A - Z (hex) */
00090         return (a - 'A') + 10;
00091     }
00092     
00093     return 0;
00094 }
00095 
00096 /**
00097   * @brief  Extract a hex number from a string.
00098   * @param  ptr: pointer to string
00099   * @param  cnt: pointer to the number of parsed digit
00100   * @retval Hex value.
00101   */
00102 static uint32_t ParseHexNumber(char* ptr, uint8_t* cnt) 
00103 {
00104     uint32_t sum = 0;
00105     uint8_t i = 0;
00106     
00107     while (CHARISHEXNUM(*ptr)) {                            /* Parse number */
00108         sum <<= 4;
00109         sum += Hex2Num(*ptr);
00110         ptr++;
00111         i++;
00112     }
00113     
00114     if (cnt != NULL) {                                      /* Save number of characters used for number */
00115         *cnt = i;
00116     }
00117     return sum;                                             /* Return number */
00118 }
00119 
00120 /**
00121   * @brief  Parses and returns number from string.
00122   * @param  ptr: pointer to string
00123   * @param  cnt: pointer to the number of parsed digit
00124   * @retval integer value.
00125   */
00126 static int32_t ParseNumber(char* ptr, uint8_t* cnt) 
00127 {
00128     uint8_t minus = 0, i = 0;
00129     int32_t sum = 0;
00130     
00131     if (*ptr == '-') {                                      /* Check for minus character */
00132         minus = 1;
00133         ptr++;
00134         i++;
00135     }
00136     while (CHARISNUM(*ptr)) {                               /* Parse number */
00137         sum = 10 * sum + CHAR2NUM(*ptr);
00138         ptr++;
00139         i++;
00140     }
00141     if (cnt != NULL) {                                      /* Save number of characters used for number */
00142         *cnt = i;
00143     }
00144     if (minus) {                                            /* Minus detected */
00145         return 0 - sum;
00146     }
00147     return sum;                                             /* Return number */
00148 }
00149 
00150 /**
00151   * @brief  Parses and returns MAC address.
00152   * @param  ptr: pointer to string
00153   * @param  arr: pointer to MAC array
00154   * @retval None.
00155   */
00156 static void ParseMAC(char* ptr, uint8_t* arr) 
00157 {
00158   uint8_t hexnum = 0, hexcnt;
00159   
00160   while(* ptr) { 
00161     hexcnt = 1;
00162     if(*ptr != ':')
00163     {
00164       arr[hexnum++] = ParseHexNumber(ptr, &hexcnt);
00165     }
00166     ptr = ptr + hexcnt;
00167   }
00168 }
00169 
00170 /**
00171   * @brief  Parses and returns IP address.
00172   * @param  ptr: pointer to string
00173   * @param  arr: pointer to IP array
00174   * @retval None.
00175   */
00176 static  void ParseIP(char* ptr, uint8_t* arr) 
00177 {
00178   uint8_t hexnum = 0, hexcnt;
00179   
00180   while(* ptr) { 
00181     hexcnt = 1;
00182     if(*ptr != '.')
00183     {
00184       arr[hexnum++] = ParseNumber(ptr, &hexcnt);
00185     }
00186     ptr = ptr + hexcnt;
00187   }
00188 }
00189 
00190 /**
00191   * @brief  Parses Security type.
00192   * @param  ptr: pointer to string
00193   * @retval Encryption type.
00194   */
00195 static ES_WIFI_SecurityType_t ParseSecurity(char* ptr) 
00196 {
00197   if(strstr(ptr,"Open")) return ES_WIFI_SEC_OPEN;
00198   else if(strstr(ptr,"WEP")) return ES_WIFI_SEC_WEP;
00199   else if(strstr(ptr,"WPA")) return ES_WIFI_SEC_WPA;   
00200   else if(strstr(ptr,"WPA2")) return ES_WIFI_SEC_WPA2; 
00201   else if(strstr(ptr,"WPA WPA2")) return ES_WIFI_SEC_WPA_WPA2; 
00202   else if(strstr(ptr,"WPA2 TKIP")) return ES_WIFI_SEC_WPA2_TKIP;   
00203   else return ES_WIFI_SEC_UNKNOWN;           
00204 }
00205 
00206 /**
00207   * @brief  Parses ES module informations and save them in the handle.
00208   * @param  Obj: pointer to module handle
00209   * @param  ptr: pointer to string
00210   * @retval None.
00211   */
00212 static void AT_ParseInfo(ES_WIFIObject_t *Obj,uint8_t *pdata)
00213 {
00214   char *ptr;
00215   uint8_t num = 0;
00216   
00217   ptr = strtok((char *)pdata + 2, ",");  
00218   
00219   while (ptr != NULL){
00220     switch (num++) { 
00221     case 0:
00222       strncpy((char *)Obj->Product_ID,  ptr, ES_WIFI_PRODUCT_ID_SIZE);
00223       break;
00224       
00225     case 1:
00226       strncpy((char *)Obj->FW_Rev,  ptr, ES_WIFI_FW_REV_SIZE );
00227       break;
00228       
00229     case 2:
00230       strncpy((char *)Obj->API_Rev,  ptr, ES_WIFI_API_REV_SIZE);      
00231       break;
00232       
00233     case 3:
00234       strncpy((char *)Obj->Stack_Rev,  ptr, ES_WIFI_STACK_REV_SIZE);   
00235       break;
00236       
00237     case 4:
00238       strncpy((char *)Obj->RTOS_Rev,  ptr, ES_WIFI_RTOS_REV_SIZE);        
00239       break;
00240       
00241     case 5:
00242       Obj->CPU_Clock = ParseNumber(ptr, NULL);
00243       break;      
00244       
00245     case 6:
00246       ptr = strtok(ptr, "\r"); 
00247       strncpy((char *)Obj->Product_Name,  ptr, ES_WIFI_PRODUCT_NAME_SIZE);         
00248       break;
00249       
00250     default: break;
00251     }
00252     ptr = strtok(NULL, ","); 
00253   }
00254 }
00255 
00256 /**
00257   * @brief  Parses Access point configuration.
00258   * @param  APs: Access points structure
00259   * @param  ptr: pointer to string
00260   * @retval None.
00261   */
00262 static void AT_ParseAP(char *pdata, ES_WIFI_APs_t *APs)
00263 {
00264   uint8_t num = 0;
00265   char *ptr;
00266   APs->nbr = 0;
00267  
00268   ptr = strtok(pdata + 2, ",");   
00269   
00270   while ((ptr != NULL) && (APs->nbr < ES_WIFI_MAX_DETECTED_AP)) {
00271     switch (num++) { 
00272     case 0: /* Ignore index */
00273     case 4: /* Ignore Max Rate */
00274     case 5: /* Ignore Network Type */
00275     case 7: /* Ignore Radio Band */      
00276       break;
00277       
00278     case 1:
00279       ptr[strlen(ptr) - 1] = 0;
00280       strncpy((char *)APs->AP[APs->nbr].SSID,  ptr+ 1, ES_WIFI_MAX_SSID_NAME_SIZE + 1); 
00281       break;
00282       
00283     case 2: 
00284       ParseMAC(ptr, APs->AP[APs->nbr].MAC);
00285       break;
00286 
00287     case 3: 
00288       APs->AP[APs->nbr].RSSI = ParseNumber(ptr, NULL);
00289       break;
00290       
00291     case 6: 
00292       APs->AP[APs->nbr].Security = ParseSecurity(ptr);
00293       break;      
00294 
00295     case 8:            
00296       APs->AP[APs->nbr].Channel = ParseNumber(ptr, NULL);
00297       APs->nbr++; 
00298       num = 1;
00299       break;
00300 
00301     default: 
00302       break;
00303     }
00304     ptr = strtok(NULL, ","); 
00305   }
00306 }
00307 
00308 #if (ES_WIFI_USE_UART == 1)
00309 /**
00310   * @brief  Parses UART configuration.
00311   * @param  APs: UART Config structure
00312   * @param  ptr: pointer to string
00313   * @retval None.
00314   */
00315 static void AT_ParseUARTConfig(char *pdata, ES_WIFI_UARTConfig_t *pConfig)
00316 {
00317   uint8_t num = 0;
00318   char *ptr;
00319  
00320   ptr = strtok(pdata + 2, ",");   
00321   
00322   while (ptr != NULL) {
00323     switch (num++) {  
00324     case 0: 
00325       pConfig->Port = ParseNumber(ptr, NULL);
00326       break;
00327 
00328     case 1: 
00329       pConfig->BaudRate = ParseNumber(ptr, NULL);
00330       break;
00331       
00332     case 2: 
00333       pConfig->DataWidth = ParseNumber(ptr, NULL);
00334       break;
00335 
00336     case 3: 
00337       pConfig->Parity = ParseNumber(ptr, NULL);
00338       break;
00339     
00340     case 4: 
00341       pConfig->StopBits = ParseNumber(ptr, NULL);
00342       break;   
00343       
00344     case 5: 
00345       pConfig->Mode = ParseNumber(ptr, NULL);
00346       break;        
00347       
00348     default: 
00349       break;
00350     }
00351     ptr = strtok(NULL, ","); 
00352   }
00353 }
00354 #endif
00355 
00356 /**
00357   * @brief  Parses System configuration.
00358   * @param  APs: System Config structure
00359   * @param  ptr: pointer to string
00360   * @retval None.
00361   */
00362 static void AT_ParseSystemConfig(char *pdata, ES_WIFI_SystemConfig_t *pConfig)
00363 {
00364   uint8_t num = 0;
00365   char *ptr;
00366  
00367   ptr = strtok(pdata + 2, ",");   
00368   
00369   while (ptr != NULL) {
00370     switch (num++) {  
00371     case 0: 
00372       pConfig->Configuration = ParseNumber(ptr, NULL);
00373       break;
00374 
00375     case 1: 
00376       pConfig->WPSPin = ParseNumber(ptr, NULL);
00377       break;
00378       
00379     case 2: 
00380       pConfig->VID = ParseNumber(ptr, NULL);
00381       break;
00382       
00383     case 3: 
00384       pConfig->PID = ParseNumber(ptr, NULL);
00385       break;      
00386 
00387     case 4: 
00388       ParseMAC(ptr, pConfig->MAC);
00389       break;
00390     
00391     case 5: 
00392       ParseIP(ptr, pConfig->AP_IPAddress);
00393       break;   
00394       
00395     case 6: 
00396       pConfig->PS_Mode = ParseNumber(ptr, NULL);
00397       break;        
00398      
00399     case 7: 
00400       pConfig->RadioMode = ParseNumber(ptr, NULL);
00401       break;
00402     
00403     case 8: 
00404       pConfig->CurrentBeacon = ParseNumber(ptr, NULL);
00405       break;   
00406       
00407     case 9: 
00408       pConfig->PrevBeacon = ParseNumber(ptr, NULL);
00409       break;
00410       
00411     case 10: 
00412       pConfig->ProductName = ParseNumber(ptr, NULL);
00413       break;      
00414       
00415     default: 
00416       break;
00417     }
00418     ptr = strtok(NULL, ","); 
00419   }
00420 }
00421 
00422 
00423 /**
00424   * @brief  Parses WIFI connection settings.
00425   * @param  NetSettings: settings
00426   * @param  pdata: pointer to data
00427   * @retval None.
00428   */
00429 static void AT_ParseConnSettings(char *pdata, ES_WIFI_Network_t *NetSettings)
00430 {
00431   uint8_t num = 0;
00432   char *ptr;
00433  
00434   ptr = strtok(pdata + 2, ",");   
00435   
00436   while (ptr != NULL) {
00437     switch (num++) {      
00438     case 0:
00439       strncpy((char *)NetSettings->SSID,  ptr, ES_WIFI_MAX_SSID_NAME_SIZE + 1); 
00440       break;
00441       
00442     case 1: 
00443       strncpy((char *)NetSettings->pswd,  ptr, ES_WIFI_MAX_PSWD_NAME_SIZE + 1); 
00444       break;
00445       
00446     case 2: 
00447         NetSettings->Security = (ES_WIFI_SecurityType_t)ParseNumber(ptr, NULL);
00448         break;   
00449 
00450     case 3: 
00451       NetSettings->DHCP_IsEnabled = ParseNumber(ptr, NULL);
00452       break;
00453       
00454     case 4: 
00455       NetSettings->IP_Ver = (ES_WIFI_IPVer_t)ParseNumber(ptr, NULL);
00456       break;      
00457       
00458     case 5: 
00459       ParseIP(ptr, NetSettings->IP_Addr);
00460       break; 
00461       
00462     case 6: 
00463       ParseIP(ptr, NetSettings->IP_Mask);
00464       break;      
00465       
00466     case 7: 
00467       ParseIP(ptr, NetSettings->Gateway_Addr);
00468       break; 
00469       
00470     case 8: 
00471       ParseIP(ptr, NetSettings->DNS1);
00472       break;      
00473       
00474     case 9: 
00475       ParseIP(ptr, NetSettings->DNS2);
00476       break; 
00477       
00478     case 10: 
00479       NetSettings->JoinRetries = ParseNumber(ptr, NULL);
00480       break;  
00481       
00482     case 11: 
00483       NetSettings->AutoConnect = ParseNumber(ptr, NULL);
00484       break;  
00485 
00486     default: 
00487       break;
00488     }
00489     ptr = strtok(NULL, ",");
00490     if ((ptr != NULL) && (ptr[-1] == ','))
00491     { /* Ignore empty fields */
00492       num++;
00493     }
00494   }
00495 }
00496 
00497 /**
00498   * @brief  Execute AT command.
00499   * @param  Obj: pointer to module handle
00500   * @param  cmd: pointer to command string
00501   * @param  pdata: pointer to returned data
00502   * @retval Operation Status.
00503   */
00504 static ES_WIFI_Status_t AT_ExecuteCommand(ES_WIFIObject_t *Obj, uint8_t* cmd, uint8_t *pdata)
00505 {
00506   if(Obj->fops.IO_Send(cmd, strlen((char*)cmd), Obj->Timeout) > 0)
00507   {
00508     int16_t n=Obj->fops.IO_Receive(pdata, 0, Obj->Timeout);
00509     if(n > 0)
00510     {
00511       *(pdata+n)=0;
00512       if(strstr((char *)pdata, AT_OK_STRING))
00513       {
00514         return ES_WIFI_STATUS_OK;
00515       }
00516       else if(strstr((char *)pdata, AT_ERROR_STRING))
00517       {
00518         return ES_WIFI_STATUS_ERROR;
00519       }      
00520     }
00521   }
00522   return ES_WIFI_STATUS_IO_ERROR;
00523 }
00524 
00525 /**
00526   * @brief  Execute AT command with data.
00527   * @param  Obj: pointer to module handle
00528   * @param  cmd: pointer to command string
00529   * @param  pcmd_data: pointer to binary data
00530   * @param  len: binary data length
00531   * @param  pdata: pointer to returned data
00532   * @retval Operation Status.
00533   */
00534 static ES_WIFI_Status_t AT_RequestSendData(ES_WIFIObject_t *Obj, uint8_t* cmd, uint8_t *pcmd_data, uint16_t len, uint8_t *pdata)
00535 {      
00536   /* can send only even number of byte on first send */
00537   uint16_t n=strlen((char*)cmd);
00538   if (n &1 ) return ES_WIFI_STATUS_ERROR;
00539   if(Obj->fops.IO_Send(cmd, n, Obj->Timeout) == n)
00540   {
00541     int16_t n=Obj->fops.IO_Send(pcmd_data, len, Obj->Timeout);
00542     if(n == len)
00543     {
00544       n = Obj->fops.IO_Receive(pdata, 0, Obj->Timeout);
00545       if(n > 0)
00546       {
00547         *(pdata+n)=0;
00548         if(strstr((char *)pdata, AT_OK_STRING))
00549         {
00550           return ES_WIFI_STATUS_OK;
00551         }
00552         else if(strstr((char *)pdata, AT_ERROR_STRING))
00553         {
00554           return ES_WIFI_STATUS_ERROR;
00555         }      
00556       }
00557     }
00558     else
00559     {
00560       return ES_WIFI_STATUS_ERROR;
00561     }
00562   }
00563   return ES_WIFI_STATUS_IO_ERROR;
00564 }
00565 
00566 
00567 /**
00568   * @brief  Parses Received short data length.
00569   * @param  Obj: pointer to module handle
00570   * @param  cmd:command formatted string
00571   * @param  pdata: payload
00572   * @param  Reqlen : requested Data length.
00573   * @param  ReadData : pointer to received data length.
00574   * @retval Operation Status.
00575   */
00576 static ES_WIFI_Status_t ReceiveShortDataLen(ES_WIFIObject_t *Obj,  char *pdata, uint16_t Reqlen, uint16_t *ReadData)
00577 {
00578    uint16_t len;
00579    
00580    len = Obj->fops.IO_Receive(Obj->CmdData, Reqlen + AT_OK_STRING_LEN , Obj->Timeout);
00581    
00582    if (len >= AT_OK_STRING_LEN) 
00583    {
00584      if(strstr((char *)Obj->CmdData + len - AT_OK_STRING_LEN, AT_OK_STRING))
00585      {
00586        *ReadData = len - AT_OK_STRING_LEN;
00587        memcpy(pdata, Obj->CmdData, *ReadData);
00588        return ES_WIFI_STATUS_OK; 
00589      }
00590    }
00591    return ES_WIFI_STATUS_IO_ERROR;
00592    
00593 }
00594 
00595 /**
00596   * @brief  Parses Received long data length.
00597   * @param  Obj: pointer to module handle
00598   * @param  cmd:command formatted string
00599   * @param  pdata: payload
00600   * @param  Reqlen : requested Data length.
00601   * @param  ReadData : pointer to received data length.
00602   * @retval Operation Status.
00603   */
00604 static ES_WIFI_Status_t ReceiveLongDataLen(ES_WIFIObject_t *Obj,  char *pdata, uint16_t Reqlen, uint16_t *ReadData)
00605 {
00606   uint16_t len, rlen;
00607   
00608   len = Obj->fops.IO_Receive((uint8_t *)pdata, Reqlen, Obj->Timeout);
00609   
00610   if (len >= AT_OK_STRING_LEN)  
00611   {
00612     if(strstr((char *)pdata + len - AT_OK_STRING_LEN, AT_OK_STRING))
00613     {
00614       *ReadData = len - AT_OK_STRING_LEN;
00615       return ES_WIFI_STATUS_OK; 
00616     }
00617     else
00618     {     
00619       memcpy(Obj->CmdData, pdata + len - AT_OK_STRING_LEN, AT_OK_STRING_LEN);
00620       rlen = Obj->fops.IO_Receive(Obj->CmdData + AT_OK_STRING_LEN, AT_OK_STRING_LEN, Obj->Timeout);
00621       
00622       if(strstr((char *) Obj->CmdData + rlen, AT_OK_STRING))
00623       {
00624         *ReadData = len + rlen - AT_OK_STRING_LEN;
00625         return ES_WIFI_STATUS_OK; 
00626       }
00627     }
00628   }
00629   return ES_WIFI_STATUS_IO_ERROR;
00630 }
00631 
00632 /**
00633   * @brief  Parses Received data.
00634   * @param  Obj: pointer to module handle
00635   * @param  cmd:command formatted string
00636   * @param  pdata: payload
00637   * @param  Reqlen : requested Data length.
00638   * @param  ReadData : pointer to received data length.
00639   * @retval Operation Status.
00640   */
00641 static ES_WIFI_Status_t AT_RequestReceiveData(ES_WIFIObject_t *Obj, uint8_t* cmd, char *pdata, uint16_t Reqlen, uint16_t *ReadData)
00642 {
00643   if(Obj->fops.IO_Send(cmd, strlen((char*)cmd), Obj->Timeout) > 0)
00644   {
00645     if(Obj->fops.IO_Receive(Obj->CmdData, 2, Obj->Timeout) == 2) /* Read Prompt */
00646     {
00647       if (Reqlen <= AT_OK_STRING_LEN) return ReceiveShortDataLen(Obj,pdata, Reqlen ,ReadData);
00648       if (Reqlen >  AT_OK_STRING_LEN) return ReceiveLongDataLen(Obj,pdata, Reqlen ,ReadData);
00649     }
00650   }  
00651   return ES_WIFI_STATUS_IO_ERROR;
00652 }
00653 
00654 
00655 /**
00656   * @brief  Initialize WIFI module.
00657   * @param  Obj: pointer to module handle
00658   * @retval Operation Status.
00659   */
00660 ES_WIFI_Status_t  ES_WIFI_Init(ES_WIFIObject_t *Obj)
00661 {
00662   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
00663   
00664   Obj->Timeout = ES_WIFI_TIMEOUT;
00665   
00666   if (Obj->fops.IO_Init() == 0)
00667   {
00668     ret = AT_ExecuteCommand(Obj,(uint8_t*)"I?\r\n", Obj->CmdData);
00669     
00670     if(ret == ES_WIFI_STATUS_OK)
00671     {
00672       AT_ParseInfo (Obj, Obj->CmdData);
00673     }
00674   }
00675   return ret;
00676 }
00677 
00678 /**
00679   * @brief  Return ProductID.
00680   * @param  Obj: pointer to module handle
00681   * @param  productID: pointer productID
00682   * @retval Operation Status.
00683   */
00684 ES_WIFI_Status_t  ES_WIFI_GetProductID(ES_WIFIObject_t *Obj, uint8_t *productID)
00685 {
00686   strncpy((char *)productID, (char *)Obj->Product_ID, ES_WIFI_PRODUCT_ID_SIZE);
00687   return ES_WIFI_STATUS_OK;
00688 }
00689 
00690 /**
00691   * @brief  Return Firmware Revision.
00692   * @param  Obj: pointer to module handle
00693   * @param  productID: pointer Revision
00694   * @retval Operation Status.
00695   */
00696 ES_WIFI_Status_t  ES_WIFI_GetFWRevID(ES_WIFIObject_t *Obj, uint8_t *FWRev)
00697 {
00698   strncpy((char *)FWRev, (char *)Obj->FW_Rev, ES_WIFI_FW_REV_SIZE);
00699   return ES_WIFI_STATUS_OK;
00700 }
00701 
00702 /**
00703   * @brief  Return product Name.
00704   * @param  Obj: pointer to module handle
00705   * @param  productID: pointer product Name
00706   * @retval Operation Status.
00707   */
00708 ES_WIFI_Status_t  ES_WIFI_GetProductName(ES_WIFIObject_t *Obj, uint8_t *productName)
00709 {
00710   strncpy((char *)productName, (char *)Obj->Product_Name, ES_WIFI_PRODUCT_NAME_SIZE);
00711   return ES_WIFI_STATUS_OK;
00712 }
00713 
00714 /**
00715   * @brief  Return API revision.
00716   * @param  Obj: pointer to module handle
00717   * @param  productID: pointer API revision.
00718   * @retval Operation Status.
00719   */
00720 ES_WIFI_Status_t  ES_WIFI_GetAPIRev(ES_WIFIObject_t *Obj, uint8_t *APIRev)
00721 {
00722   strncpy((char *)APIRev, (char *)Obj->API_Rev, ES_WIFI_API_REV_SIZE);
00723   return ES_WIFI_STATUS_OK;
00724 }
00725 
00726 /**
00727   * @brief  Return Stack Revision.
00728   * @param  Obj: pointer to module handle
00729   * @param  productID: pointer Stack Revision
00730   * @retval Operation Status.
00731   */
00732 ES_WIFI_Status_t  ES_WIFI_GetStackRev(ES_WIFIObject_t *Obj, uint8_t *StackRev)
00733 {
00734   strncpy((char *)StackRev, (char *)Obj->Stack_Rev, ES_WIFI_STACK_REV_SIZE);
00735   return ES_WIFI_STATUS_OK;
00736 }
00737 
00738 /**
00739   * @brief  Return RTOS Revision
00740   * @param  Obj: pointer to module handle
00741   * @param  productID: pointer RTOS Revision
00742   * @retval Operation Status.
00743   */
00744 ES_WIFI_Status_t  ES_WIFI_GetRTOSRev(ES_WIFIObject_t *Obj, uint8_t *RTOSRev)
00745 {
00746   strncpy((char *)RTOSRev, (char *)Obj->RTOS_Rev, ES_WIFI_RTOS_REV_SIZE);
00747   return ES_WIFI_STATUS_OK;
00748 }
00749 
00750 
00751 /**
00752   * @brief  Initialize WIFI module.
00753   * @param  Obj: pointer to module handle
00754   * @retval Operation Status.
00755   */
00756 ES_WIFI_Status_t  ES_WIFI_RegisterBusIO(ES_WIFIObject_t *Obj, IO_Init_Func IO_Init,
00757                                                               IO_DeInit_Func  IO_DeInit,
00758                                                               IO_Delay_Func   IO_Delay,  
00759                                                               IO_Send_Func    IO_Send,
00760                                                               IO_Receive_Func  IO_Receive)
00761 {
00762   if(!Obj || !IO_Init || !IO_DeInit || !IO_Send || !IO_Receive)
00763   {
00764     return ES_WIFI_STATUS_ERROR;
00765   }
00766 
00767   Obj->fops.IO_Init = IO_Init;
00768   Obj->fops.IO_Send = IO_Send;
00769   Obj->fops.IO_Receive = IO_Receive;
00770   Obj->fops.IO_Delay = IO_Delay;  
00771   
00772   return ES_WIFI_STATUS_OK;
00773 }
00774 
00775 /**
00776   * @brief  Change default Timeout.
00777   * @param  Obj: pointer to module handle
00778   * @param  Timeout: Timeout in mS
00779   * @retval Operation Status.
00780   */
00781 ES_WIFI_Status_t  ES_WIFI_SetTimeout(ES_WIFIObject_t *Obj, uint32_t Timeout)
00782 {
00783   Obj->Timeout = Timeout;
00784   return ES_WIFI_STATUS_OK;
00785 }
00786 
00787 /**
00788   * @brief  List all detected APs.
00789   * @param  Obj: pointer to module handle
00790   * @param  APs: pointer Access points structure
00791   * @retval Operation Status.
00792   */
00793 ES_WIFI_Status_t  ES_WIFI_ListAccessPoints(ES_WIFIObject_t *Obj, ES_WIFI_APs_t *APs)
00794 {  
00795 
00796   ES_WIFI_Status_t ret;
00797 
00798   ret = AT_ExecuteCommand(Obj,(uint8_t*)"F0\r", Obj->CmdData);
00799   if(ret == ES_WIFI_STATUS_OK)
00800   {
00801      AT_ParseAP((char *)Obj->CmdData, APs);
00802   }
00803   return ret;
00804 }
00805 
00806 /**
00807   * @brief  Join an Access point.
00808   * @param  Obj: pointer to module handle
00809   * @param  Ssid: the access point id.
00810   * @param  Password: the Access point password.
00811   * @param  SecType: Security type.
00812   * @retval Operation Status.
00813   */
00814 ES_WIFI_Status_t ES_WIFI_Connect(ES_WIFIObject_t *Obj, const char* SSID, 
00815                                          const char* Password,
00816                                          ES_WIFI_SecurityType_t SecType)
00817 {
00818   ES_WIFI_Status_t ret;
00819   
00820   sprintf((char*)Obj->CmdData,"C1=%s\r", SSID);
00821   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00822   if(ret == ES_WIFI_STATUS_OK)
00823   {
00824     sprintf((char*)Obj->CmdData,"C2=%s\r", Password);
00825     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00826     
00827     if(ret == ES_WIFI_STATUS_OK)
00828     {
00829       Obj->Security = SecType;
00830       sprintf((char*)Obj->CmdData,"C3=%d\r", (uint8_t)SecType);
00831       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00832       
00833       if(ret == ES_WIFI_STATUS_OK)
00834       {
00835         sprintf((char*)Obj->CmdData,"C0\r");
00836         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);  
00837         if(ret == ES_WIFI_STATUS_OK)
00838         {
00839            Obj->NetSettings.IsConnected = 1;
00840         }
00841       }    
00842     }
00843   }
00844   return ret;
00845 }
00846 
00847 /**
00848   * @brief  Check whether the module is connected to an access point.
00849   * @retval Operation Status.
00850   */
00851 uint8_t ES_WIFI_IsConnected(ES_WIFIObject_t *Obj)
00852 {
00853   return Obj->NetSettings.IsConnected;
00854 }
00855 /**
00856   * @brief  Disconnect from a network.
00857   * @param  Obj: pointer to module handle
00858   * @retval Operation Status.
00859   */
00860 ES_WIFI_Status_t ES_WIFI_Disconnect(ES_WIFIObject_t *Obj)
00861 {
00862   sprintf((char*)Obj->CmdData,"CD\r"); 
00863   return  AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
00864 }
00865 /**
00866   * @brief  Return network settings.
00867   * @param  Obj: pointer to module handle
00868   * @param  Pointer to network setting structure.
00869   * @retval Operation Status.
00870   */
00871 ES_WIFI_Status_t ES_WIFI_GetNetworkSettings(ES_WIFIObject_t *Obj)
00872 {
00873   ES_WIFI_Status_t ret;
00874   
00875   sprintf((char*)Obj->CmdData,"C?\r");
00876   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00877   
00878   if(ret == ES_WIFI_STATUS_OK)
00879   {
00880      AT_ParseConnSettings((char *)Obj->CmdData, &Obj->NetSettings);
00881   }  
00882   return ret;
00883 }
00884 
00885 /**
00886   * @brief  Configure and activate SoftAP.
00887   * @param  Obj: pointer to module handle
00888   * @param  ApConfig : Pointer to AP config structure.
00889   * @param  ip : AP IP address
00890   * @param  mac : AP MAC address
00891   * @retval Operation Status.
00892   */
00893 ES_WIFI_Status_t ES_WIFI_ActivateAP(ES_WIFIObject_t *Obj, ES_WIFI_APConfig_t *ApConfig)
00894 {
00895   ES_WIFI_Status_t ret;
00896 
00897   sprintf((char*)Obj->CmdData,"AS=0,%s\r", ApConfig->SSID);
00898   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00899   if(ret == ES_WIFI_STATUS_OK)
00900   {
00901   
00902     sprintf((char*)Obj->CmdData,"A1=%c\r", (int)ApConfig->Security + '0');
00903     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00904     if(ret == ES_WIFI_STATUS_OK)
00905     {
00906       
00907       sprintf((char*)Obj->CmdData,"A2=%s\r", ApConfig->Pass);
00908       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00909       if(ret == ES_WIFI_STATUS_OK)
00910       { 
00911         
00912         sprintf((char*)Obj->CmdData,"AC=%d\r", ApConfig->Channel);
00913         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00914         if(ret == ES_WIFI_STATUS_OK)
00915         { 
00916           
00917           sprintf((char*)Obj->CmdData,"AT=%d\r", ApConfig->MaxConnections);
00918           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00919           if(ret == ES_WIFI_STATUS_OK)
00920           { 
00921             sprintf((char*)Obj->CmdData,"A0\r");
00922             ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);             
00923             if(ret == ES_WIFI_STATUS_OK)
00924             { 
00925               if(strstr((char *)Obj->CmdData, "[AP     ]"))
00926               {           
00927                 ret = ES_WIFI_STATUS_OK;
00928               }       
00929             }            
00930           }
00931         }
00932       }
00933     }
00934   }
00935   return ret;
00936 }
00937 
00938 /**
00939   * @brief  Get AP notification.
00940   * @param  Obj: pointer to module handle
00941   * @param  ip : Assigned ip address.
00942   * @param  ip : joind device mac address.
00943   * @retval AP State.
00944   */
00945 ES_WIFI_APState_t ES_WIFI_WaitAPStateChange(ES_WIFIObject_t *Obj)
00946 {
00947   ES_WIFI_APState_t ret = ES_WIFI_AP_NONE;
00948   char *ptr;
00949    
00950  #if (ES_WIFI_USE_UART == 1)   
00951   if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
00952   {
00953     if(strstr((char *)Obj->CmdData, AT_ERROR_STRING))
00954     {
00955       return ES_WIFI_AP_ERROR;
00956     }
00957 #else
00958     do
00959     {
00960       sprintf((char*)Obj->CmdData,"MR\r");
00961       if(AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData) != ES_WIFI_STATUS_OK)
00962       { 
00963         return ES_WIFI_AP_ERROR;
00964       }        
00965 #endif
00966     else  if(strstr((char *)Obj->CmdData, "[AP DHCP]"))
00967     {
00968       ptr = strtok((char *)Obj->CmdData + 2, " ");
00969       ptr = strtok(NULL, " ");
00970       ptr = strtok(NULL, " "); 
00971       ptr = strtok(NULL, " "); 
00972       ParseMAC((char *)ptr, Obj->APSettings.MAC_Addr); 
00973       ptr = strtok(NULL, " "); 
00974       ptr = strtok(NULL, "\r");        
00975       ParseIP((char *)ptr, Obj->APSettings.IP_Addr); 
00976       ret = ES_WIFI_AP_ASSIGNED;
00977 #if (ES_WIFI_USE_SPI == 1)          
00978       break;
00979 #endif      
00980     }  
00981     else  if(strstr((char *)Obj->CmdData, "[JOIN   ]"))
00982     {
00983       ptr = strtok((char *)Obj->CmdData + 12, ",");
00984       strncpy((char *)Obj->APSettings.SSID, ptr, ES_WIFI_MAX_SSID_NAME_SIZE  );
00985       ptr = strtok(NULL, ",");     
00986       ParseIP((char *)ptr, Obj->APSettings.IP_Addr); 
00987       ret =  ES_WIFI_AP_JOINED;
00988 #if (ES_WIFI_USE_SPI == 1)          
00989       break;
00990 #endif        
00991     } 
00992 #if (ES_WIFI_USE_UART == 1)      
00993     }
00994 #else
00995     Obj->fops.IO_Delay(1000);
00996   } while (1);
00997 #endif  
00998   return ret;
00999 }
01000 
01001 /**
01002   * @brief  retrn the MAC address of the es module.
01003   * @param  Obj: pointer to module handle
01004   * @param  mac: pointer to the MAC address array.
01005   * @retval Operation Status.
01006   */
01007 ES_WIFI_Status_t ES_WIFI_GetMACAddress(ES_WIFIObject_t *Obj, uint8_t *mac)
01008 {
01009   ES_WIFI_Status_t ret ;
01010   char *ptr;
01011   
01012   sprintf((char*)Obj->CmdData,"Z5\r");
01013   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01014   if(ret == ES_WIFI_STATUS_OK)
01015   {
01016     ptr = strtok((char *)(Obj->CmdData + 2), "\r\n");    
01017     ParseMAC(ptr, mac) ;
01018   }           
01019   return ret;
01020 }
01021 
01022 /**
01023   * @brief  retrn the IP address of the es module.
01024   * @param  Obj: pointer to module handle
01025   * @param  mac: pointer to the IP address array.
01026   * @retval Operation Status.
01027   */
01028 ES_WIFI_Status_t ES_WIFI_GetIPAddress(ES_WIFIObject_t *Obj, uint8_t *ipaddr)
01029 {
01030   memcpy(ipaddr, Obj->NetSettings.IP_Addr, 4);         
01031   return ES_WIFI_STATUS_OK;
01032 }
01033 
01034 /**
01035   * @brief  Set the MAC address of the es module.
01036   * @param  Obj: pointer to module handle
01037   * @param  mac: pointer to the MAC address array.
01038   * @retval Operation Status.
01039   */
01040 ES_WIFI_Status_t ES_WIFI_SetMACAddress(ES_WIFIObject_t *Obj, uint8_t *mac)
01041 {
01042   ES_WIFI_Status_t ret ;
01043  
01044   sprintf((char*)Obj->CmdData,"Z4=%X:%X:%X:%X:%X:%X\r",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5] );
01045   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01046   if(ret == ES_WIFI_STATUS_OK)
01047   {
01048     sprintf((char*)Obj->CmdData,"Z1\r");
01049     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01050   }  
01051   return ret;
01052 }
01053 
01054 /**
01055   * @brief  Reset To factory defaults.
01056   * @param  Obj: pointer to module handle
01057   * @retval Operation Status.
01058   */
01059 ES_WIFI_Status_t ES_WIFI_ResetToFactoryDefault(ES_WIFIObject_t *Obj)
01060 {
01061   ES_WIFI_Status_t ret ;
01062  
01063   sprintf((char*)Obj->CmdData,"Z0\r");
01064   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);       
01065   return ret;
01066 }
01067 
01068 /**
01069   * @brief  Reset the module.
01070   * @param  Obj: pointer to module handle
01071   * @retval Operation Status.
01072   */
01073 ES_WIFI_Status_t ES_WIFI_ResetModule(ES_WIFIObject_t *Obj)
01074 {
01075   ES_WIFI_Status_t ret ;
01076   
01077   sprintf((char*)Obj->CmdData,"ZR\r");
01078   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);       
01079   return ret;
01080 }
01081 
01082 /**
01083   * @brief  Set Product Name.
01084   * @param  Obj: pointer to module handle
01085   * @param  ProductName : pointer to product name string
01086   * @retval Operation Status.
01087   */
01088 ES_WIFI_Status_t ES_WIFI_SetProductName(ES_WIFIObject_t *Obj, uint8_t *ProductName)
01089 {
01090   ES_WIFI_Status_t ret ;
01091   
01092   sprintf((char*)Obj->CmdData,"ZN=%s\r",ProductName);
01093   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01094   if(ret == ES_WIFI_STATUS_OK)
01095   {
01096     sprintf((char*)Obj->CmdData,"Z1\r");
01097     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01098   }
01099   return ret;
01100 }
01101 
01102 #if (ES_WIFI_USE_FIRMWAREUPDATE == 1)
01103 /**
01104   * @brief  OTA Firmware Upgrade.
01105   * @param  Obj: pointer to module handle
01106   * @param  Upgrade link path
01107   * @retval Operation Status.
01108   */
01109 ES_WIFI_Status_t ES_WIFI_OTA_Upgrade(ES_WIFIObject_t *Obj, uint8_t *link)
01110 {
01111   ES_WIFI_Status_t ret ;
01112   
01113   sprintf((char*)Obj->CmdData,"Z0=%d\r%s",strlen((char *)link), (char *)link);
01114   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01115   return ret;
01116 }
01117 #endif
01118 #if (ES_WIFI_USE_UART == 1)
01119 /**
01120   * @brief  Set UART Baud Rate.
01121   * @param  Obj: pointer to module handle
01122   * @param  UART BAud rate
01123   * @retval Operation Status.
01124   */
01125 ES_WIFI_Status_t ES_WIFI_SetUARTBaudRate(ES_WIFIObject_t *Obj, uint16_t BaudRate)
01126 {
01127   ES_WIFI_Status_t ret ;
01128  
01129   sprintf((char*)Obj->CmdData,"U2=%d\r", BaudRate);
01130   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01131   if(ret == ES_WIFI_STATUS_OK)
01132   {
01133     sprintf((char*)Obj->CmdData,"U0\r");
01134     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01135   }
01136   return ret;
01137 }
01138 
01139 /**
01140   * @brief  Get UART Configuration.
01141   * @param  Obj: pointer to module handle
01142   * @param  pointer to UART config structure
01143   * @retval Operation Status.
01144   */
01145 ES_WIFI_Status_t ES_WIFI_GetUARTConfig(ES_WIFIObject_t *Obj, ES_WIFI_UARTConfig_t *pconf)
01146 {
01147   ES_WIFI_Status_t ret ;
01148  
01149   sprintf((char*)Obj->CmdData,"U?\r");
01150   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01151   if(ret == ES_WIFI_STATUS_OK)
01152   {
01153     AT_ParseUARTConfig((char *)Obj->CmdData, pconf);
01154   }
01155   return ret;
01156 }
01157 #endif
01158 
01159 /**
01160   * @brief  Get System Configuration.
01161   * @param  Obj: pointer to module handle
01162   * @param  pointer to System config structure
01163   * @retval Operation Status.
01164   */
01165 ES_WIFI_Status_t ES_WIFI_GetSystemConfig(ES_WIFIObject_t *Obj, ES_WIFI_SystemConfig_t *pconf)
01166 {
01167   ES_WIFI_Status_t ret ;
01168  
01169   sprintf((char*)Obj->CmdData,"Z?\r");
01170   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01171   if(ret == ES_WIFI_STATUS_OK)
01172   {
01173     AT_ParseSystemConfig((char *)Obj->CmdData, pconf);
01174   }
01175   return ret;
01176 }
01177 
01178 #if (ES_WIFI_USE_PING == 1)
01179 /**
01180   * @brief  Ping an IP address.
01181   * @param  Obj: pointer to module handle
01182   * @param  Ping: ping structure.
01183   * @retval Operation Status.
01184   */
01185 ES_WIFI_Status_t ES_WIFI_Ping(ES_WIFIObject_t *Obj, uint8_t *address, uint16_t count, uint16_t interval_ms)
01186 {
01187   ES_WIFI_Status_t ret;
01188  
01189   sprintf((char*)Obj->CmdData,"T1=%d.%d.%d.%d\r", address[0],address[1],
01190           address[2],address[3]);
01191   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01192   
01193   if(ret == ES_WIFI_STATUS_OK)
01194   {
01195     
01196     sprintf((char*)Obj->CmdData,"T2=%d\r", count);
01197     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01198     
01199     if(ret == ES_WIFI_STATUS_OK)
01200     {
01201       sprintf((char*)Obj->CmdData,"T3=%d\r", interval_ms);
01202       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01203       
01204       if(ret == ES_WIFI_STATUS_OK)
01205       {
01206         sprintf((char*)Obj->CmdData,"T0=\r");
01207         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);         
01208       }
01209     }
01210   }
01211   
01212   return ret;
01213 }
01214 #endif
01215 /**
01216   * @brief  DNS Lookup to get IP address .
01217   * @param  Obj: pointer to module handle
01218   * @param  url: Domain Name.
01219   * @param  ipaddress: IP address.
01220   * @retval Operation Status.
01221   */
01222 ES_WIFI_Status_t ES_WIFI_DNS_LookUp(ES_WIFIObject_t *Obj, const char *url, uint8_t *ipaddress)
01223 {
01224   ES_WIFI_Status_t ret;
01225   char *ptr;
01226   
01227   sprintf((char*)Obj->CmdData,"D0=%s\r", url);
01228   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01229   
01230   if(ret == ES_WIFI_STATUS_OK)
01231   {
01232     ptr = strtok((char *)Obj->CmdData + 2, "\r");
01233     ParseIP(ptr, ipaddress);       
01234   } 
01235   return ret;
01236 }
01237 
01238 
01239 /**
01240   * @brief  Configure and Start a Client connection.
01241   * @param  Obj: pointer to module handle
01242   * @param  conn: pointer to the connection structure
01243   * @retval Operation Status.
01244   */
01245 ES_WIFI_Status_t ES_WIFI_StartClientConnection(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
01246 {
01247   ES_WIFI_Status_t ret;
01248 
01249   sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01250   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01251   
01252   if(ret == ES_WIFI_STATUS_OK)
01253   {
01254     sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
01255     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01256     if(ret == ES_WIFI_STATUS_OK)
01257     {
01258       if ((conn->Type == ES_WIFI_UDP_CONNECTION) && (conn->LocalPort > 0)) 
01259       {
01260         sprintf((char*)Obj->CmdData,"P2=%d\r", conn->RemotePort);
01261         if(AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData) == ES_WIFI_STATUS_ERROR)
01262         {
01263           return ES_WIFI_STATUS_ERROR;
01264         }
01265       }
01266       sprintf((char*)Obj->CmdData,"P4=%d\r", conn->RemotePort);
01267       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01268       
01269       if(ret == ES_WIFI_STATUS_OK)
01270       {
01271         sprintf((char*)Obj->CmdData,"P3=%d.%d.%d.%d\r", conn->RemoteIP[0],conn->RemoteIP[1],
01272                 conn->RemoteIP[2],conn->RemoteIP[3]);
01273         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01274         if(ret == ES_WIFI_STATUS_OK)
01275         {
01276           sprintf((char*)Obj->CmdData,"P6=1\r");
01277           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);         
01278         }          
01279       }           
01280     }
01281   }
01282   return ret;
01283 }
01284 
01285 /**
01286   * @brief  Stop Client connection.
01287   * @param  Obj: pointer to module handle
01288   * @retval Operation Status.
01289   */
01290 ES_WIFI_Status_t ES_WIFI_StopClientConnection(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
01291 {
01292   ES_WIFI_Status_t ret;
01293   
01294   sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01295   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01296   
01297   if(ret == ES_WIFI_STATUS_OK)
01298   {  
01299     sprintf((char*)Obj->CmdData,"P6=0\r");
01300     ret =  AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);     
01301   }
01302   return ret;
01303 }
01304 
01305 #if (ES_WIFI_USE_AWS == 1)
01306 /**
01307   * @brief  Configure and Start a AWS Client connection.
01308   * @param  Obj: pointer to module handle
01309   * @param  conn: pointer to the connection structure
01310   * @retval Operation Status.
01311   */
01312 ES_WIFI_Status_t ES_WIFI_StartAWSClientConnection(ES_WIFIObject_t *Obj, ES_WIFI_AWS_Conn_t *conn)
01313 {
01314   
01315   ES_WIFI_Status_t ret;
01316 
01317   sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01318   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01319   
01320   if(ret == ES_WIFI_STATUS_OK)
01321   {
01322     sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
01323     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01324     if(ret == ES_WIFI_STATUS_OK)
01325     {
01326       sprintf((char*)Obj->CmdData,"P4=%d\r", conn->RemotePort);
01327       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01328       
01329       if(ret == ES_WIFI_STATUS_OK)
01330       {
01331         sprintf((char*)Obj->CmdData,"PM=0,%s\r", conn->PublishTopic);
01332         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01333         if(ret == ES_WIFI_STATUS_OK)
01334         {
01335           if(ret == ES_WIFI_STATUS_OK)
01336           {
01337             sprintf((char*)Obj->CmdData,"PM=1,%s\r", conn->SubscribeTopic);
01338             ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01339             if(ret == ES_WIFI_STATUS_OK)
01340             {
01341               
01342               sprintf((char*)Obj->CmdData,"PM=2,%d\r", conn->MQTTMode);
01343               ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01344               if(ret == ES_WIFI_STATUS_OK)
01345               {
01346                 sprintf((char*)Obj->CmdData,"PM=5,%s\r", conn->ClientID);
01347                 ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01348                 if(ret == ES_WIFI_STATUS_OK)
01349                 {
01350                   sprintf((char*)Obj->CmdData,"PM\r");
01351                   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01352                   if(ret == ES_WIFI_STATUS_OK)
01353                   {
01354                     sprintf((char*)Obj->CmdData,"P6=1\r");
01355                     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);         
01356                   } 
01357                 }
01358               }
01359             }
01360           }           
01361         }
01362       }
01363     }
01364   }
01365   return ret;
01366 }
01367 #endif
01368 /**
01369   * @brief  Configure and Start a Server.
01370   * @param  Obj: pointer to module handle
01371   * @param  conn: pointer to the connection structure
01372   * @retval Operation Status.
01373   */
01374 ES_WIFI_Status_t ES_WIFI_StartServerSingleConn(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
01375 {
01376   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
01377   char *ptr;
01378   
01379   sprintf((char*)Obj->CmdData,"PK=1,3000\r");
01380   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01381   if(ret == ES_WIFI_STATUS_OK)
01382   {
01383     sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01384     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01385     if(ret == ES_WIFI_STATUS_OK)
01386     {
01387       sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
01388       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01389       if(ret == ES_WIFI_STATUS_OK)
01390       {
01391         sprintf((char*)Obj->CmdData,"P2=%d\r", conn->LocalPort);
01392         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01393         if(ret == ES_WIFI_STATUS_OK)
01394         {       
01395           sprintf((char*)Obj->CmdData,"P5=1\r");
01396           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01397           
01398           if(ret == ES_WIFI_STATUS_OK)
01399           {  
01400 #if (ES_WIFI_USE_UART == 1)               
01401             if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
01402             {
01403               if(strstr((char *)Obj->CmdData, "Accepted"))
01404               {
01405                 ptr = strtok((char *)Obj->CmdData + 2, " ");
01406                 ptr = strtok(NULL, " ");
01407                 ptr = strtok(NULL, " "); 
01408                 ptr = strtok(NULL, ":");            
01409                 ParseIP((char *)ptr, conn->RemoteIP);          
01410                 ret = ES_WIFI_STATUS_OK;
01411               }  
01412             }
01413 #else
01414             do
01415             {
01416               sprintf((char*)Obj->CmdData,"MR\r");
01417               ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01418               if(ret == ES_WIFI_STATUS_OK)
01419               {  
01420                 if((strstr((char *)Obj->CmdData, "[SOMA]")) && (strstr((char *)Obj->CmdData, "[EOMA]")))
01421                 {
01422                   if(strstr((char *)Obj->CmdData, "Accepted"))
01423                   {
01424                     ptr = strtok((char *)Obj->CmdData + 2, " ");
01425                     ptr = strtok(NULL, " ");
01426                     ptr = strtok(NULL, " "); 
01427                     ptr = strtok(NULL, ":");            
01428                     ParseIP((char *)ptr, conn->RemoteIP);          
01429                     ret = ES_WIFI_STATUS_OK;
01430                     break;
01431                   }  
01432                 }
01433               }
01434               else
01435               {
01436                 ret = ES_WIFI_STATUS_ERROR;
01437                 break;
01438               }
01439               Obj->fops.IO_Delay(1000);
01440             } while (1);
01441 #endif  
01442           }
01443         }
01444       }  
01445     }
01446   }
01447   return ret;
01448 }
01449 
01450 /**
01451   * @brief  Stop a Server.
01452   * @param  Obj: pointer to module handle
01453   * @retval Operation Status.
01454   */
01455 ES_WIFI_Status_t ES_WIFI_StopServerSingleConn(ES_WIFIObject_t *Obj)
01456 {
01457   sprintf((char*)Obj->CmdData,"P5=0\r");
01458   return AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01459 }
01460 
01461 
01462 /**
01463   * @brief  Configure and Start a Server.
01464   * @param  Obj: pointer to module handle
01465   * @param  conn: pointer to the connection structure
01466   * @retval Operation Status.
01467   */
01468 ES_WIFI_Status_t ES_WIFI_StartServerMultiConn(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
01469 {
01470   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
01471   char *ptr;
01472   
01473   sprintf((char*)Obj->CmdData,"PK=1,3000\r");
01474   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01475   if(ret == ES_WIFI_STATUS_OK)
01476   {
01477     sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01478     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01479     if(ret == ES_WIFI_STATUS_OK)
01480     {
01481       sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
01482       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01483       if(ret == ES_WIFI_STATUS_OK)
01484       {
01485         sprintf((char*)Obj->CmdData,"P2=%d\r", conn->LocalPort);
01486         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01487         if(ret == ES_WIFI_STATUS_OK)
01488         {       
01489           sprintf((char*)Obj->CmdData,"P8=6\r");
01490           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01491           
01492           if(ret == ES_WIFI_STATUS_OK)
01493           {          
01494             sprintf((char*)Obj->CmdData,"P5=1\r");
01495             ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01496             
01497             if(ret == ES_WIFI_STATUS_OK)
01498             { 
01499 #if (ES_WIFI_USE_UART == 1)               
01500             if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
01501             {
01502               if(strstr((char *)Obj->CmdData, "Accepted"))
01503               {
01504                 ptr = strtok((char *)Obj->CmdData + 2, " ");
01505                 ptr = strtok(NULL, " ");
01506                 ptr = strtok(NULL, " "); 
01507                 ptr = strtok(NULL, ":");            
01508                 ParseIP((char *)ptr, conn->RemoteIP);          
01509                 ret = ES_WIFI_STATUS_OK;
01510               }  
01511             }
01512 #else
01513             do
01514             {
01515               sprintf((char*)Obj->CmdData,"MR\r");
01516               ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01517               if(ret == ES_WIFI_STATUS_OK)
01518               {  
01519                 if((strstr((char *)Obj->CmdData, "[SOMA]")) && (strstr((char *)Obj->CmdData, "[EOMA]")))
01520                 {
01521                   if(strstr((char *)Obj->CmdData, "Accepted"))
01522                   {
01523                     ptr = strtok((char *)Obj->CmdData + 2, " ");
01524                     ptr = strtok(NULL, " ");
01525                     ptr = strtok(NULL, " "); 
01526                     ptr = strtok(NULL, ":");            
01527                     ParseIP((char *)ptr, conn->RemoteIP);          
01528                     ret = ES_WIFI_STATUS_OK;
01529                     break;
01530                   }  
01531                 }
01532               }
01533               else
01534               {
01535                 ret = ES_WIFI_STATUS_ERROR;
01536                 break;
01537               }
01538               Obj->fops.IO_Delay(1000);
01539             } while (1);
01540 #endif 
01541             }
01542             if(ret == ES_WIFI_STATUS_OK)
01543             {          
01544               sprintf((char*)Obj->CmdData,"P7=1\r");
01545               ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01546               
01547             }
01548           }
01549         }
01550       }
01551     }
01552   }
01553   return ret;
01554 }
01555 
01556 /**
01557   * @brief  Stop a Server.
01558   * @param  Obj: pointer to module handle
01559   * @retval Operation Status.
01560   */
01561 ES_WIFI_Status_t ES_WIFI_StopServerMultiConn(ES_WIFIObject_t *Obj)
01562 {
01563   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
01564   
01565   /* close the socket handle for the current request. */
01566   sprintf((char*)Obj->CmdData,"P7=2\r");
01567   ret =  AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01568   
01569   if(ret == ES_WIFI_STATUS_OK)
01570   {      
01571     /*Get the next request out of the queue */    
01572     sprintf((char*)Obj->CmdData,"P7=3\r");
01573     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01574     if(ret == ES_WIFI_STATUS_OK)
01575     {          
01576       if(ret == ES_WIFI_STATUS_OK)
01577       { 
01578         if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
01579         {
01580           if(strstr((char *)Obj->CmdData, "Accepted"))
01581           {
01582             ret = ES_WIFI_STATUS_OK;
01583           }  
01584         }
01585       }      
01586     }
01587   }
01588   return ret;       
01589 }
01590 /**
01591   * @brief  Send an amount data over WIFI.
01592   * @param  Obj: pointer to module handle
01593   * @param  Socket: number of the socket
01594   * @param  pdata: pointer to data
01595   * @param  len : length of the data to be sent
01596   * @retval Operation Status.
01597   */
01598 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)
01599 {
01600   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;  
01601   
01602   if(Reqlen >= ES_WIFI_PAYLOAD_SIZE ) Reqlen= ES_WIFI_PAYLOAD_SIZE;
01603   
01604   *SentLen = Reqlen;
01605   sprintf((char*)Obj->CmdData,"P0=%d\r", Socket);
01606   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01607   if(ret == ES_WIFI_STATUS_OK)
01608   {
01609     sprintf((char*)Obj->CmdData,"S2=%lu\r",Timeout);
01610     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01611     
01612     if(ret == ES_WIFI_STATUS_OK)
01613     {
01614       sprintf((char *)Obj->CmdData,"S3=%04d\r",Reqlen);
01615       ret = AT_RequestSendData(Obj, Obj->CmdData, pdata, Reqlen, Obj->CmdData);
01616       
01617       if(ret == ES_WIFI_STATUS_OK)
01618       {
01619         if(strstr((char *)Obj->CmdData,"-1\r\n"))
01620         {
01621           ret = ES_WIFI_STATUS_ERROR;
01622         }
01623       }
01624     }
01625   }
01626   
01627   if (ret == ES_WIFI_STATUS_ERROR) *SentLen = 0;
01628   return ret;  
01629 }
01630 
01631 /**
01632   * @brief  Receive an amount data over WIFI.
01633   * @param  Obj: pointer to module handle
01634   * @param  Socket: number of the socket
01635   * @param  pdata: pointer to data
01636   * @param  len : pointer to the length of the data to be received
01637   * @retval Operation Status.
01638   */
01639 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)
01640 {
01641   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;  
01642   
01643   if(Reqlen <= ES_WIFI_PAYLOAD_SIZE )
01644   {
01645     sprintf((char*)Obj->CmdData,"P0=%d\r", Socket);
01646     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01647     
01648     if(ret == ES_WIFI_STATUS_OK)
01649     {
01650       sprintf((char*)Obj->CmdData,"R1=%d\r", Reqlen);
01651       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01652       if(ret == ES_WIFI_STATUS_OK)
01653       { 
01654         sprintf((char*)Obj->CmdData,"R2=%lu\r", Timeout);
01655         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01656         if(ret == ES_WIFI_STATUS_OK)
01657         {  
01658          sprintf((char*)Obj->CmdData,"R0=\r");
01659           ret = AT_RequestReceiveData(Obj, Obj->CmdData, (char *)pdata, Reqlen, Receivedlen);
01660         }
01661       }
01662       else
01663       {
01664         *Receivedlen = 0;
01665       }
01666     }
01667   }
01668   return ret;
01669 }
01670 
01671 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/