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