D D / es_wifi

Dependents:   DISCO_L475VG_IOT01-Telegram-BOT

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    if (len >= AT_OK_STRING_LEN) 
00582    {
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, ES_WIFI_DATA_SIZE, Obj->Timeout);
00609   //for(int i=0;i<len;i++) printf("%c",pdata[i]);
00610   
00611   if (len >= AT_OK_STRING_LEN)  
00612   {
00613     if(strstr((char *)pdata + len - AT_OK_STRING_LEN, AT_OK_STRING))
00614     {
00615       *ReadData = len - AT_OK_STRING_LEN;
00616       return ES_WIFI_STATUS_OK; 
00617     }
00618     else
00619     {     
00620       memcpy(Obj->CmdData, pdata + len - AT_OK_STRING_LEN, AT_OK_STRING_LEN);
00621       rlen = Obj->fops.IO_Receive(Obj->CmdData + AT_OK_STRING_LEN, AT_OK_STRING_LEN, Obj->Timeout);
00622       Obj->CmdData[AT_OK_STRING_LEN+rlen]=0;
00623       //for(int i=0;i<rlen;i++) printf("%c",Obj->CmdData[AT_OK_STRING_LEN+i]);
00624       
00625       if(strstr((char *) Obj->CmdData, AT_OK_STRING))
00626       {
00627         *ReadData = len + rlen - AT_OK_STRING_LEN;
00628         return ES_WIFI_STATUS_OK; 
00629       }
00630     }
00631   }
00632   return ES_WIFI_STATUS_IO_ERROR;
00633 }
00634 
00635 /**
00636   * @brief  Parses Received data.
00637   * @param  Obj: pointer to module handle
00638   * @param  cmd:command formatted string
00639   * @param  pdata: payload
00640   * @param  Reqlen : requested Data length.
00641   * @param  ReadData : pointer to received data length.
00642   * @retval Operation Status.
00643   */
00644 static ES_WIFI_Status_t AT_RequestReceiveData(ES_WIFIObject_t *Obj, uint8_t* cmd, char *pdata, uint16_t Reqlen, uint16_t *ReadData)
00645 {
00646   if(Obj->fops.IO_Send(cmd, strlen((char*)cmd), Obj->Timeout) > 0)
00647   {
00648     if(Obj->fops.IO_Receive(Obj->CmdData, 2, Obj->Timeout) == 2) /* Read Prompt */
00649     {
00650       if (Reqlen <= AT_OK_STRING_LEN) return ReceiveShortDataLen(Obj,pdata, Reqlen ,ReadData);
00651       if (Reqlen >  AT_OK_STRING_LEN) return ReceiveLongDataLen(Obj,pdata, Reqlen ,ReadData);
00652     }
00653   }  
00654   return ES_WIFI_STATUS_IO_ERROR;
00655 }
00656 
00657 
00658 /**
00659   * @brief  Initialize WIFI module.
00660   * @param  Obj: pointer to module handle
00661   * @retval Operation Status.
00662   */
00663 ES_WIFI_Status_t  ES_WIFI_Init(ES_WIFIObject_t *Obj)
00664 {
00665   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
00666   
00667   Obj->Timeout = ES_WIFI_TIMEOUT;
00668   
00669   if (Obj->fops.IO_Init() == 0)
00670   {
00671     ret = AT_ExecuteCommand(Obj,(uint8_t*)"I?\r\n", Obj->CmdData);
00672     
00673     if(ret == ES_WIFI_STATUS_OK)
00674     {
00675       AT_ParseInfo (Obj, Obj->CmdData);
00676     }
00677   }
00678   return ret;
00679 }
00680 
00681 /**
00682   * @brief  Return ProductID.
00683   * @param  Obj: pointer to module handle
00684   * @param  productID: pointer productID
00685   * @retval Operation Status.
00686   */
00687 ES_WIFI_Status_t  ES_WIFI_GetProductID(ES_WIFIObject_t *Obj, uint8_t *productID)
00688 {
00689   strncpy((char *)productID, (char *)Obj->Product_ID, ES_WIFI_PRODUCT_ID_SIZE);
00690   return ES_WIFI_STATUS_OK;
00691 }
00692 
00693 /**
00694   * @brief  Return Firmware Revision.
00695   * @param  Obj: pointer to module handle
00696   * @param  productID: pointer Revision
00697   * @retval Operation Status.
00698   */
00699 ES_WIFI_Status_t  ES_WIFI_GetFWRevID(ES_WIFIObject_t *Obj, uint8_t *FWRev)
00700 {
00701   strncpy((char *)FWRev, (char *)Obj->FW_Rev, ES_WIFI_FW_REV_SIZE);
00702   return ES_WIFI_STATUS_OK;
00703 }
00704 
00705 /**
00706   * @brief  Return product Name.
00707   * @param  Obj: pointer to module handle
00708   * @param  productID: pointer product Name
00709   * @retval Operation Status.
00710   */
00711 ES_WIFI_Status_t  ES_WIFI_GetProductName(ES_WIFIObject_t *Obj, uint8_t *productName)
00712 {
00713   strncpy((char *)productName, (char *)Obj->Product_Name, ES_WIFI_PRODUCT_NAME_SIZE);
00714   return ES_WIFI_STATUS_OK;
00715 }
00716 
00717 /**
00718   * @brief  Return API revision.
00719   * @param  Obj: pointer to module handle
00720   * @param  productID: pointer API revision.
00721   * @retval Operation Status.
00722   */
00723 ES_WIFI_Status_t  ES_WIFI_GetAPIRev(ES_WIFIObject_t *Obj, uint8_t *APIRev)
00724 {
00725   strncpy((char *)APIRev, (char *)Obj->API_Rev, ES_WIFI_API_REV_SIZE);
00726   return ES_WIFI_STATUS_OK;
00727 }
00728 
00729 /**
00730   * @brief  Return Stack Revision.
00731   * @param  Obj: pointer to module handle
00732   * @param  productID: pointer Stack Revision
00733   * @retval Operation Status.
00734   */
00735 ES_WIFI_Status_t  ES_WIFI_GetStackRev(ES_WIFIObject_t *Obj, uint8_t *StackRev)
00736 {
00737   strncpy((char *)StackRev, (char *)Obj->Stack_Rev, ES_WIFI_STACK_REV_SIZE);
00738   return ES_WIFI_STATUS_OK;
00739 }
00740 
00741 /**
00742   * @brief  Return RTOS Revision
00743   * @param  Obj: pointer to module handle
00744   * @param  productID: pointer RTOS Revision
00745   * @retval Operation Status.
00746   */
00747 ES_WIFI_Status_t  ES_WIFI_GetRTOSRev(ES_WIFIObject_t *Obj, uint8_t *RTOSRev)
00748 {
00749   strncpy((char *)RTOSRev, (char *)Obj->RTOS_Rev, ES_WIFI_RTOS_REV_SIZE);
00750   return ES_WIFI_STATUS_OK;
00751 }
00752 
00753 
00754 /**
00755   * @brief  Initialize WIFI module.
00756   * @param  Obj: pointer to module handle
00757   * @retval Operation Status.
00758   */
00759 ES_WIFI_Status_t  ES_WIFI_RegisterBusIO(ES_WIFIObject_t *Obj, IO_Init_Func IO_Init,
00760                                                               IO_DeInit_Func  IO_DeInit,
00761                                                               IO_Delay_Func   IO_Delay,  
00762                                                               IO_Send_Func    IO_Send,
00763                                                               IO_Receive_Func  IO_Receive)
00764 {
00765   if(!Obj || !IO_Init || !IO_DeInit || !IO_Send || !IO_Receive)
00766   {
00767     return ES_WIFI_STATUS_ERROR;
00768   }
00769 
00770   Obj->fops.IO_Init = IO_Init;
00771   Obj->fops.IO_Send = IO_Send;
00772   Obj->fops.IO_Receive = IO_Receive;
00773   Obj->fops.IO_Delay = IO_Delay;  
00774   
00775   return ES_WIFI_STATUS_OK;
00776 }
00777 
00778 /**
00779   * @brief  Change default Timeout.
00780   * @param  Obj: pointer to module handle
00781   * @param  Timeout: Timeout in mS
00782   * @retval Operation Status.
00783   */
00784 ES_WIFI_Status_t  ES_WIFI_SetTimeout(ES_WIFIObject_t *Obj, uint32_t Timeout)
00785 {
00786   Obj->Timeout = Timeout;
00787   return ES_WIFI_STATUS_OK;
00788 }
00789 
00790 /**
00791   * @brief  List all detected APs.
00792   * @param  Obj: pointer to module handle
00793   * @param  APs: pointer Access points structure
00794   * @retval Operation Status.
00795   */
00796 ES_WIFI_Status_t  ES_WIFI_ListAccessPoints(ES_WIFIObject_t *Obj, ES_WIFI_APs_t *APs)
00797 {  
00798 
00799   ES_WIFI_Status_t ret;
00800 
00801   ret = AT_ExecuteCommand(Obj,(uint8_t*)"F0\r", Obj->CmdData);
00802   if(ret == ES_WIFI_STATUS_OK)
00803   {
00804      AT_ParseAP((char *)Obj->CmdData, APs);
00805   }
00806   return ret;
00807 }
00808 
00809 /**
00810   * @brief  Join an Access point.
00811   * @param  Obj: pointer to module handle
00812   * @param  Ssid: the access point id.
00813   * @param  Password: the Access point password.
00814   * @param  SecType: Security type.
00815   * @retval Operation Status.
00816   */
00817 ES_WIFI_Status_t ES_WIFI_Connect(ES_WIFIObject_t *Obj, const char* SSID, 
00818                                          const char* Password,
00819                                          ES_WIFI_SecurityType_t SecType)
00820 {
00821   ES_WIFI_Status_t ret;
00822   
00823   sprintf((char*)Obj->CmdData,"C1=%s\r", SSID);
00824   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00825   if(ret == ES_WIFI_STATUS_OK)
00826   {
00827     sprintf((char*)Obj->CmdData,"C2=%s\r", Password);
00828     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00829     
00830     if(ret == ES_WIFI_STATUS_OK)
00831     {
00832       Obj->Security = SecType;
00833       sprintf((char*)Obj->CmdData,"C3=%d\r", (uint8_t)SecType);
00834       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00835       
00836       if(ret == ES_WIFI_STATUS_OK)
00837       {
00838         sprintf((char*)Obj->CmdData,"C0\r");
00839         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);  
00840         if(ret == ES_WIFI_STATUS_OK)
00841         {
00842            Obj->NetSettings.IsConnected = 1;
00843         }
00844       }    
00845     }
00846   }
00847   return ret;
00848 }
00849 
00850 /**
00851   * @brief  Check whether the module is connected to an access point.
00852   * @retval Operation Status.
00853   */
00854 uint8_t ES_WIFI_IsConnected(ES_WIFIObject_t *Obj)
00855 {
00856   return Obj->NetSettings.IsConnected;
00857 }
00858 /**
00859   * @brief  Disconnect from a network.
00860   * @param  Obj: pointer to module handle
00861   * @retval Operation Status.
00862   */
00863 ES_WIFI_Status_t ES_WIFI_Disconnect(ES_WIFIObject_t *Obj)
00864 {
00865   sprintf((char*)Obj->CmdData,"CD\r"); 
00866   return  AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
00867 }
00868 /**
00869   * @brief  Return network settings.
00870   * @param  Obj: pointer to module handle
00871   * @param  Pointer to network setting structure.
00872   * @retval Operation Status.
00873   */
00874 ES_WIFI_Status_t ES_WIFI_GetNetworkSettings(ES_WIFIObject_t *Obj)
00875 {
00876   ES_WIFI_Status_t ret;
00877   
00878   sprintf((char*)Obj->CmdData,"C?\r");
00879   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00880   
00881   if(ret == ES_WIFI_STATUS_OK)
00882   {
00883      AT_ParseConnSettings((char *)Obj->CmdData, &Obj->NetSettings);
00884   }  
00885   return ret;
00886 }
00887 
00888 /**
00889   * @brief  Configure and activate SoftAP.
00890   * @param  Obj: pointer to module handle
00891   * @param  ApConfig : Pointer to AP config structure.
00892   * @param  ip : AP IP address
00893   * @param  mac : AP MAC address
00894   * @retval Operation Status.
00895   */
00896 ES_WIFI_Status_t ES_WIFI_ActivateAP(ES_WIFIObject_t *Obj, ES_WIFI_APConfig_t *ApConfig)
00897 {
00898   ES_WIFI_Status_t ret;
00899 
00900   sprintf((char*)Obj->CmdData,"AS=0,%s\r", ApConfig->SSID);
00901   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00902   if(ret == ES_WIFI_STATUS_OK)
00903   {
00904   
00905     sprintf((char*)Obj->CmdData,"A1=%c\r", (int)ApConfig->Security + '0');
00906     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00907     if(ret == ES_WIFI_STATUS_OK)
00908     {
00909       
00910       sprintf((char*)Obj->CmdData,"A2=%s\r", ApConfig->Pass);
00911       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00912       if(ret == ES_WIFI_STATUS_OK)
00913       { 
00914         
00915         sprintf((char*)Obj->CmdData,"AC=%d\r", ApConfig->Channel);
00916         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00917         if(ret == ES_WIFI_STATUS_OK)
00918         { 
00919           
00920           sprintf((char*)Obj->CmdData,"AT=%d\r", ApConfig->MaxConnections);
00921           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
00922           if(ret == ES_WIFI_STATUS_OK)
00923           { 
00924             sprintf((char*)Obj->CmdData,"A0\r");
00925             ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);             
00926             if(ret == ES_WIFI_STATUS_OK)
00927             { 
00928               if(strstr((char *)Obj->CmdData, "[AP     ]"))
00929               {           
00930                 ret = ES_WIFI_STATUS_OK;
00931               }       
00932             }            
00933           }
00934         }
00935       }
00936     }
00937   }
00938   return ret;
00939 }
00940 
00941 /**
00942   * @brief  Get AP notification.
00943   * @param  Obj: pointer to module handle
00944   * @param  ip : Assigned ip address.
00945   * @param  ip : joind device mac address.
00946   * @retval AP State.
00947   */
00948 ES_WIFI_APState_t ES_WIFI_WaitAPStateChange(ES_WIFIObject_t *Obj)
00949 {
00950   ES_WIFI_APState_t ret = ES_WIFI_AP_NONE;
00951   char *ptr;
00952    
00953  #if (ES_WIFI_USE_UART == 1)   
00954   if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
00955   {
00956     if(strstr((char *)Obj->CmdData, AT_ERROR_STRING))
00957     {
00958       return ES_WIFI_AP_ERROR;
00959     }
00960 #else
00961     do
00962     {
00963       sprintf((char*)Obj->CmdData,"MR\r");
00964       if(AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData) != ES_WIFI_STATUS_OK)
00965       { 
00966         return ES_WIFI_AP_ERROR;
00967       }        
00968 #endif
00969     else  if(strstr((char *)Obj->CmdData, "[AP DHCP]"))
00970     {
00971       ptr = strtok((char *)Obj->CmdData + 2, " ");
00972       ptr = strtok(NULL, " ");
00973       ptr = strtok(NULL, " "); 
00974       ptr = strtok(NULL, " "); 
00975       ParseMAC((char *)ptr, Obj->APSettings.MAC_Addr); 
00976       ptr = strtok(NULL, " "); 
00977       ptr = strtok(NULL, "\r");        
00978       ParseIP((char *)ptr, Obj->APSettings.IP_Addr); 
00979       ret = ES_WIFI_AP_ASSIGNED;
00980 #if (ES_WIFI_USE_SPI == 1)          
00981       break;
00982 #endif      
00983     }  
00984     else  if(strstr((char *)Obj->CmdData, "[JOIN   ]"))
00985     {
00986       ptr = strtok((char *)Obj->CmdData + 12, ",");
00987       strncpy((char *)Obj->APSettings.SSID, ptr, ES_WIFI_MAX_SSID_NAME_SIZE  );
00988       ptr = strtok(NULL, ",");     
00989       ParseIP((char *)ptr, Obj->APSettings.IP_Addr); 
00990       ret =  ES_WIFI_AP_JOINED;
00991 #if (ES_WIFI_USE_SPI == 1)          
00992       break;
00993 #endif        
00994     } 
00995 #if (ES_WIFI_USE_UART == 1)      
00996     }
00997 #else
00998     Obj->fops.IO_Delay(1000);
00999   } while (1);
01000 #endif  
01001   return ret;
01002 }
01003 
01004 /**
01005   * @brief  retrn the MAC address of the es module.
01006   * @param  Obj: pointer to module handle
01007   * @param  mac: pointer to the MAC address array.
01008   * @retval Operation Status.
01009   */
01010 ES_WIFI_Status_t ES_WIFI_GetMACAddress(ES_WIFIObject_t *Obj, uint8_t *mac)
01011 {
01012   ES_WIFI_Status_t ret ;
01013   char *ptr;
01014   
01015   sprintf((char*)Obj->CmdData,"Z5\r");
01016   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01017   if(ret == ES_WIFI_STATUS_OK)
01018   {
01019     ptr = strtok((char *)(Obj->CmdData + 2), "\r\n");    
01020     ParseMAC(ptr, mac) ;
01021   }           
01022   return ret;
01023 }
01024 
01025 /**
01026   * @brief  retrn the IP address of the es module.
01027   * @param  Obj: pointer to module handle
01028   * @param  mac: pointer to the IP address array.
01029   * @retval Operation Status.
01030   */
01031 ES_WIFI_Status_t ES_WIFI_GetIPAddress(ES_WIFIObject_t *Obj, uint8_t *ipaddr)
01032 {
01033   memcpy(ipaddr, Obj->NetSettings.IP_Addr, 4);         
01034   return ES_WIFI_STATUS_OK;
01035 }
01036 
01037 /**
01038   * @brief  Set the MAC address of the es module.
01039   * @param  Obj: pointer to module handle
01040   * @param  mac: pointer to the MAC address array.
01041   * @retval Operation Status.
01042   */
01043 ES_WIFI_Status_t ES_WIFI_SetMACAddress(ES_WIFIObject_t *Obj, uint8_t *mac)
01044 {
01045   ES_WIFI_Status_t ret ;
01046  
01047   sprintf((char*)Obj->CmdData,"Z4=%X:%X:%X:%X:%X:%X\r",mac[0],mac[1],mac[2],mac[3],mac[4],mac[5] );
01048   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01049   if(ret == ES_WIFI_STATUS_OK)
01050   {
01051     sprintf((char*)Obj->CmdData,"Z1\r");
01052     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01053   }  
01054   return ret;
01055 }
01056 
01057 /**
01058   * @brief  Reset To factory defaults.
01059   * @param  Obj: pointer to module handle
01060   * @retval Operation Status.
01061   */
01062 ES_WIFI_Status_t ES_WIFI_ResetToFactoryDefault(ES_WIFIObject_t *Obj)
01063 {
01064   ES_WIFI_Status_t ret ;
01065  
01066   sprintf((char*)Obj->CmdData,"Z0\r");
01067   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);       
01068   return ret;
01069 }
01070 
01071 /**
01072   * @brief  Reset the module.
01073   * @param  Obj: pointer to module handle
01074   * @retval Operation Status.
01075   */
01076 ES_WIFI_Status_t ES_WIFI_ResetModule(ES_WIFIObject_t *Obj)
01077 {
01078   ES_WIFI_Status_t ret ;
01079   
01080   sprintf((char*)Obj->CmdData,"ZR\r");
01081   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);       
01082   return ret;
01083 }
01084 
01085 /**
01086   * @brief  Set Product Name.
01087   * @param  Obj: pointer to module handle
01088   * @param  ProductName : pointer to product name string
01089   * @retval Operation Status.
01090   */
01091 ES_WIFI_Status_t ES_WIFI_SetProductName(ES_WIFIObject_t *Obj, uint8_t *ProductName)
01092 {
01093   ES_WIFI_Status_t ret ;
01094   
01095   sprintf((char*)Obj->CmdData,"ZN=%s\r",ProductName);
01096   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01097   if(ret == ES_WIFI_STATUS_OK)
01098   {
01099     sprintf((char*)Obj->CmdData,"Z1\r");
01100     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01101   }
01102   return ret;
01103 }
01104 
01105 #if (ES_WIFI_USE_FIRMWAREUPDATE == 1)
01106 /**
01107   * @brief  OTA Firmware Upgrade.
01108   * @param  Obj: pointer to module handle
01109   * @param  Upgrade link path
01110   * @retval Operation Status.
01111   */
01112 ES_WIFI_Status_t ES_WIFI_OTA_Upgrade(ES_WIFIObject_t *Obj, uint8_t *link)
01113 {
01114   ES_WIFI_Status_t ret ;
01115   
01116   sprintf((char*)Obj->CmdData,"Z0=%d\r%s",strlen((char *)link), (char *)link);
01117   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01118   return ret;
01119 }
01120 #endif
01121 #if (ES_WIFI_USE_UART == 1)
01122 /**
01123   * @brief  Set UART Baud Rate.
01124   * @param  Obj: pointer to module handle
01125   * @param  UART BAud rate
01126   * @retval Operation Status.
01127   */
01128 ES_WIFI_Status_t ES_WIFI_SetUARTBaudRate(ES_WIFIObject_t *Obj, uint16_t BaudRate)
01129 {
01130   ES_WIFI_Status_t ret ;
01131  
01132   sprintf((char*)Obj->CmdData,"U2=%d\r", BaudRate);
01133   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01134   if(ret == ES_WIFI_STATUS_OK)
01135   {
01136     sprintf((char*)Obj->CmdData,"U0\r");
01137     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01138   }
01139   return ret;
01140 }
01141 
01142 /**
01143   * @brief  Get UART Configuration.
01144   * @param  Obj: pointer to module handle
01145   * @param  pointer to UART config structure
01146   * @retval Operation Status.
01147   */
01148 ES_WIFI_Status_t ES_WIFI_GetUARTConfig(ES_WIFIObject_t *Obj, ES_WIFI_UARTConfig_t *pconf)
01149 {
01150   ES_WIFI_Status_t ret ;
01151  
01152   sprintf((char*)Obj->CmdData,"U?\r");
01153   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01154   if(ret == ES_WIFI_STATUS_OK)
01155   {
01156     AT_ParseUARTConfig((char *)Obj->CmdData, pconf);
01157   }
01158   return ret;
01159 }
01160 #endif
01161 
01162 /**
01163   * @brief  Get System Configuration.
01164   * @param  Obj: pointer to module handle
01165   * @param  pointer to System config structure
01166   * @retval Operation Status.
01167   */
01168 ES_WIFI_Status_t ES_WIFI_GetSystemConfig(ES_WIFIObject_t *Obj, ES_WIFI_SystemConfig_t *pconf)
01169 {
01170   ES_WIFI_Status_t ret ;
01171  
01172   sprintf((char*)Obj->CmdData,"Z?\r");
01173   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01174   if(ret == ES_WIFI_STATUS_OK)
01175   {
01176     AT_ParseSystemConfig((char *)Obj->CmdData, pconf);
01177   }
01178   return ret;
01179 }
01180 
01181 #if (ES_WIFI_USE_PING == 1)
01182 /**
01183   * @brief  Ping an IP address.
01184   * @param  Obj: pointer to module handle
01185   * @param  Ping: ping structure.
01186   * @retval Operation Status.
01187   */
01188 ES_WIFI_Status_t ES_WIFI_Ping(ES_WIFIObject_t *Obj, uint8_t *address, uint16_t count, uint16_t interval_ms)
01189 {
01190   ES_WIFI_Status_t ret;
01191  
01192   sprintf((char*)Obj->CmdData,"T1=%d.%d.%d.%d\r", address[0],address[1],
01193           address[2],address[3]);
01194   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01195   
01196   if(ret == ES_WIFI_STATUS_OK)
01197   {
01198     
01199     sprintf((char*)Obj->CmdData,"T2=%d\r", count);
01200     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01201     
01202     if(ret == ES_WIFI_STATUS_OK)
01203     {
01204       sprintf((char*)Obj->CmdData,"T3=%d\r", interval_ms);
01205       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01206       
01207       if(ret == ES_WIFI_STATUS_OK)
01208       {
01209         sprintf((char*)Obj->CmdData,"T0=\r");
01210         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);         
01211       }
01212     }
01213   }
01214   
01215   return ret;
01216 }
01217 #endif
01218 /**
01219   * @brief  DNS Lookup to get IP address .
01220   * @param  Obj: pointer to module handle
01221   * @param  url: Domain Name.
01222   * @param  ipaddress: IP address.
01223   * @retval Operation Status.
01224   */
01225 ES_WIFI_Status_t ES_WIFI_DNS_LookUp(ES_WIFIObject_t *Obj, const char *url, uint8_t *ipaddress)
01226 {
01227   ES_WIFI_Status_t ret;
01228   char *ptr;
01229   
01230   sprintf((char*)Obj->CmdData,"D0=%s\r", url);
01231   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01232   
01233   if(ret == ES_WIFI_STATUS_OK)
01234   {
01235     ptr = strtok((char *)Obj->CmdData + 2, "\r");
01236     ParseIP(ptr, ipaddress);       
01237   } 
01238   return ret;
01239 }
01240 
01241 
01242 
01243 
01244 /**
01245   * @brief  Configure and Start a Client connection.
01246   * @param  Obj: pointer to module handle
01247   * @param  conn: pointer to the connection structure
01248   * @retval Operation Status.
01249   */
01250 ES_WIFI_Status_t ES_WIFI_ConnectToRemoteHost(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
01251 {
01252   ES_WIFI_Status_t ret;
01253 
01254     sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01255     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01256 
01257     sprintf((char*)Obj->CmdData,"P1=%d\r",conn->Type);
01258     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01259     if(ret != ES_WIFI_STATUS_OK) return ret;
01260         
01261     sprintf((char*)Obj->CmdData,"D0=%s\r",(char*)conn->RemoteHost);
01262     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01263     if(ret != ES_WIFI_STATUS_OK) return ret;
01264     
01265     sprintf((char*)Obj->CmdData,"P4=%d\r", conn->RemotePort);
01266     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01267     if(ret != ES_WIFI_STATUS_OK) return ret;
01268     
01269     if( conn->Type == ES_WIFI_TCP_SSL_CONNECTION)
01270     {
01271       sprintf((char*)Obj->CmdData,"P9=0\r");
01272       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);         
01273       if(ret != ES_WIFI_STATUS_OK) return ret;
01274     }
01275 
01276     sprintf((char*)Obj->CmdData,"P6=1\r");
01277     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);      
01278    
01279   return ret;
01280 }
01281 
01282 
01283 
01284 /**
01285   * @brief  Configure and Start a Client connection.
01286   * @param  Obj: pointer to module handle
01287   * @param  conn: pointer to the connection structure
01288   * @retval Operation Status.
01289   */
01290 ES_WIFI_Status_t ES_WIFI_StartClientConnection(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,"P1=%d\r", conn->Type);
01300     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01301     if(ret == ES_WIFI_STATUS_OK)
01302     {
01303       if ((conn->Type == ES_WIFI_UDP_CONNECTION) && (conn->LocalPort > 0)) 
01304       {
01305         sprintf((char*)Obj->CmdData,"P2=%d\r", conn->RemotePort);
01306         if(AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData) == ES_WIFI_STATUS_ERROR)
01307         {
01308           return ES_WIFI_STATUS_ERROR;
01309         }
01310       }
01311       sprintf((char*)Obj->CmdData,"P4=%d\r", conn->RemotePort);
01312       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01313       
01314       if(ret == ES_WIFI_STATUS_OK)
01315       {
01316         sprintf((char*)Obj->CmdData,"P3=%d.%d.%d.%d\r", conn->RemoteIP[0],conn->RemoteIP[1],conn->RemoteIP[2],conn->RemoteIP[3]);
01317         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01318         if(ret == ES_WIFI_STATUS_OK)
01319         {
01320           sprintf((char*)Obj->CmdData,"P9=0\r");
01321           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);         
01322         }          
01323         if(ret == ES_WIFI_STATUS_OK)
01324         {
01325           sprintf((char*)Obj->CmdData,"P6=1\r");
01326           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);         
01327         }          
01328       }           
01329     }
01330   }
01331   return ret;
01332 }
01333 
01334 /**
01335   * @brief  Stop Client connection.
01336   * @param  Obj: pointer to module handle
01337   * @retval Operation Status.
01338   */
01339 ES_WIFI_Status_t ES_WIFI_StopClientConnection(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
01340 {
01341   ES_WIFI_Status_t ret;
01342   
01343   sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01344   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01345   
01346   if(ret == ES_WIFI_STATUS_OK)
01347   {  
01348     sprintf((char*)Obj->CmdData,"P6=0\r");
01349     ret =  AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);     
01350   }
01351   return ret;
01352 }
01353 
01354 #if (ES_WIFI_USE_AWS == 1)
01355 /**
01356   * @brief  Configure and Start a AWS Client connection.
01357   * @param  Obj: pointer to module handle
01358   * @param  conn: pointer to the connection structure
01359   * @retval Operation Status.
01360   */
01361 ES_WIFI_Status_t ES_WIFI_StartAWSClientConnection(ES_WIFIObject_t *Obj, ES_WIFI_AWS_Conn_t *conn)
01362 {
01363   
01364   ES_WIFI_Status_t ret;
01365 
01366   sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01367   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01368   
01369   if(ret == ES_WIFI_STATUS_OK)
01370   {
01371     sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
01372     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01373     if(ret == ES_WIFI_STATUS_OK)
01374     {
01375       sprintf((char*)Obj->CmdData,"P4=%d\r", conn->RemotePort);
01376       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01377       
01378       if(ret == ES_WIFI_STATUS_OK)
01379       {
01380         sprintf((char*)Obj->CmdData,"PM=0,%s\r", conn->PublishTopic);
01381         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01382         if(ret == ES_WIFI_STATUS_OK)
01383         {
01384           if(ret == ES_WIFI_STATUS_OK)
01385           {
01386             sprintf((char*)Obj->CmdData,"PM=1,%s\r", conn->SubscribeTopic);
01387             ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01388             if(ret == ES_WIFI_STATUS_OK)
01389             {
01390               
01391               sprintf((char*)Obj->CmdData,"PM=2,%d\r", conn->MQTTMode);
01392               ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01393               if(ret == ES_WIFI_STATUS_OK)
01394               {
01395                 sprintf((char*)Obj->CmdData,"PM=5,%s\r", conn->ClientID);
01396                 ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01397                 if(ret == ES_WIFI_STATUS_OK)
01398                 {
01399                   sprintf((char*)Obj->CmdData,"PM\r");
01400                   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01401                   if(ret == ES_WIFI_STATUS_OK)
01402                   {
01403                     sprintf((char*)Obj->CmdData,"P6=1\r");
01404                     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);         
01405                   } 
01406                 }
01407               }
01408             }
01409           }           
01410         }
01411       }
01412     }
01413   }
01414   return ret;
01415 }
01416 #endif
01417 /**
01418   * @brief  Configure and Start a Server.
01419   * @param  Obj: pointer to module handle
01420   * @param  conn: pointer to the connection structure
01421   * @retval Operation Status.
01422   */
01423 ES_WIFI_Status_t ES_WIFI_StartServerSingleConn(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
01424 {
01425   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
01426   char *ptr;
01427   
01428   sprintf((char*)Obj->CmdData,"PK=1,3000\r");
01429   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01430   if(ret == ES_WIFI_STATUS_OK)
01431   {
01432     sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01433     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01434     if(ret == ES_WIFI_STATUS_OK)
01435     {
01436       sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
01437       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01438       if(ret == ES_WIFI_STATUS_OK)
01439       {
01440         sprintf((char*)Obj->CmdData,"P2=%d\r", conn->LocalPort);
01441         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01442         if(ret == ES_WIFI_STATUS_OK)
01443         {       
01444           sprintf((char*)Obj->CmdData,"P5=1\r");
01445           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01446           
01447           if(ret == ES_WIFI_STATUS_OK)
01448           {  
01449 #if (ES_WIFI_USE_UART == 1)               
01450             if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
01451             {
01452               if(strstr((char *)Obj->CmdData, "Accepted"))
01453               {
01454                 ptr = strtok((char *)Obj->CmdData + 2, " ");
01455                 ptr = strtok(NULL, " ");
01456                 ptr = strtok(NULL, " "); 
01457                 ptr = strtok(NULL, ":");            
01458                 ParseIP((char *)ptr, conn->RemoteIP);          
01459                 ret = ES_WIFI_STATUS_OK;
01460               }  
01461             }
01462 #else
01463             do
01464             {
01465               sprintf((char*)Obj->CmdData,"MR\r");
01466               ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01467               if(ret == ES_WIFI_STATUS_OK)
01468               {  
01469                 if((strstr((char *)Obj->CmdData, "[SOMA]")) && (strstr((char *)Obj->CmdData, "[EOMA]")))
01470                 {
01471                   if(strstr((char *)Obj->CmdData, "Accepted"))
01472                   {
01473                     ptr = strtok((char *)Obj->CmdData + 2, " ");
01474                     ptr = strtok(NULL, " ");
01475                     ptr = strtok(NULL, " "); 
01476                     ptr = strtok(NULL, ":");            
01477                     ParseIP((char *)ptr, conn->RemoteIP);          
01478                     ret = ES_WIFI_STATUS_OK;
01479                     break;
01480                   }  
01481                 }
01482               }
01483               else
01484               {
01485                 ret = ES_WIFI_STATUS_ERROR;
01486                 break;
01487               }
01488               Obj->fops.IO_Delay(1000);
01489             } while (1);
01490 #endif  
01491           }
01492         }
01493       }  
01494     }
01495   }
01496   return ret;
01497 }
01498 
01499 /**
01500   * @brief  Stop a Server.
01501   * @param  Obj: pointer to module handle
01502   * @retval Operation Status.
01503   */
01504 ES_WIFI_Status_t ES_WIFI_StopServerSingleConn(ES_WIFIObject_t *Obj)
01505 {
01506   sprintf((char*)Obj->CmdData,"P5=0\r");
01507   return AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01508 }
01509 
01510 
01511 /**
01512   * @brief  Configure and Start a Server.
01513   * @param  Obj: pointer to module handle
01514   * @param  conn: pointer to the connection structure
01515   * @retval Operation Status.
01516   */
01517 ES_WIFI_Status_t ES_WIFI_StartServerMultiConn(ES_WIFIObject_t *Obj, ES_WIFI_Conn_t *conn)
01518 {
01519   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
01520   char *ptr;
01521   
01522   sprintf((char*)Obj->CmdData,"PK=1,3000\r");
01523   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01524   if(ret == ES_WIFI_STATUS_OK)
01525   {
01526     sprintf((char*)Obj->CmdData,"P0=%d\r", conn->Number);
01527     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01528     if(ret == ES_WIFI_STATUS_OK)
01529     {
01530       sprintf((char*)Obj->CmdData,"P1=%d\r", conn->Type);
01531       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01532       if(ret == ES_WIFI_STATUS_OK)
01533       {
01534         sprintf((char*)Obj->CmdData,"P2=%d\r", conn->LocalPort);
01535         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01536         if(ret == ES_WIFI_STATUS_OK)
01537         {       
01538           sprintf((char*)Obj->CmdData,"P8=6\r");
01539           ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01540           
01541           if(ret == ES_WIFI_STATUS_OK)
01542           {          
01543             sprintf((char*)Obj->CmdData,"P5=1\r");
01544             ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01545             
01546             if(ret == ES_WIFI_STATUS_OK)
01547             { 
01548 #if (ES_WIFI_USE_UART == 1)               
01549             if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
01550             {
01551               if(strstr((char *)Obj->CmdData, "Accepted"))
01552               {
01553                 ptr = strtok((char *)Obj->CmdData + 2, " ");
01554                 ptr = strtok(NULL, " ");
01555                 ptr = strtok(NULL, " "); 
01556                 ptr = strtok(NULL, ":");            
01557                 ParseIP((char *)ptr, conn->RemoteIP);          
01558                 ret = ES_WIFI_STATUS_OK;
01559               }  
01560             }
01561 #else
01562             do
01563             {
01564               sprintf((char*)Obj->CmdData,"MR\r");
01565               ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01566               if(ret == ES_WIFI_STATUS_OK)
01567               {  
01568                 if((strstr((char *)Obj->CmdData, "[SOMA]")) && (strstr((char *)Obj->CmdData, "[EOMA]")))
01569                 {
01570                   if(strstr((char *)Obj->CmdData, "Accepted"))
01571                   {
01572                     ptr = strtok((char *)Obj->CmdData + 2, " ");
01573                     ptr = strtok(NULL, " ");
01574                     ptr = strtok(NULL, " "); 
01575                     ptr = strtok(NULL, ":");            
01576                     ParseIP((char *)ptr, conn->RemoteIP);          
01577                     ret = ES_WIFI_STATUS_OK;
01578                     break;
01579                   }  
01580                 }
01581               }
01582               else
01583               {
01584                 ret = ES_WIFI_STATUS_ERROR;
01585                 break;
01586               }
01587               Obj->fops.IO_Delay(1000);
01588             } while (1);
01589 #endif 
01590             }
01591             if(ret == ES_WIFI_STATUS_OK)
01592             {          
01593               sprintf((char*)Obj->CmdData,"P7=1\r");
01594               ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01595               
01596             }
01597           }
01598         }
01599       }
01600     }
01601   }
01602   return ret;
01603 }
01604 
01605 /**
01606   * @brief  Stop a Server.
01607   * @param  Obj: pointer to module handle
01608   * @retval Operation Status.
01609   */
01610 ES_WIFI_Status_t ES_WIFI_StopServerMultiConn(ES_WIFIObject_t *Obj)
01611 {
01612   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;
01613   
01614   /* close the socket handle for the current request. */
01615   sprintf((char*)Obj->CmdData,"P7=2\r");
01616   ret =  AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01617   
01618   if(ret == ES_WIFI_STATUS_OK)
01619   {      
01620     /*Get the next request out of the queue */    
01621     sprintf((char*)Obj->CmdData,"P7=3\r");
01622     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData); 
01623     if(ret == ES_WIFI_STATUS_OK)
01624     {          
01625       if(ret == ES_WIFI_STATUS_OK)
01626       { 
01627         if(Obj->fops.IO_Receive(Obj->CmdData, 0, Obj->Timeout) > 0)
01628         {
01629           if(strstr((char *)Obj->CmdData, "Accepted"))
01630           {
01631             ret = ES_WIFI_STATUS_OK;
01632           }  
01633         }
01634       }      
01635     }
01636   }
01637   return ret;       
01638 }
01639 /**
01640   * @brief  Send an amount data over WIFI.
01641   * @param  Obj: pointer to module handle
01642   * @param  Socket: number of the socket
01643   * @param  pdata: pointer to data
01644   * @param  len : length of the data to be sent
01645   * @retval Operation Status.
01646   */
01647 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)
01648 {
01649   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;  
01650   
01651   if(Reqlen >= ES_WIFI_PAYLOAD_SIZE ) Reqlen= ES_WIFI_PAYLOAD_SIZE;
01652   
01653   *SentLen = Reqlen;
01654   sprintf((char*)Obj->CmdData,"P0=%d\r", Socket);
01655   ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01656   if(ret == ES_WIFI_STATUS_OK)
01657   {
01658     sprintf((char*)Obj->CmdData,"S2=%lu\r",Timeout);
01659     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01660     
01661     if(ret == ES_WIFI_STATUS_OK)
01662     {
01663       sprintf((char *)Obj->CmdData,"S3=%04d\r",Reqlen);
01664       ret = AT_RequestSendData(Obj, Obj->CmdData, pdata, Reqlen, Obj->CmdData);
01665       
01666       if(ret == ES_WIFI_STATUS_OK)
01667       {
01668         if(strstr((char *)Obj->CmdData,"-1\r\n"))
01669         {
01670           ret = ES_WIFI_STATUS_ERROR;
01671         }
01672       }
01673     }
01674   }
01675   
01676   if (ret == ES_WIFI_STATUS_ERROR) *SentLen = 0;
01677   return ret;  
01678 }
01679 
01680 /**
01681   * @brief  Receive an amount data over WIFI.
01682   * @param  Obj: pointer to module handle
01683   * @param  Socket: number of the socket
01684   * @param  pdata: pointer to data
01685   * @param  len : pointer to the length of the data to be received
01686   * @retval Operation Status.
01687   */
01688 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)
01689 {
01690   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;  
01691   
01692   if(Reqlen <= ES_WIFI_PAYLOAD_SIZE )
01693   {
01694     sprintf((char*)Obj->CmdData,"P0=%d\r", Socket);
01695     ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01696     
01697     if(ret == ES_WIFI_STATUS_OK)
01698     {
01699       sprintf((char*)Obj->CmdData,"R1=%d\r", Reqlen);
01700       ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01701       if(ret == ES_WIFI_STATUS_OK)
01702       { 
01703         sprintf((char*)Obj->CmdData,"R2=%lu\r", Timeout);
01704         ret = AT_ExecuteCommand(Obj, Obj->CmdData, Obj->CmdData);
01705         if(ret == ES_WIFI_STATUS_OK)
01706         {  
01707          sprintf((char*)Obj->CmdData,"R0=\r");
01708           ret = AT_RequestReceiveData(Obj, Obj->CmdData, (char *)pdata, Reqlen, Receivedlen);
01709         }
01710       }
01711       else
01712       {
01713         *Receivedlen = 0;
01714       }
01715     }
01716   }
01717   return ret;
01718 }
01719 
01720 ES_WIFI_Status_t ES_WIFI_ReceiveData2(ES_WIFIObject_t *Obj, uint8_t *pdata, uint16_t Reqlen, uint16_t *Receivedlen)
01721 {
01722   ES_WIFI_Status_t ret = ES_WIFI_STATUS_ERROR;  
01723   
01724   if(Reqlen <= ES_WIFI_PAYLOAD_SIZE )
01725   {
01726     *Receivedlen = 0;
01727     sprintf((char*)Obj->CmdData,"R0=\r");
01728     ret = AT_RequestReceiveData(Obj, Obj->CmdData, (char *)pdata, Reqlen, Receivedlen);
01729   }
01730   return ret;
01731 }
01732 
01733 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/