AT-AT Robot Ops / DISCO_L475VG_IOT01A_wifi-client-baseclient

Fork of DISCO_L475VG_IOT01A_wifi by ST

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   printf("\n> Setting Up Connection");
00819   ES_WIFI_Status_t ret;
00820   
00821   sprintf((char*)Obj->CmdData,"C1=%s\r", SSID);
00822   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00823   if(ret == ES_WIFI_STATUS_OK)
00824   {
00825     sprintf((char*)Obj->CmdData,"C2=%s\r", Password);
00826     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00827     
00828     if(ret == ES_WIFI_STATUS_OK)
00829     {
00830       Obj->Security = SecType;
00831       sprintf((char*)Obj->CmdData,"C3=%d\r", (uint8_t)SecType);
00832       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00833       
00834       if(ret == ES_WIFI_STATUS_OK)
00835       {
00836         sprintf((char*)Obj->CmdData,"C0\r");
00837         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);  
00838         if(ret == ES_WIFI_STATUS_OK)
00839         {
00840            Obj->NetSettings.IsConnected = 1;
00841         }
00842       }    
00843     }
00844   }
00845   return ret;
00846 }
00847 
00848 /**
00849   * @brief  Check whether the module is connected to an access point.
00850   * @retval Operation Status.
00851   */
00852 uint8_t ES_WIFI_IsConnected(ES_WIFIObject_t *Obj)
00853 {
00854   return Obj->NetSettings.IsConnected;
00855 }
00856 /**
00857   * @brief  Disconnect from a network.
00858   * @param  Obj: pointer to module handle
00859   * @retval Operation Status.
00860   */
00861 ES_WIFI_Status_t ES_WIFI_Disconnect(ES_WIFIObject_t *Obj)
00862 {
00863   sprintf((char*)Obj->CmdData,"CD\r"); 
00864   return  AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
00865 }
00866 /**
00867   * @brief  Return network settings.
00868   * @param  Obj: pointer to module handle
00869   * @param  Pointer to network setting structure.
00870   * @retval Operation Status.
00871   */
00872 ES_WIFI_Status_t ES_WIFI_GetNetworkSettings(ES_WIFIObject_t *Obj)
00873 {
00874   ES_WIFI_Status_t ret;
00875   
00876   sprintf((char*)Obj->CmdData,"C?\r");
00877   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00878   
00879   if(ret == ES_WIFI_STATUS_OK)
00880   {
00881      AT_ParseConnSettings((char *)Obj->CmdData, &Obj->NetSettings);
00882   }  
00883   return ret;
00884 }
00885 
00886 /**
00887   * @brief  Configure and activate SoftAP.
00888   * @param  Obj: pointer to module handle
00889   * @param  ApConfig : Pointer to AP config structure.
00890   * @param  ip : AP IP address
00891   * @param  mac : AP MAC address
00892   * @retval Operation Status.
00893   */
00894 ES_WIFI_Status_t ES_WIFI_ActivateAP(ES_WIFIObject_t *Obj, ES_WIFI_APConfig_t *ApConfig)
00895 {
00896   ES_WIFI_Status_t ret;
00897 
00898   sprintf((char*)Obj->CmdData,"AS=0,%s\r", ApConfig->SSID);
00899   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00900   if(ret == ES_WIFI_STATUS_OK)
00901   {
00902   
00903     sprintf((char*)Obj->CmdData,"A1=%c\r", (int)ApConfig->Security + '0');
00904     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00905     if(ret == ES_WIFI_STATUS_OK)
00906     {
00907       
00908       sprintf((char*)Obj->CmdData,"A2=%s\r", ApConfig->Pass);
00909       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00910       if(ret == ES_WIFI_STATUS_OK)
00911       { 
00912         
00913         sprintf((char*)Obj->CmdData,"AC=%d\r", ApConfig->Channel);
00914         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00915         if(ret == ES_WIFI_STATUS_OK)
00916         { 
00917           
00918           sprintf((char*)Obj->CmdData,"AT=%d\r", ApConfig->MaxConnections);
00919           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00920           if(ret == ES_WIFI_STATUS_OK)
00921           { 
00922             sprintf((char*)Obj->CmdData,"A0\r");
00923             ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);             
00924             if(ret == ES_WIFI_STATUS_OK)
00925             { 
00926               if(strstr((char *)Obj->CmdData, "[AP     ]"))
00927               {           
00928                 ret = ES_WIFI_STATUS_OK;
00929               }       
00930             }            
00931           }
00932         }
00933       }
00934     }
00935   }
00936   return ret;
00937 }
00938 
00939 /**
00940   * @brief  Get AP notification.
00941   * @param  Obj: pointer to module handle
00942   * @param  ip : Assigned ip address.
00943   * @param  ip : joind device mac address.
00944   * @retval AP State.
00945   */
00946 ES_WIFI_APState_t ES_WIFI_WaitAPStateChange(ES_WIFIObject_t *Obj)
00947 {
00948   ES_WIFI_APState_t ret = ES_WIFI_AP_NONE;
00949   char *ptr;
00950    
00951  #if (ES_WIFI_USE_UART == 1)   
00952   if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
00953   {
00954     if(strstr((char *)Obj->CmdData, AT_ERROR_STRING))
00955     {
00956       return ES_WIFI_AP_ERROR;
00957     }
00958 #else
00959     do
00960     {
00961       sprintf((char*)Obj->CmdData,"MR\r");
00962       if(AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData) != ES_WIFI_STATUS_OK)
00963       { 
00964         return ES_WIFI_AP_ERROR;
00965       }        
00966 #endif
00967     else  if(strstr((char *)Obj->CmdData, "[AP DHCP]"))
00968     {
00969       ptr = strtok((char *)Obj->CmdData + 2, " ");
00970       ptr = strtok(NULL, " ");
00971       ptr = strtok(NULL, " "); 
00972       ptr = strtok(NULL, " "); 
00973       ParseMAC((char *)ptr, Obj->APSettings.MAC_Addr); 
00974       ptr = strtok(NULL, " "); 
00975       ptr = strtok(NULL, "\r");        
00976       ParseIP((char *)ptr, Obj->APSettings.IP_Addr); 
00977       ret = ES_WIFI_AP_ASSIGNED;
00978 #if (ES_WIFI_USE_SPI == 1)          
00979       break;
00980 #endif      
00981     }  
00982     else  if(strstr((char *)Obj->CmdData, "[JOIN   ]"))
00983     {
00984       ptr = strtok((char *)Obj->CmdData + 12, ",");
00985       strncpy((char *)Obj->APSettings.SSID, ptr, ES_WIFI_MAX_SSID_NAME_SIZE  );
00986       ptr = strtok(NULL, ",");     
00987       ParseIP((char *)ptr, Obj->APSettings.IP_Addr); 
00988       ret =  ES_WIFI_AP_JOINED;
00989 #if (ES_WIFI_USE_SPI == 1)          
00990       break;
00991 #endif        
00992     } 
00993 #if (ES_WIFI_USE_UART == 1)      
00994     }
00995 #else
00996     Obj->fops.IO_Delay(1000);
00997   } while (1);
00998 #endif  
00999   return ret;
01000 }
01001 
01002 /**
01003   * @brief  retrn the MAC address of the es module.
01004   * @param  Obj: pointer to module handle
01005   * @param  mac: pointer to the MAC address array.
01006   * @retval Operation Status.
01007   */
01008 ES_WIFI_Status_t ES_WIFI_GetMACAddress(ES_WIFIObject_t *Obj, uint8_t *mac)
01009 {
01010   ES_WIFI_Status_t ret ;
01011   char *ptr;
01012   
01013   sprintf((char*)Obj->CmdData,"Z5\r");
01014   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01015   if(ret == ES_WIFI_STATUS_OK)
01016   {
01017     ptr = strtok((char *)(Obj->CmdData + 2), "\r\n");    
01018     ParseMAC(ptr, mac) ;
01019   }           
01020   return ret;
01021 }
01022 
01023 /**
01024   * @brief  retrn the IP address of the es module.
01025   * @param  Obj: pointer to module handle
01026   * @param  mac: pointer to the IP address array.
01027   * @retval Operation Status.
01028   */
01029 ES_WIFI_Status_t ES_WIFI_GetIPAddress(ES_WIFIObject_t *Obj, uint8_t *ipaddr)
01030 {
01031   memcpy(ipaddr, Obj->NetSettings.IP_Addr, 4);         
01032   return ES_WIFI_STATUS_OK;
01033 }
01034 
01035 /**
01036   * @brief  Set the MAC address of the es module.
01037   * @param  Obj: pointer to module handle
01038   * @param  mac: pointer to the MAC address array.
01039   * @retval Operation Status.
01040   */
01041 ES_WIFI_Status_t ES_WIFI_SetMACAddress(ES_WIFIObject_t *Obj, uint8_t *mac)
01042 {
01043   ES_WIFI_Status_t ret ;
01044  
01045   sprintf((char*)Obj->CmdData,"Z4=%X:%X:%X:%X:%X:%X\r",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5] );
01046   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01047   if(ret == ES_WIFI_STATUS_OK)
01048   {
01049     sprintf((char*)Obj->CmdData,"Z1\r");
01050     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01051   }  
01052   return ret;
01053 }
01054 
01055 /**
01056   * @brief  Reset To factory defaults.
01057   * @param  Obj: pointer to module handle
01058   * @retval Operation Status.
01059   */
01060 ES_WIFI_Status_t ES_WIFI_ResetToFactoryDefault(ES_WIFIObject_t *Obj)
01061 {
01062   ES_WIFI_Status_t ret ;
01063  
01064   sprintf((char*)Obj->CmdData,"Z0\r");
01065   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);       
01066   return ret;
01067 }
01068 
01069 /**
01070   * @brief  Reset the module.
01071   * @param  Obj: pointer to module handle
01072   * @retval Operation Status.
01073   */
01074 ES_WIFI_Status_t ES_WIFI_ResetModule(ES_WIFIObject_t *Obj)
01075 {
01076   ES_WIFI_Status_t ret ;
01077   
01078   sprintf((char*)Obj->CmdData,"ZR\r");
01079   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);       
01080   return ret;
01081 }
01082 
01083 /**
01084   * @brief  Set Product Name.
01085   * @param  Obj: pointer to module handle
01086   * @param  ProductName : pointer to product name string
01087   * @retval Operation Status.
01088   */
01089 ES_WIFI_Status_t ES_WIFI_SetProductName(ES_WIFIObject_t *Obj, uint8_t *ProductName)
01090 {
01091   ES_WIFI_Status_t ret ;
01092   
01093   sprintf((char*)Obj->CmdData,"ZN=%s\r",ProductName);
01094   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01095   if(ret == ES_WIFI_STATUS_OK)
01096   {
01097     sprintf((char*)Obj->CmdData,"Z1\r");
01098     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01099   }
01100   return ret;
01101 }
01102 
01103 #if (ES_WIFI_USE_FIRMWAREUPDATE == 1)
01104 /**
01105   * @brief  OTA Firmware Upgrade.
01106   * @param  Obj: pointer to module handle
01107   * @param  Upgrade link path
01108   * @retval Operation Status.
01109   */
01110 ES_WIFI_Status_t ES_WIFI_OTA_Upgrade(ES_WIFIObject_t *Obj, uint8_t *link)
01111 {
01112   ES_WIFI_Status_t ret ;
01113   
01114   sprintf((char*)Obj->CmdData,"Z0=%d\r%s",strlen((char *)link), (char *)link);
01115   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01116   return ret;
01117 }
01118 #endif
01119 #if (ES_WIFI_USE_UART == 1)
01120 /**
01121   * @brief  Set UART Baud Rate.
01122   * @param  Obj: pointer to module handle
01123   * @param  UART BAud rate
01124   * @retval Operation Status.
01125   */
01126 ES_WIFI_Status_t ES_WIFI_SetUARTBaudRate(ES_WIFIObject_t *Obj, uint16_t BaudRate)
01127 {
01128   ES_WIFI_Status_t ret ;
01129  
01130   sprintf((char*)Obj->CmdData,"U2=%d\r", BaudRate);
01131   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01132   if(ret == ES_WIFI_STATUS_OK)
01133   {
01134     sprintf((char*)Obj->CmdData,"U0\r");
01135     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01136   }
01137   return ret;
01138 }
01139 
01140 /**
01141   * @brief  Get UART Configuration.
01142   * @param  Obj: pointer to module handle
01143   * @param  pointer to UART config structure
01144   * @retval Operation Status.
01145   */
01146 ES_WIFI_Status_t ES_WIFI_GetUARTConfig(ES_WIFIObject_t *Obj, ES_WIFI_UARTConfig_t *pconf)
01147 {
01148   ES_WIFI_Status_t ret ;
01149  
01150   sprintf((char*)Obj->CmdData,"U?\r");
01151   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01152   if(ret == ES_WIFI_STATUS_OK)
01153   {
01154     AT_ParseUARTConfig((char *)Obj->CmdData, pconf);
01155   }
01156   return ret;
01157 }
01158 #endif
01159 
01160 /**
01161   * @brief  Get System Configuration.
01162   * @param  Obj: pointer to module handle
01163   * @param  pointer to System config structure
01164   * @retval Operation Status.
01165   */
01166 ES_WIFI_Status_t ES_WIFI_GetSystemConfig(ES_WIFIObject_t *Obj, ES_WIFI_SystemConfig_t *pconf)
01167 {
01168   ES_WIFI_Status_t ret ;
01169  
01170   sprintf((char*)Obj->CmdData,"Z?\r");
01171   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01172   if(ret == ES_WIFI_STATUS_OK)
01173   {
01174     AT_ParseSystemConfig((char *)Obj->CmdData, pconf);
01175   }
01176   return ret;
01177 }
01178 
01179 #if (ES_WIFI_USE_PING == 1)
01180 /**
01181   * @brief  Ping an IP address.
01182   * @param  Obj: pointer to module handle
01183   * @param  Ping: ping structure.
01184   * @retval Operation Status.
01185   */
01186 ES_WIFI_Status_t ES_WIFI_Ping(ES_WIFIObject_t *Obj, uint8_t *address, uint16_t count, uint16_t interval_ms)
01187 {
01188   ES_WIFI_Status_t ret;
01189  
01190   sprintf((char*)Obj->CmdData,"T1=%d.%d.%d.%d\r", address[0],address[1],
01191           address[2],address[3]);
01192   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01193   
01194   if(ret == ES_WIFI_STATUS_OK)
01195   {
01196     
01197     sprintf((char*)Obj->CmdData,"T2=%d\r", count);
01198     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01199     
01200     if(ret == ES_WIFI_STATUS_OK)
01201     {
01202       sprintf((char*)Obj->CmdData,"T3=%d\r", interval_ms);
01203       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01204       
01205       if(ret == ES_WIFI_STATUS_OK)
01206       {
01207         sprintf((char*)Obj->CmdData,"T0=\r");
01208         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);         
01209       }
01210     }
01211   }
01212   
01213   return ret;
01214 }
01215 #endif
01216 /**
01217   * @brief  DNS Lookup to get IP address .
01218   * @param  Obj: pointer to module handle
01219   * @param  url: Domain Name.
01220   * @param  ipaddress: IP address.
01221   * @retval Operation Status.
01222   */
01223 ES_WIFI_Status_t ES_WIFI_DNS_LookUp(ES_WIFIObject_t *Obj, const char *url, uint8_t *ipaddress)
01224 {
01225   ES_WIFI_Status_t ret;
01226   char *ptr;
01227   
01228   sprintf((char*)Obj->CmdData,"D0=%s\r", url);
01229   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01230   
01231   if(ret == ES_WIFI_STATUS_OK)
01232   {
01233     ptr = strtok((char *)Obj->CmdData + 2, "\r");
01234     ParseIP(ptr, ipaddress);       
01235   } 
01236   return ret;
01237 }
01238 
01239 
01240 /**
01241   * @brief  Configure and Start a Client connection.
01242   * @param  Obj: pointer to module handle
01243   * @param  conn: pointer to the connection structure
01244   * @retval Operation Status.
01245   */
01246 ES_WIFI_Status_t ES_WIFI_StartClientConnection(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
01247 {
01248   ES_WIFI_Status_t ret;
01249 
01250   sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01251   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01252   
01253   if(ret == ES_WIFI_STATUS_OK)
01254   {
01255     sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
01256     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01257     if(ret == ES_WIFI_STATUS_OK)
01258     {
01259       if ((conn->Type == ES_WIFI_UDP_CONNECTION) && (conn->LocalPort > 0)) 
01260       {
01261         sprintf((char*)Obj->CmdData,"P2=%d\r", conn->RemotePort);
01262         if(AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData) == ES_WIFI_STATUS_ERROR)
01263         {
01264           return ES_WIFI_STATUS_ERROR;
01265         }
01266       }
01267       sprintf((char*)Obj->CmdData,"P4=%d\r", conn->RemotePort);
01268       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01269       
01270       if(ret == ES_WIFI_STATUS_OK)
01271       {
01272         sprintf((char*)Obj->CmdData,"P3=%d.%d.%d.%d\r", conn->RemoteIP[0],conn->RemoteIP[1],
01273                 conn->RemoteIP[2],conn->RemoteIP[3]);
01274         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01275         if(ret == ES_WIFI_STATUS_OK)
01276         {
01277           sprintf((char*)Obj->CmdData,"P6=1\r");
01278           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);         
01279         }          
01280       }           
01281     }
01282   }
01283   return ret;
01284 }
01285 
01286 /**
01287   * @brief  Stop Client connection.
01288   * @param  Obj: pointer to module handle
01289   * @retval Operation Status.
01290   */
01291 ES_WIFI_Status_t ES_WIFI_StopClientConnection(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
01292 {
01293   ES_WIFI_Status_t ret;
01294   
01295   sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01296   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01297   
01298   if(ret == ES_WIFI_STATUS_OK)
01299   {  
01300     sprintf((char*)Obj->CmdData,"P6=0\r");
01301     ret =  AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);     
01302   }
01303   return ret;
01304 }
01305 
01306 #if (ES_WIFI_USE_AWS == 1)
01307 /**
01308   * @brief  Configure and Start a AWS Client connection.
01309   * @param  Obj: pointer to module handle
01310   * @param  conn: pointer to the connection structure
01311   * @retval Operation Status.
01312   */
01313 ES_WIFI_Status_t ES_WIFI_StartAWSClientConnection(ES_WIFIObject_t *Obj, ES_WIFI_AWS_Conn_t *conn)
01314 {
01315   
01316   ES_WIFI_Status_t ret;
01317 
01318   sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01319   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01320   
01321   if(ret == ES_WIFI_STATUS_OK)
01322   {
01323     sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
01324     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01325     if(ret == ES_WIFI_STATUS_OK)
01326     {
01327       sprintf((char*)Obj->CmdData,"P4=%d\r", conn->RemotePort);
01328       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01329       
01330       if(ret == ES_WIFI_STATUS_OK)
01331       {
01332         sprintf((char*)Obj->CmdData,"PM=0,%s\r", conn->PublishTopic);
01333         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01334         if(ret == ES_WIFI_STATUS_OK)
01335         {
01336           if(ret == ES_WIFI_STATUS_OK)
01337           {
01338             sprintf((char*)Obj->CmdData,"PM=1,%s\r", conn->SubscribeTopic);
01339             ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01340             if(ret == ES_WIFI_STATUS_OK)
01341             {
01342               
01343               sprintf((char*)Obj->CmdData,"PM=2,%d\r", conn->MQTTMode);
01344               ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01345               if(ret == ES_WIFI_STATUS_OK)
01346               {
01347                 sprintf((char*)Obj->CmdData,"PM=5,%s\r", conn->ClientID);
01348                 ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01349                 if(ret == ES_WIFI_STATUS_OK)
01350                 {
01351                   sprintf((char*)Obj->CmdData,"PM\r");
01352                   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01353                   if(ret == ES_WIFI_STATUS_OK)
01354                   {
01355                     sprintf((char*)Obj->CmdData,"P6=1\r");
01356                     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);         
01357                   } 
01358                 }
01359               }
01360             }
01361           }           
01362         }
01363       }
01364     }
01365   }
01366   return ret;
01367 }
01368 #endif
01369 /**
01370   * @brief  Configure and Start a Server.
01371   * @param  Obj: pointer to module handle
01372   * @param  conn: pointer to the connection structure
01373   * @retval Operation Status.
01374   */
01375 ES_WIFI_Status_t ES_WIFI_StartServerSingleConn(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
01376 {
01377   printf("> Starting Server");
01378   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
01379   char *ptr;
01380   
01381   sprintf((char*)Obj->CmdData,"PK=1,3000\r");
01382   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01383   if(ret == ES_WIFI_STATUS_OK)
01384   {
01385     sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01386     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01387     if(ret == ES_WIFI_STATUS_OK)
01388     {
01389       sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
01390       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01391       if(ret == ES_WIFI_STATUS_OK)
01392       {
01393         sprintf((char*)Obj->CmdData,"P2=%d\r", conn->LocalPort);
01394         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01395         if(ret == ES_WIFI_STATUS_OK)
01396         {       
01397           sprintf((char*)Obj->CmdData,"P5=1\r");
01398           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01399           
01400           if(ret == ES_WIFI_STATUS_OK)
01401           {  
01402 #if (ES_WIFI_USE_UART == 1)               
01403             if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
01404             {
01405               if(strstr((char *)Obj->CmdData, "Accepted"))
01406               {
01407                 ptr = strtok((char *)Obj->CmdData + 2, " ");
01408                 ptr = strtok(NULL, " ");
01409                 ptr = strtok(NULL, " "); 
01410                 ptr = strtok(NULL, ":");            
01411                 ParseIP((char *)ptr, conn->RemoteIP);          
01412                 ret = ES_WIFI_STATUS_OK;
01413               }  
01414             }
01415 #else
01416             do
01417             {
01418               sprintf((char*)Obj->CmdData,"MR\r");
01419               ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01420               if(ret == ES_WIFI_STATUS_OK)
01421               {  
01422                 if((strstr((char *)Obj->CmdData, "[SOMA]")) && (strstr((char *)Obj->CmdData, "[EOMA]")))
01423                 {
01424                   if(strstr((char *)Obj->CmdData, "Accepted"))
01425                   {
01426                     ptr = strtok((char *)Obj->CmdData + 2, " ");
01427                     ptr = strtok(NULL, " ");
01428                     ptr = strtok(NULL, " "); 
01429                     ptr = strtok(NULL, ":");            
01430                     ParseIP((char *)ptr, conn->RemoteIP);          
01431                     ret = ES_WIFI_STATUS_OK;
01432                     break;
01433                   }  
01434                 }
01435               }
01436               else
01437               {
01438                 ret = ES_WIFI_STATUS_ERROR;
01439                 break;
01440               }
01441               Obj->fops.IO_Delay(1000);
01442             } while (1);
01443 #endif  
01444           }
01445         }
01446       }  
01447     }
01448   }
01449   return ret;
01450 }
01451 
01452 /**
01453   * @brief  Stop a Server.
01454   * @param  Obj: pointer to module handle
01455   * @retval Operation Status.
01456   */
01457 ES_WIFI_Status_t ES_WIFI_StopServerSingleConn(ES_WIFIObject_t *Obj)
01458 {
01459   sprintf((char*)Obj->CmdData,"P5=0\r");
01460   return AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01461 }
01462 
01463 
01464 /**
01465   * @brief  Configure and Start a Server.
01466   * @param  Obj: pointer to module handle
01467   * @param  conn: pointer to the connection structure
01468   * @retval Operation Status.
01469   */
01470 ES_WIFI_Status_t ES_WIFI_StartServerMultiConn(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
01471 {
01472   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
01473   char *ptr;
01474   
01475   sprintf((char*)Obj->CmdData,"PK=1,3000\r");
01476   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01477   if(ret == ES_WIFI_STATUS_OK)
01478   {
01479     sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01480     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01481     if(ret == ES_WIFI_STATUS_OK)
01482     {
01483       sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
01484       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01485       if(ret == ES_WIFI_STATUS_OK)
01486       {
01487         sprintf((char*)Obj->CmdData,"P2=%d\r", conn->LocalPort);
01488         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01489         if(ret == ES_WIFI_STATUS_OK)
01490         {       
01491           sprintf((char*)Obj->CmdData,"P8=6\r");
01492           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01493           
01494           if(ret == ES_WIFI_STATUS_OK)
01495           {          
01496             sprintf((char*)Obj->CmdData,"P5=1\r");
01497             ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01498             
01499             if(ret == ES_WIFI_STATUS_OK)
01500             { 
01501 #if (ES_WIFI_USE_UART == 1)               
01502             if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
01503             {
01504               if(strstr((char *)Obj->CmdData, "Accepted"))
01505               {
01506                 ptr = strtok((char *)Obj->CmdData + 2, " ");
01507                 ptr = strtok(NULL, " ");
01508                 ptr = strtok(NULL, " "); 
01509                 ptr = strtok(NULL, ":");            
01510                 ParseIP((char *)ptr, conn->RemoteIP);          
01511                 ret = ES_WIFI_STATUS_OK;
01512               }  
01513             }
01514 #else
01515             do
01516             {
01517               sprintf((char*)Obj->CmdData,"MR\r");
01518               ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01519               if(ret == ES_WIFI_STATUS_OK)
01520               {  
01521                 if((strstr((char *)Obj->CmdData, "[SOMA]")) && (strstr((char *)Obj->CmdData, "[EOMA]")))
01522                 {
01523                   if(strstr((char *)Obj->CmdData, "Accepted"))
01524                   {
01525                     ptr = strtok((char *)Obj->CmdData + 2, " ");
01526                     ptr = strtok(NULL, " ");
01527                     ptr = strtok(NULL, " "); 
01528                     ptr = strtok(NULL, ":");            
01529                     ParseIP((char *)ptr, conn->RemoteIP);          
01530                     ret = ES_WIFI_STATUS_OK;
01531                     break;
01532                   }  
01533                 }
01534               }
01535               else
01536               {
01537                 ret = ES_WIFI_STATUS_ERROR;
01538                 break;
01539               }
01540               Obj->fops.IO_Delay(1000);
01541             } while (1);
01542 #endif 
01543             }
01544             if(ret == ES_WIFI_STATUS_OK)
01545             {          
01546               sprintf((char*)Obj->CmdData,"P7=1\r");
01547               ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01548               
01549             }
01550           }
01551         }
01552       }
01553     }
01554   }
01555   return ret;
01556 }
01557 
01558 /**
01559   * @brief  Stop a Server.
01560   * @param  Obj: pointer to module handle
01561   * @retval Operation Status.
01562   */
01563 ES_WIFI_Status_t ES_WIFI_StopServerMultiConn(ES_WIFIObject_t *Obj)
01564 {
01565   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
01566   
01567   /* close the socket handle for the current request. */
01568   sprintf((char*)Obj->CmdData,"P7=2\r");
01569   ret =  AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01570   
01571   if(ret == ES_WIFI_STATUS_OK)
01572   {      
01573     /*Get the next request out of the queue */    
01574     sprintf((char*)Obj->CmdData,"P7=3\r");
01575     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01576     if(ret == ES_WIFI_STATUS_OK)
01577     {          
01578       if(ret == ES_WIFI_STATUS_OK)
01579       { 
01580         if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
01581         {
01582           if(strstr((char *)Obj->CmdData, "Accepted"))
01583           {
01584             ret = ES_WIFI_STATUS_OK;
01585           }  
01586         }
01587       }      
01588     }
01589   }
01590   return ret;       
01591 }
01592 /**
01593   * @brief  Send an amount data over WIFI.
01594   * @param  Obj: pointer to module handle
01595   * @param  Socket: number of the socket
01596   * @param  pdata: pointer to data
01597   * @param  len : length of the data to be sent
01598   * @retval Operation Status.
01599   */
01600 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)
01601 {
01602   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;  
01603   
01604   if(Reqlen >= ES_WIFI_PAYLOAD_SIZE ) Reqlen= ES_WIFI_PAYLOAD_SIZE;
01605   
01606   *SentLen = Reqlen;
01607   sprintf((char*)Obj->CmdData,"P0=%d\r", Socket);
01608   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01609   if(ret == ES_WIFI_STATUS_OK)
01610   {
01611     sprintf((char*)Obj->CmdData,"S2=%lu\r",Timeout);
01612     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01613     
01614     if(ret == ES_WIFI_STATUS_OK)
01615     {
01616       sprintf((char *)Obj->CmdData,"S3=%04d\r",Reqlen);
01617       ret = AT_RequestSendData(Obj, Obj->CmdData, pdata, Reqlen, Obj->CmdData);
01618       
01619       if(ret == ES_WIFI_STATUS_OK)
01620       {
01621         if(strstr((char *)Obj->CmdData,"-1\r\n"))
01622         {
01623           ret = ES_WIFI_STATUS_ERROR;
01624         }
01625       }
01626     }
01627   }
01628   
01629   if (ret == ES_WIFI_STATUS_ERROR) *SentLen = 0;
01630   return ret;  
01631 }
01632 
01633 /**
01634   * @brief  Receive an amount data over WIFI.
01635   * @param  Obj: pointer to module handle
01636   * @param  Socket: number of the socket
01637   * @param  pdata: pointer to data
01638   * @param  len : pointer to the length of the data to be received
01639   * @retval Operation Status.
01640   */
01641 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)
01642 {
01643   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;  
01644   
01645   if(Reqlen <= ES_WIFI_PAYLOAD_SIZE )
01646   {
01647     sprintf((char*)Obj->CmdData,"P0=%d\r", Socket);
01648     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01649     
01650     if(ret == ES_WIFI_STATUS_OK)
01651     {
01652       sprintf((char*)Obj->CmdData,"R1=%d\r", Reqlen);
01653       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01654       if(ret == ES_WIFI_STATUS_OK)
01655       { 
01656         sprintf((char*)Obj->CmdData,"R2=%lu\r", Timeout);
01657         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01658         if(ret == ES_WIFI_STATUS_OK)
01659         {  
01660          sprintf((char*)Obj->CmdData,"R0=\r");
01661           ret = AT_RequestReceiveData(Obj, Obj->CmdData, (char *)pdata, Reqlen, Receivedlen);
01662         }
01663       }
01664       else
01665       {
01666         *Receivedlen = 0;
01667       }
01668     }
01669   }
01670   return ret;
01671 }
01672 
01673 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/