Dependencies: BSP_B-L475E-IOT01
Diff: wifi.c
- Revision:
- 0:c61a93635433
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wifi.c Thu Aug 17 15:26:02 2017 +0000 @@ -0,0 +1,517 @@ +/** + ****************************************************************************** + * @file wifi.c + * @author MCD Application Team + * @version V1.8.0 + * @date 21-April-2017 + * @brief WIFI interface file. + ****************************************************************************** + * @attention + * + * <h2><center>© Copyright (c) 2017 STMicroelectronics International N.V. + * All rights reserved.</center></h2> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted, provided that the following conditions are met: + * + * 1. Redistribution of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of other + * contributors to this software may be used to endorse or promote products + * derived from this software without specific written permission. + * 4. This software, including modifications and/or derivative works of this + * software, must execute solely and exclusively on microcontroller or + * microprocessor devices manufactured by or for STMicroelectronics. + * 5. Redistribution and use of this software other than as permitted under + * this license is void and will automatically terminate your rights under + * this license. + * + * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY + * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT + * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* Includes ------------------------------------------------------------------*/ +#include "wifi.h" + +/* Private define ------------------------------------------------------------*/ +/* Private variables ---------------------------------------------------------*/ +ES_WIFIObject_t EsWifiObj; + +/* Private functions ---------------------------------------------------------*/ +/** + * @brief Initialiaze the WIFI core + * @param None + * @retval Operation status + */ +WIFI_Status_t WIFI_Init(void) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(ES_WIFI_RegisterBusIO(&EsWifiObj, + SPI_WIFI_Init, + SPI_WIFI_DeInit, + SPI_WIFI_Delay, + SPI_WIFI_SendData, + SPI_WIFI_ReceiveData) == ES_WIFI_STATUS_OK) + { + + if(ES_WIFI_Init(&EsWifiObj) == ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + } + return ret; +} + +/** + * @brief List a defined number of vailable access points + * @param APs : pointer to APs structure + * @param AP_MaxNbr : Max APs number to be listed + * @retval Operation status + */ +WIFI_Status_t WIFI_ListAccessPoints(WIFI_APs_t *APs, uint8_t AP_MaxNbr) +{ + uint8_t APCount; + WIFI_Status_t ret = WIFI_STATUS_ERROR; + ES_WIFI_APs_t esWifiAPs; + + if(ES_WIFI_ListAccessPoints(&EsWifiObj, &esWifiAPs) == ES_WIFI_STATUS_OK) + { + if(esWifiAPs.nbr > 0) + { + APs->count = MIN(esWifiAPs.nbr, AP_MaxNbr); + for(APCount = 0; APCount < APs->count; APCount++) + { + APs->ap[APCount].Ecn = (WIFI_Ecn_t)esWifiAPs.AP[APCount].Security; + strncpy( (char *)APs->ap[APCount].SSID, (char *)esWifiAPs.AP[APCount].SSID, MIN (WIFI_MAX_SSID_NAME, WIFI_MAX_SSID_NAME)); + APs->ap[APCount].RSSI = esWifiAPs.AP[APCount].RSSI; + memcpy(APs->ap[APCount].MAC, esWifiAPs.AP[APCount].MAC, 6); + } + } + ret = WIFI_STATUS_OK; + } + return ret; +} + +/** + * @brief Join an Access Point + * @param SSID : SSID string + * @param Password : Password string + * @param ecn : Encryption type + * @param IP_Addr : Got IP Address + * @param IP_Mask : Network IP mask + * @param Gateway_Addr : Gateway IP address + * @param MAC : pointer to MAC Address + * @retval Operation status + */ +WIFI_Status_t WIFI_Connect( + const char* SSID, + const char* Password, + WIFI_Ecn_t ecn) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(ES_WIFI_Connect(&EsWifiObj, SSID, Password, (ES_WIFI_SecurityType_t) ecn) == ES_WIFI_STATUS_OK) + { + if(ES_WIFI_GetNetworkSettings(&EsWifiObj) == ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + + } + return ret; +} + +/** + * @brief This function retrieves the WiFi interface's MAC address. + * @retval Operation Status. + */ +WIFI_Status_t WIFI_GetMAC_Address(uint8_t *mac) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(ES_WIFI_GetMACAddress(&EsWifiObj, mac) == ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + return ret; +} + +/** + * @brief This function retrieves the WiFi interface's IP address. + * @retval Operation Status. + */ +WIFI_Status_t WIFI_GetIP_Address (uint8_t *ipaddr) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(EsWifiObj.NetSettings.IsConnected) + { + memcpy(ipaddr, EsWifiObj.NetSettings.IP_Addr, 4); + ret = WIFI_STATUS_OK; + } + return ret; +} + +/** + * @brief Disconnect from a network + * @param None + * @retval Operation status + */ +WIFI_Status_t WIFI_Disconnect(void) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + if( ES_WIFI_Disconnect(&EsWifiObj)== ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + + return ret; +} + +/** + * @brief Configure an Access Point + + * @param ssid : SSID string + * @param pass : Password string + * @param ecn : Encryption type + * @param channel : channel number + * @param max_conn : Max allowed connections + * @retval Operation status + */ +WIFI_Status_t WIFI_ConfigureAP(uint8_t *ssid, uint8_t *pass, WIFI_Ecn_t ecn, uint8_t channel, uint8_t max_conn) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + ES_WIFI_APConfig_t ApConfig; + + strncpy((char*)ApConfig.SSID, (char*)ssid, ES_WIFI_MAX_SSID_NAME_SIZE); + strncpy((char*)ApConfig.Pass, (char*)pass, ES_WIFI_MAX_PSWD_NAME_SIZE); + ApConfig.Channel = channel; + ApConfig.MaxConnections = WIFI_MAX_CONNECTED_STATIONS; + ApConfig.Security = (ES_WIFI_SecurityType_t)ecn; + + if(ES_WIFI_ActivateAP(&EsWifiObj, &ApConfig) == ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + return ret; +} + +/** + * @brief Handle the background events of the wifi module + + * @retval None +*/ +WIFI_Status_t WIFI_HandleAPEvents(WIFI_APSettings_t *setting) +{ + WIFI_Status_t ret = WIFI_STATUS_OK; + ES_WIFI_APState_t State; + + State= ES_WIFI_WaitAPStateChange(&EsWifiObj); + + switch (State) + { + case ES_WIFI_AP_ASSIGNED: + memcpy(setting->IP_Addr, EsWifiObj.APSettings.IP_Addr, 4); + memcpy(setting->MAC_Addr, EsWifiObj.APSettings.MAC_Addr, 6); + ret = WIFI_STATUS_ASSIGNED; + break; + + case ES_WIFI_AP_JOINED: + strncpy((char *)setting->SSID, (char *)EsWifiObj.APSettings.SSID, WIFI_MAX_SSID_NAME); + memcpy(setting->IP_Addr, EsWifiObj.APSettings.IP_Addr, 4); + ret = WIFI_STATUS_JOINED; + break; + + case ES_WIFI_AP_ERROR: + ret = WIFI_STATUS_ERROR; + break; + + default: + break; + } + + return ret; +} + +/** + * @brief Ping an IP address in the network + * @param ipaddr : array of the IP address + * @retval Operation status + */ +WIFI_Status_t WIFI_Ping(uint8_t* ipaddr, uint16_t count, uint16_t interval_ms) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(ES_WIFI_Ping(&EsWifiObj, ipaddr, count, interval_ms) == ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + return ret; +} + +/** + * @brief Get IP address from URL using DNS + * @param location : Host URL + * @param ipaddr : array of the IP address + * @retval Operation status + */ +WIFI_Status_t WIFI_GetHostAddress( char* location, uint8_t* ipaddr) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if (ES_WIFI_DNS_LookUp(&EsWifiObj, location, ipaddr) == ES_WIFI_STATUS_OK) + { + return WIFI_STATUS_OK; + } + + return ret; +} +/** + * @brief Configure and start a client connection + * @param type : Connection type TCP/UDP + * @param name : name of the connection + * @param ipaddr : Client IP address + * @param port : Remote port + * @param local_port : Local port + * @retval Operation status + */ +WIFI_Status_t WIFI_OpenClientConnection(uint32_t socket, WIFI_Protocol_t type, const char* name, uint8_t* ipaddr, uint16_t port, uint16_t local_port) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + ES_WIFI_Conn_t conn; + + conn.Number = socket; + conn.RemotePort = port; + conn.LocalPort = local_port; + conn.Type = (type == WIFI_TCP_PROTOCOL)? ES_WIFI_TCP_CONNECTION : ES_WIFI_UDP_CONNECTION; + conn.RemoteIP[0] = ipaddr[0]; + conn.RemoteIP[1] = ipaddr[1]; + conn.RemoteIP[2] = ipaddr[2]; + conn.RemoteIP[3] = ipaddr[3]; + if(ES_WIFI_StartClientConnection(&EsWifiObj, &conn)== ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + return ret; +} + +/** + * @brief Close client connection + * @param type : Connection type TCP/UDP + * @param name : name of the connection + * @param location : Client address + * @param port : Remote port + * @param local_port : Local port + * @retval Operation status + */ +WIFI_Status_t WIFI_CloseClientConnection(uint32_t socket) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + ES_WIFI_Conn_t conn; + conn.Number = socket; + + if(ES_WIFI_StopClientConnection(&EsWifiObj, &conn)== ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + return ret; +} + +/** + * @brief Configure and start a Server + * @param type : Connection type TCP/UDP + * @param name : name of the connection + * @param port : Remote port + * @retval Operation status + */ +WIFI_Status_t WIFI_StartServer(uint32_t socket, WIFI_Protocol_t protocol, const char* name, uint16_t port) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + ES_WIFI_Conn_t conn; + conn.Number = socket; + conn.LocalPort = port; + conn.Type = (protocol == WIFI_TCP_PROTOCOL)? ES_WIFI_TCP_CONNECTION : ES_WIFI_UDP_CONNECTION; + if(ES_WIFI_StartServerSingleConn(&EsWifiObj, &conn)== ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + return ret; +} + +/** + * @brief Stop a server + * @retval Operation status + */ +WIFI_Status_t WIFI_StopServer(uint32_t socket) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(ES_WIFI_StopServerSingleConn(&EsWifiObj)== ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + return ret; +} +/** + * @brief Send Data on a socket + * @param pdata : pointer to data to be sent + * @param len : length of data to be sent + * @retval Operation status + */ +WIFI_Status_t WIFI_SendData(uint8_t socket, uint8_t *pdata, uint16_t Reqlen, uint16_t *SentDatalen, uint32_t Timeout) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(ES_WIFI_SendData(&EsWifiObj, socket, pdata, Reqlen, SentDatalen, Timeout) == ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + + return ret; +} + +/** + * @brief Receive Data from a socket + * @param pdata : pointer to Rx buffer + * @param *len : pointer to length of data + * @retval Operation status + */ +WIFI_Status_t WIFI_ReceiveData(uint8_t socket, uint8_t *pdata, uint16_t Reqlen, uint16_t *RcvDatalen, uint32_t Timeout) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(ES_WIFI_ReceiveData(&EsWifiObj, socket, pdata, Reqlen, RcvDatalen, Timeout) == ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + return ret; +} + +/** + * @brief Customize module data + * @param name : MFC name + * @param Mac : Mac Address + * @retval Operation status + */ +WIFI_Status_t WIFI_SetOEMProperties(const char *name, uint8_t *Mac) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(ES_WIFI_SetProductName(&EsWifiObj, (uint8_t *)name) == ES_WIFI_STATUS_OK) + { + if(ES_WIFI_SetMACAddress(&EsWifiObj, Mac) == ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + } + return ret; +} + +/** + * @brief Reset the WIFI module + * @retval Operation status + */ +WIFI_Status_t WIFI_ResetModule(void) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(ES_WIFI_ResetModule(&EsWifiObj) == ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + return ret; +} + +/** + * @brief Restore module default configuration + * @retval Operation status + */ +WIFI_Status_t WIFI_SetModuleDefault(void) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(ES_WIFI_ResetToFactoryDefault(&EsWifiObj) == ES_WIFI_STATUS_OK) + { + ret = WIFI_STATUS_OK; + } + return ret; +} + + +/** + * @brief Update module firmware + * @param location : Binary Location IP address + * @retval Operation status + */ +WIFI_Status_t WIFI_ModuleFirmwareUpdate(const char *location) +{ + return WIFI_STATUS_NOT_SUPPORTED; +} + +/** + * @brief Return Module firmware revision + * @param rev : revision string + * @retval Operation status + */ +WIFI_Status_t WIFI_GetModuleFwRevision(char *rev) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(EsWifiObj.FW_Rev != NULL) + { + strncpy(rev, (char *)EsWifiObj.FW_Rev, ES_WIFI_FW_REV_SIZE); + ret = WIFI_STATUS_OK; + } + return ret; +} + +/** + * @brief Return Module ID + * @param Info : Module ID string + * @retval Operation status + */ +WIFI_Status_t WIFI_GetModuleID(char *Id) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(EsWifiObj.Product_ID != NULL) + { + strncpy(Id, (char *)EsWifiObj.Product_ID, ES_WIFI_PRODUCT_ID_SIZE); + ret = WIFI_STATUS_OK; + } + return ret; +} + +/** + * @brief Return Module Name + * @param Info : Module Name string + * @retval Operation status + */ +WIFI_Status_t WIFI_GetModuleName(char *ModuleName) +{ + WIFI_Status_t ret = WIFI_STATUS_ERROR; + + if(EsWifiObj.Product_Name != NULL) + { + strncpy(ModuleName, (char *)EsWifiObj.Product_Name, ES_WIFI_PRODUCT_NAME_SIZE); + ret = WIFI_STATUS_OK; + } + return ret; +} +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ +