Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: DISCO_L475VG_IOT01-Telegram-BOT
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>© 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****/
Generated on Tue Jul 19 2022 09:47:51 by
1.7.2