DISCO_L475VG_IOT01-wifi_http_server

Dependencies:   DISCO_L475VG_IOT01A_wifi

Committer:
anoney180133
Date:
Fri Feb 07 10:03:33 2020 +0000
Revision:
0:4fd399f090f3
DISCO_L475VG_IOT01-wifi_http_server

Who changed what in which revision?

UserRevisionLine numberNew contents of line
anoney180133 0:4fd399f090f3 1 #include "mbed.h"
anoney180133 0:4fd399f090f3 2 #include "wifi.h"
anoney180133 0:4fd399f090f3 3 /*------------------------------------------------------------------------------
anoney180133 0:4fd399f090f3 4 Hyperterminal settings: 115200 bauds, 8-bit data, no parity
anoney180133 0:4fd399f090f3 5
anoney180133 0:4fd399f090f3 6 This example
anoney180133 0:4fd399f090f3 7 - connects to a wifi network (SSID & PWD to set in mbed_app.json)
anoney180133 0:4fd399f090f3 8 - displays the IP address and creates a web page
anoney180133 0:4fd399f090f3 9 - then connect on its IP address on the same wifi network with another device
anoney180133 0:4fd399f090f3 10 - Now able to change the led status and read the temperature
anoney180133 0:4fd399f090f3 11
anoney180133 0:4fd399f090f3 12 This example uses SPI3 ( PE_0 PC_10 PC_12 PC_11), wifi_wakeup pin (PB_13),
anoney180133 0:4fd399f090f3 13 wifi_dataready pin (PE_1), wifi reset pin (PE_8)
anoney180133 0:4fd399f090f3 14 ------------------------------------------------------------------------------*/
anoney180133 0:4fd399f090f3 15
anoney180133 0:4fd399f090f3 16 /* Private defines -----------------------------------------------------------*/
anoney180133 0:4fd399f090f3 17 #define WIFI_WRITE_TIMEOUT 10000
anoney180133 0:4fd399f090f3 18 #define WIFI_READ_TIMEOUT 10000
anoney180133 0:4fd399f090f3 19 #define PORT 80
anoney180133 0:4fd399f090f3 20
anoney180133 0:4fd399f090f3 21 /* Private typedef------------------------------------------------------------*/
anoney180133 0:4fd399f090f3 22 typedef enum
anoney180133 0:4fd399f090f3 23 {
anoney180133 0:4fd399f090f3 24 WS_IDLE = 0,
anoney180133 0:4fd399f090f3 25 WS_CONNECTED,
anoney180133 0:4fd399f090f3 26 WS_DISCONNECTED,
anoney180133 0:4fd399f090f3 27 WS_ERROR,
anoney180133 0:4fd399f090f3 28 } WebServerState_t;
anoney180133 0:4fd399f090f3 29
anoney180133 0:4fd399f090f3 30 /* Private macro -------------------------------------------------------------*/
anoney180133 0:4fd399f090f3 31 static int wifi_sample_run(void);
anoney180133 0:4fd399f090f3 32 static void WebServerProcess(void);
anoney180133 0:4fd399f090f3 33 static WIFI_Status_t SendWebPage(uint8_t ledIsOn, float temperature);
anoney180133 0:4fd399f090f3 34 /* Private variables ---------------------------------------------------------*/
anoney180133 0:4fd399f090f3 35 Serial pc(SERIAL_TX, SERIAL_RX);
anoney180133 0:4fd399f090f3 36 static uint8_t http[1024];
anoney180133 0:4fd399f090f3 37 static uint8_t resp[1024];
anoney180133 0:4fd399f090f3 38 uint16_t respLen;
anoney180133 0:4fd399f090f3 39 uint8_t IP_Addr[4];
anoney180133 0:4fd399f090f3 40 uint8_t MAC_Addr[6];
anoney180133 0:4fd399f090f3 41 int32_t Socket = -1;
anoney180133 0:4fd399f090f3 42 static WebServerState_t State = WS_ERROR;
anoney180133 0:4fd399f090f3 43 char ModuleName[32];
anoney180133 0:4fd399f090f3 44 DigitalOut led(LED2);
anoney180133 0:4fd399f090f3 45 AnalogIn adc_temp(ADC_TEMP);
anoney180133 0:4fd399f090f3 46
anoney180133 0:4fd399f090f3 47 int main()
anoney180133 0:4fd399f090f3 48 {
anoney180133 0:4fd399f090f3 49 int ret = 0;
anoney180133 0:4fd399f090f3 50 led = 0;
anoney180133 0:4fd399f090f3 51 pc.baud(115200);
anoney180133 0:4fd399f090f3 52 printf("\n");
anoney180133 0:4fd399f090f3 53 printf("************************************************************\n");
anoney180133 0:4fd399f090f3 54 printf("*** STM32 IoT Discovery kit for STM32L475 MCU ***\n");
anoney180133 0:4fd399f090f3 55 printf("*** WIFI Web Server demonstration ***\n\n");
anoney180133 0:4fd399f090f3 56 printf("*** Copy the IP address on another device connected ***\n");
anoney180133 0:4fd399f090f3 57 printf("*** to the wifi network ***\n");
anoney180133 0:4fd399f090f3 58 printf("*** Read the temperature and update the LED status ***\n");
anoney180133 0:4fd399f090f3 59 printf("************************************************************\n");
anoney180133 0:4fd399f090f3 60
anoney180133 0:4fd399f090f3 61 /* Working application */
anoney180133 0:4fd399f090f3 62 ret = wifi_sample_run();
anoney180133 0:4fd399f090f3 63
anoney180133 0:4fd399f090f3 64 if (ret != 0) {
anoney180133 0:4fd399f090f3 65 return -1;
anoney180133 0:4fd399f090f3 66 }
anoney180133 0:4fd399f090f3 67
anoney180133 0:4fd399f090f3 68
anoney180133 0:4fd399f090f3 69 while(1) {
anoney180133 0:4fd399f090f3 70 WebServerProcess ();
anoney180133 0:4fd399f090f3 71 }
anoney180133 0:4fd399f090f3 72
anoney180133 0:4fd399f090f3 73 }
anoney180133 0:4fd399f090f3 74
anoney180133 0:4fd399f090f3 75
anoney180133 0:4fd399f090f3 76 int wifi_sample_run(void)
anoney180133 0:4fd399f090f3 77 {
anoney180133 0:4fd399f090f3 78
anoney180133 0:4fd399f090f3 79 /*Initialize and use WIFI module */
anoney180133 0:4fd399f090f3 80 if(WIFI_Init() == WIFI_STATUS_OK) {
anoney180133 0:4fd399f090f3 81 printf("ES-WIFI Initialized.\n");
anoney180133 0:4fd399f090f3 82
anoney180133 0:4fd399f090f3 83 if(WIFI_GetMAC_Address(MAC_Addr) == WIFI_STATUS_OK) {
anoney180133 0:4fd399f090f3 84 printf("> es-wifi module MAC Address : %X:%X:%X:%X:%X:%X\n",
anoney180133 0:4fd399f090f3 85 MAC_Addr[0],
anoney180133 0:4fd399f090f3 86 MAC_Addr[1],
anoney180133 0:4fd399f090f3 87 MAC_Addr[2],
anoney180133 0:4fd399f090f3 88 MAC_Addr[3],
anoney180133 0:4fd399f090f3 89 MAC_Addr[4],
anoney180133 0:4fd399f090f3 90 MAC_Addr[5]);
anoney180133 0:4fd399f090f3 91 } else {
anoney180133 0:4fd399f090f3 92 printf("> ERROR : CANNOT get MAC address\n");
anoney180133 0:4fd399f090f3 93 }
anoney180133 0:4fd399f090f3 94
anoney180133 0:4fd399f090f3 95 if( WIFI_Connect(MBED_CONF_APP_WIFI_SSID, MBED_CONF_APP_WIFI_PASSWORD, WIFI_ECN_WPA2_PSK) == WIFI_STATUS_OK) {
anoney180133 0:4fd399f090f3 96 printf("> es-wifi module connected \n");
anoney180133 0:4fd399f090f3 97
anoney180133 0:4fd399f090f3 98 if(WIFI_GetIP_Address(IP_Addr) == WIFI_STATUS_OK) {
anoney180133 0:4fd399f090f3 99 printf("> es-wifi module got IP Address : %d.%d.%d.%d\n",
anoney180133 0:4fd399f090f3 100 IP_Addr[0],
anoney180133 0:4fd399f090f3 101 IP_Addr[1],
anoney180133 0:4fd399f090f3 102 IP_Addr[2],
anoney180133 0:4fd399f090f3 103 IP_Addr[3]);
anoney180133 0:4fd399f090f3 104
anoney180133 0:4fd399f090f3 105 printf(">Start HTTP Server... \n");
anoney180133 0:4fd399f090f3 106 printf(">Wait for connection... \n");
anoney180133 0:4fd399f090f3 107 State = WS_IDLE;
anoney180133 0:4fd399f090f3 108 } else {
anoney180133 0:4fd399f090f3 109 printf("> ERROR : es-wifi module CANNOT get IP address\n");
anoney180133 0:4fd399f090f3 110 return -1;
anoney180133 0:4fd399f090f3 111 }
anoney180133 0:4fd399f090f3 112 } else {
anoney180133 0:4fd399f090f3 113 printf("> ERROR : es-wifi module NOT connected\n");
anoney180133 0:4fd399f090f3 114 return -1;
anoney180133 0:4fd399f090f3 115 }
anoney180133 0:4fd399f090f3 116 } else {
anoney180133 0:4fd399f090f3 117 printf("> ERROR : WIFI Module cannot be initialized.\n");
anoney180133 0:4fd399f090f3 118 return -1;
anoney180133 0:4fd399f090f3 119 }
anoney180133 0:4fd399f090f3 120 return 0;
anoney180133 0:4fd399f090f3 121 }
anoney180133 0:4fd399f090f3 122
anoney180133 0:4fd399f090f3 123 /**
anoney180133 0:4fd399f090f3 124 * @brief Send HTML page
anoney180133 0:4fd399f090f3 125 * @param None
anoney180133 0:4fd399f090f3 126 * @retval None
anoney180133 0:4fd399f090f3 127 */
anoney180133 0:4fd399f090f3 128 static void WebServerProcess(void)
anoney180133 0:4fd399f090f3 129 {
anoney180133 0:4fd399f090f3 130 uint8_t LedState = 0;
anoney180133 0:4fd399f090f3 131 float temp;
anoney180133 0:4fd399f090f3 132 switch(State)
anoney180133 0:4fd399f090f3 133 {
anoney180133 0:4fd399f090f3 134 case WS_IDLE:
anoney180133 0:4fd399f090f3 135 Socket = 0;
anoney180133 0:4fd399f090f3 136 WIFI_StartServer(Socket, WIFI_TCP_PROTOCOL, "", PORT);
anoney180133 0:4fd399f090f3 137
anoney180133 0:4fd399f090f3 138 if(Socket != -1)
anoney180133 0:4fd399f090f3 139 {
anoney180133 0:4fd399f090f3 140 printf("> HTTP Server Started \n");
anoney180133 0:4fd399f090f3 141 State = WS_CONNECTED;
anoney180133 0:4fd399f090f3 142 }
anoney180133 0:4fd399f090f3 143 else
anoney180133 0:4fd399f090f3 144 {
anoney180133 0:4fd399f090f3 145 printf("> ERROR : Connection cannot be established.\n");
anoney180133 0:4fd399f090f3 146 State = WS_ERROR;
anoney180133 0:4fd399f090f3 147 }
anoney180133 0:4fd399f090f3 148 break;
anoney180133 0:4fd399f090f3 149
anoney180133 0:4fd399f090f3 150 case WS_CONNECTED:
anoney180133 0:4fd399f090f3 151
anoney180133 0:4fd399f090f3 152 WIFI_ReceiveData(Socket, resp, 1200, &respLen, WIFI_READ_TIMEOUT);
anoney180133 0:4fd399f090f3 153
anoney180133 0:4fd399f090f3 154 if( respLen > 0)
anoney180133 0:4fd399f090f3 155 {
anoney180133 0:4fd399f090f3 156 if(strstr((char *)resp, "GET")) /* GET: put web page */
anoney180133 0:4fd399f090f3 157 {
anoney180133 0:4fd399f090f3 158 temp = (adc_temp.read()*100);
anoney180133 0:4fd399f090f3 159 if(SendWebPage(LedState, temp) != WIFI_STATUS_OK)
anoney180133 0:4fd399f090f3 160 {
anoney180133 0:4fd399f090f3 161 printf("> ERROR : Cannot send web page\n");
anoney180133 0:4fd399f090f3 162 State = WS_ERROR;
anoney180133 0:4fd399f090f3 163 }
anoney180133 0:4fd399f090f3 164 }
anoney180133 0:4fd399f090f3 165 else if(strstr((char *)resp, "POST"))/* POST: received info */
anoney180133 0:4fd399f090f3 166 {
anoney180133 0:4fd399f090f3 167 if(strstr((char *)resp, "radio"))
anoney180133 0:4fd399f090f3 168 {
anoney180133 0:4fd399f090f3 169 if(strstr((char *)resp, "radio=0"))
anoney180133 0:4fd399f090f3 170 {
anoney180133 0:4fd399f090f3 171 LedState = 0;
anoney180133 0:4fd399f090f3 172 led = 0;
anoney180133 0:4fd399f090f3 173 }
anoney180133 0:4fd399f090f3 174 else if(strstr((char *)resp, "radio=1"))
anoney180133 0:4fd399f090f3 175 {
anoney180133 0:4fd399f090f3 176 LedState = 1;
anoney180133 0:4fd399f090f3 177 led = 1;
anoney180133 0:4fd399f090f3 178 }
anoney180133 0:4fd399f090f3 179
anoney180133 0:4fd399f090f3 180 temp = (adc_temp.read()*100);
anoney180133 0:4fd399f090f3 181 if(SendWebPage(LedState, temp) != WIFI_STATUS_OK)
anoney180133 0:4fd399f090f3 182 {
anoney180133 0:4fd399f090f3 183 printf("> ERROR : Cannot send web page\n");
anoney180133 0:4fd399f090f3 184 State = WS_ERROR;
anoney180133 0:4fd399f090f3 185 }
anoney180133 0:4fd399f090f3 186 }
anoney180133 0:4fd399f090f3 187 }
anoney180133 0:4fd399f090f3 188 }
anoney180133 0:4fd399f090f3 189 if(WIFI_StopServer(Socket) == WIFI_STATUS_OK)
anoney180133 0:4fd399f090f3 190 {
anoney180133 0:4fd399f090f3 191 WIFI_StartServer(Socket, WIFI_TCP_PROTOCOL, "", PORT);
anoney180133 0:4fd399f090f3 192 }
anoney180133 0:4fd399f090f3 193 else
anoney180133 0:4fd399f090f3 194 {
anoney180133 0:4fd399f090f3 195 State = WS_ERROR;
anoney180133 0:4fd399f090f3 196 }
anoney180133 0:4fd399f090f3 197 break;
anoney180133 0:4fd399f090f3 198 case WS_ERROR:
anoney180133 0:4fd399f090f3 199 default:
anoney180133 0:4fd399f090f3 200 break;
anoney180133 0:4fd399f090f3 201 }
anoney180133 0:4fd399f090f3 202 }
anoney180133 0:4fd399f090f3 203
anoney180133 0:4fd399f090f3 204
anoney180133 0:4fd399f090f3 205 /**
anoney180133 0:4fd399f090f3 206 * @brief Send HTML page
anoney180133 0:4fd399f090f3 207 * @param None
anoney180133 0:4fd399f090f3 208 * @retval None
anoney180133 0:4fd399f090f3 209 */
anoney180133 0:4fd399f090f3 210 static WIFI_Status_t SendWebPage(uint8_t ledIsOn, float temperature)
anoney180133 0:4fd399f090f3 211 {
anoney180133 0:4fd399f090f3 212 uint8_t temp[50];
anoney180133 0:4fd399f090f3 213 uint16_t SentDataLength;
anoney180133 0:4fd399f090f3 214 WIFI_Status_t ret;
anoney180133 0:4fd399f090f3 215
anoney180133 0:4fd399f090f3 216 /* construct web page content */
anoney180133 0:4fd399f090f3 217 strcpy((char *)http, (char *)"HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nPragma: no-cache\r\n\r\n");
anoney180133 0:4fd399f090f3 218 strcat((char *)http, (char *)"<html>\r\n<body>\r\n");
anoney180133 0:4fd399f090f3 219 strcat((char *)http, (char *)"<title>STM32 Web Server</title>\r\n");
anoney180133 0:4fd399f090f3 220 strcat((char *)http, (char *)"<h2>InventekSys : Web Server using Es-Wifi with STM32</h2>\r\n");
anoney180133 0:4fd399f090f3 221 strcat((char *)http, (char *)"<br /><hr>\r\n");
anoney180133 0:4fd399f090f3 222 strcat((char *)http, (char *)"<p><form method=\"POST\"><strong>Temp: <input type=\"text\" size=2 value=\"");
anoney180133 0:4fd399f090f3 223 sprintf((char *)temp, "%f", temperature);
anoney180133 0:4fd399f090f3 224 strcat((char *)http, (char *)temp);
anoney180133 0:4fd399f090f3 225 strcat((char *)http, (char *)"\"> <sup>O</sup>C");
anoney180133 0:4fd399f090f3 226
anoney180133 0:4fd399f090f3 227 if (ledIsOn)
anoney180133 0:4fd399f090f3 228 {
anoney180133 0:4fd399f090f3 229 strcat((char *)http, (char *)"<p><input type=\"radio\" name=\"radio\" value=\"0\" >LED off");
anoney180133 0:4fd399f090f3 230 strcat((char *)http, (char *)"<br><input type=\"radio\" name=\"radio\" value=\"1\" checked>LED on");
anoney180133 0:4fd399f090f3 231 }
anoney180133 0:4fd399f090f3 232 else
anoney180133 0:4fd399f090f3 233 {
anoney180133 0:4fd399f090f3 234 strcat((char *)http, (char *)"<p><input type=\"radio\" name=\"radio\" value=\"0\" checked>LED off");
anoney180133 0:4fd399f090f3 235 strcat((char *)http, (char *)"<br><input type=\"radio\" name=\"radio\" value=\"1\" >LED on");
anoney180133 0:4fd399f090f3 236 }
anoney180133 0:4fd399f090f3 237
anoney180133 0:4fd399f090f3 238 strcat((char *)http, (char *)"</strong><p><input type=\"submit\"></form></span>");
anoney180133 0:4fd399f090f3 239 strcat((char *)http, (char *)"</body>\r\n</html>\r\n");
anoney180133 0:4fd399f090f3 240
anoney180133 0:4fd399f090f3 241 ret = WIFI_SendData(0, (uint8_t *)http, strlen((char *)http), &SentDataLength, WIFI_WRITE_TIMEOUT);
anoney180133 0:4fd399f090f3 242
anoney180133 0:4fd399f090f3 243 if((ret == WIFI_STATUS_OK) && (SentDataLength != strlen((char *)http)))
anoney180133 0:4fd399f090f3 244 {
anoney180133 0:4fd399f090f3 245 ret = WIFI_STATUS_ERROR;
anoney180133 0:4fd399f090f3 246 }
anoney180133 0:4fd399f090f3 247
anoney180133 0:4fd399f090f3 248 return ret;
anoney180133 0:4fd399f090f3 249 }