WIFI HTTP SERVER example for DISCO_L475VG_IOT1A board using ST BSP WIFI module driver.

Dependencies:   DISCO_L475VG_IOT01A_wifi

To use this example with mbed online compiler

you have to

- Set your SSID and PASSWORD in mbed_app.json

- Have an hyperterminal set with 115200 bauds, 8-bit data, no parity, 1 stop bit

- compile for DISCO-L475VG-IOT1A platform

- load the binary file on the platform

Hyperterminal will display the following message

/media/uploads/adustm/wifi_hyperterminal_1.jpg

- Connect another device on this wifi network, open a web browser on this IP address (here 192.168.1.100)

- You will see on the hyperterminal that the server is started

/media/uploads/adustm/wifi_hyperterminal_2.jpg

and your web browser will display

/media/uploads/adustm/wifi_client.png

You can send orders on the web page to switch on and off the led by clicking on 'Valider' button

To use this example with mbed cli (offline)

type

mbed import http://mbed.org/teams/ST/code/DISCO_L475VG_IOT01-wifi_http_server/
cd DISCO_L475VG_IOT01-wifi_http_server/

edit the mbed_apps.json with your wifi-SSID and wifi-PASS type

mbed compile -m DISCO_L475VG_IOT01A -t GCC_ARM

Load the binary file on the platform (drag and drop from the DISCO_L475VG_IOT01-wifi_http_server/BUILD/DISCO_L475VG_IOT01A/GCC_ARM/ directory)

main.cpp

Committer:
adustm
Date:
2017-08-17
Revision:
1:a544e9eba8fb
Parent:
0:c301ccc87f5b

File content as of revision 1:a544e9eba8fb:

#include "mbed.h"
#include "wifi.h"
/*------------------------------------------------------------------------------
Hyperterminal settings: 115200 bauds, 8-bit data, no parity

This example 
  - connects to a wifi network (SSID & PWD to set in mbed_app.json)
  - displays the IP address and creates a web page
  - then connect on its IP address on the same wifi network with another device
  - Now able to change the led status and read the temperature

This example uses SPI3 ( PE_0 PC_10 PC_12 PC_11), wifi_wakeup pin (PB_13), 
wifi_dataready pin (PE_1), wifi reset pin (PE_8)
------------------------------------------------------------------------------*/

/* Private defines -----------------------------------------------------------*/
#define WIFI_WRITE_TIMEOUT 10000
#define WIFI_READ_TIMEOUT  10000
#define PORT           80

/* Private typedef------------------------------------------------------------*/
typedef enum
{
  WS_IDLE = 0,
  WS_CONNECTED,
  WS_DISCONNECTED,
  WS_ERROR,
} WebServerState_t;

/* Private macro -------------------------------------------------------------*/
static int wifi_sample_run(void);
static void WebServerProcess(void);
static WIFI_Status_t SendWebPage(uint8_t ledIsOn, float temperature);
/* Private variables ---------------------------------------------------------*/
Serial pc(SERIAL_TX, SERIAL_RX);
static   uint8_t http[1024];
static   uint8_t resp[1024];
uint16_t respLen;
uint8_t  IP_Addr[4]; 
uint8_t  MAC_Addr[6]; 
int32_t Socket = -1;
static   WebServerState_t  State = WS_ERROR;
char     ModuleName[32];
DigitalOut led(LED2);
AnalogIn adc_temp(ADC_TEMP);

int main()
{
    int ret = 0;
    led = 0;
    pc.baud(115200);
    printf("\n");
    printf("************************************************************\n");
    printf("***   STM32 IoT Discovery kit for STM32L475 MCU          ***\n");
    printf("***         WIFI Web Server demonstration                ***\n\n");
    printf("*** Copy the IP address on another device connected      ***\n");
    printf("*** to the wifi network                                  ***\n");
    printf("*** Read the temperature and update the LED status       ***\n");
    printf("************************************************************\n");
    
    /* Working application */
    ret = wifi_sample_run();
    
    if (ret != 0) {
        return -1;
    }

    
    while(1) {
        WebServerProcess ();
    }

}


int wifi_sample_run(void)
{
  
    /*Initialize and use WIFI module */
    if(WIFI_Init() ==  WIFI_STATUS_OK) {
        printf("ES-WIFI Initialized.\n");
    
        if(WIFI_GetMAC_Address(MAC_Addr) == WIFI_STATUS_OK) {       
            printf("> es-wifi module MAC Address : %X:%X:%X:%X:%X:%X\n",     
                   MAC_Addr[0],
                   MAC_Addr[1],
                   MAC_Addr[2],
                   MAC_Addr[3],
                   MAC_Addr[4],
                   MAC_Addr[5]);   
        } else {
            printf("> ERROR : CANNOT get MAC address\n");
        }
    
        if( WIFI_Connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, WIFI_ECN_WPA2_PSK) == WIFI_STATUS_OK) {
            printf("> es-wifi module connected \n");
      
            if(WIFI_GetIP_Address(IP_Addr) == WIFI_STATUS_OK) {
                printf("> es-wifi module got IP Address : %d.%d.%d.%d\n",     
                       IP_Addr[0],
                       IP_Addr[1],
                       IP_Addr[2],
                       IP_Addr[3]); 
        
                printf(">Start HTTP Server... \n");
                printf(">Wait for connection...  \n");
                State = WS_IDLE;
            } else {    
                printf("> ERROR : es-wifi module CANNOT get IP address\n");
                return -1;
            }
        } else {
            printf("> ERROR : es-wifi module NOT connected\n");
            return -1;
        }
    } else {
        printf("> ERROR : WIFI Module cannot be initialized.\n"); 
        return -1;
    }
    return 0;
}

/**
  * @brief  Send HTML page
  * @param  None
  * @retval None
  */
static void WebServerProcess(void)
{
  uint8_t LedState = 0;
  float temp;
  switch(State)
  {
  case WS_IDLE:
    Socket = 0;
    WIFI_StartServer(Socket, WIFI_TCP_PROTOCOL, "", PORT);
    
    if(Socket != -1)
    {
      printf("> HTTP Server Started \n");  
      State = WS_CONNECTED;
    }
    else
    {
      printf("> ERROR : Connection cannot be established.\n"); 
      State = WS_ERROR;
    }    
    break;
    
  case WS_CONNECTED:
    
    WIFI_ReceiveData(Socket, resp, 1200, &respLen, WIFI_READ_TIMEOUT);
    
    if( respLen > 0)
    {
      if(strstr((char *)resp, "GET")) /* GET: put web page */
      {
        temp = (adc_temp.read()*100);
        if(SendWebPage(LedState, temp) != WIFI_STATUS_OK)
        {
          printf("> ERROR : Cannot send web page\n");
          State = WS_ERROR;
        }
      }
      else if(strstr((char *)resp, "POST"))/* POST: received info */
      {
          if(strstr((char *)resp, "radio"))
          {          
            if(strstr((char *)resp, "radio=0"))
            {
              LedState = 0;
              led = 0;
            }
            else if(strstr((char *)resp, "radio=1"))
            {
              LedState = 1;
              led = 1;
            } 
            
           temp = (adc_temp.read()*100);
            if(SendWebPage(LedState, temp) != WIFI_STATUS_OK)
            {
              printf("> ERROR : Cannot send web page\n");
              State = WS_ERROR;
          }
        }
      }
    }
    if(WIFI_StopServer(Socket) == WIFI_STATUS_OK)
    {
      WIFI_StartServer(Socket, WIFI_TCP_PROTOCOL, "", PORT);
    }
    else
    {
      State = WS_ERROR;  
    }
    break;
  case WS_ERROR:   
  default:
    break;
  }
}


/**
  * @brief  Send HTML page
  * @param  None
  * @retval None
  */
static WIFI_Status_t SendWebPage(uint8_t ledIsOn, float temperature)
{
  uint8_t  temp[50];
  uint16_t SentDataLength;
  WIFI_Status_t ret;
  
  /* construct web page content */
  strcpy((char *)http, (char *)"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n");
  strcat((char *)http, (char *)"<html>\r\n<body>\r\n");
  strcat((char *)http, (char *)"<title>STM32 Web Server</title>\r\n");
  strcat((char *)http, (char *)"<h2>InventekSys : Web Server using Es-Wifi with STM32</h2>\r\n");
  strcat((char *)http, (char *)"<br /><hr>\r\n");
  strcat((char *)http, (char *)"<p><form method=\"POST\"><strong>Temp: <input type=\"text\" size=2 value=\"");
  sprintf((char *)temp, "%f", temperature);
  strcat((char *)http, (char *)temp);
  strcat((char *)http, (char *)"\"> <sup>O</sup>C");
  
  if (ledIsOn) 
  {
    strcat((char *)http, (char *)"<p><input type=\"radio\" name=\"radio\" value=\"0\" >LED off");
    strcat((char *)http, (char *)"<br><input type=\"radio\" name=\"radio\" value=\"1\" checked>LED on");
  } 
  else 
  {
    strcat((char *)http, (char *)"<p><input type=\"radio\" name=\"radio\" value=\"0\" checked>LED off");
    strcat((char *)http, (char *)"<br><input type=\"radio\" name=\"radio\" value=\"1\" >LED on");
  }

  strcat((char *)http, (char *)"</strong><p><input type=\"submit\"></form></span>");
  strcat((char *)http, (char *)"</body>\r\n</html>\r\n");
  
  ret = WIFI_SendData(0, (uint8_t *)http, strlen((char *)http), &SentDataLength, WIFI_WRITE_TIMEOUT); 
  
  if((ret == WIFI_STATUS_OK) && (SentDataLength != strlen((char *)http)))
  {
    ret = WIFI_STATUS_ERROR;
  }
    
  return ret;
}