test_server

Dependencies:   DISCO_L475VG_IOT01A_wifi

Committer:
adustm
Date:
Thu Aug 17 15:38:01 2017 +0000
Revision:
1:a544e9eba8fb
Parent:
0:c301ccc87f5b
change ssid password

Who changed what in which revision?

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