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