Hiroaki Okoshi / Mbed OS http-webserver-example-mbed-os-5-odin-w2
Committer:
Hiroaki_Okoshi
Date:
Sat Oct 09 14:23:23 2021 +0000
Revision:
0:a21b8a29df03
Sample web server via WiFi program. for mbed os 5.15

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Hiroaki_Okoshi 0:a21b8a29df03 1 /* WiFi Example
Hiroaki_Okoshi 0:a21b8a29df03 2 * Copyright (c) 2016 ARM Limited
Hiroaki_Okoshi 0:a21b8a29df03 3 *
Hiroaki_Okoshi 0:a21b8a29df03 4 * Licensed under the Apache License, Version 2.0 (the "License");
Hiroaki_Okoshi 0:a21b8a29df03 5 * you may not use this file except in compliance with the License.
Hiroaki_Okoshi 0:a21b8a29df03 6 * You may obtain a copy of the License at
Hiroaki_Okoshi 0:a21b8a29df03 7 *
Hiroaki_Okoshi 0:a21b8a29df03 8 * http://www.apache.org/licenses/LICENSE-2.0
Hiroaki_Okoshi 0:a21b8a29df03 9 *
Hiroaki_Okoshi 0:a21b8a29df03 10 * Unless required by applicable law or agreed to in writing, software
Hiroaki_Okoshi 0:a21b8a29df03 11 * distributed under the License is distributed on an "AS IS" BASIS,
Hiroaki_Okoshi 0:a21b8a29df03 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Hiroaki_Okoshi 0:a21b8a29df03 13 * See the License for the specific language governing permissions and
Hiroaki_Okoshi 0:a21b8a29df03 14 * limitations under the License.
Hiroaki_Okoshi 0:a21b8a29df03 15 */
Hiroaki_Okoshi 0:a21b8a29df03 16
Hiroaki_Okoshi 0:a21b8a29df03 17 #include "mbed.h"
Hiroaki_Okoshi 0:a21b8a29df03 18 #include "http_server.h"
Hiroaki_Okoshi 0:a21b8a29df03 19 #include "http_response_builder.h"
Hiroaki_Okoshi 0:a21b8a29df03 20
Hiroaki_Okoshi 0:a21b8a29df03 21 #define BUFFER_SIZE 1024*2
Hiroaki_Okoshi 0:a21b8a29df03 22
Hiroaki_Okoshi 0:a21b8a29df03 23 WiFiInterface *wifi;
Hiroaki_Okoshi 0:a21b8a29df03 24
Hiroaki_Okoshi 0:a21b8a29df03 25 TCPSocket socket;
Hiroaki_Okoshi 0:a21b8a29df03 26
Hiroaki_Okoshi 0:a21b8a29df03 27 char buf[BUFFER_SIZE];
Hiroaki_Okoshi 0:a21b8a29df03 28 unsigned int bufIndex=0;;
Hiroaki_Okoshi 0:a21b8a29df03 29 bool RxTriggred=false;
Hiroaki_Okoshi 0:a21b8a29df03 30
Hiroaki_Okoshi 0:a21b8a29df03 31 /* Flash Control hoko*/
Hiroaki_Okoshi 0:a21b8a29df03 32 void _eraseFlash(void)
Hiroaki_Okoshi 0:a21b8a29df03 33 {
Hiroaki_Okoshi 0:a21b8a29df03 34 FLASH_EraseInitTypeDef erase;
Hiroaki_Okoshi 0:a21b8a29df03 35 erase.TypeErase = FLASH_TYPEERASE_SECTORS; /* Select sector */
Hiroaki_Okoshi 0:a21b8a29df03 36 erase.Sector = FLASH_SECTOR_23; /* Set sector 23 */
Hiroaki_Okoshi 0:a21b8a29df03 37 erase.Banks = FLASH_BANK_2; /* Erase bank =2 */
Hiroaki_Okoshi 0:a21b8a29df03 38 erase.NbSectors = 1; /* Erase sector num */
Hiroaki_Okoshi 0:a21b8a29df03 39 erase.VoltageRange = FLASH_VOLTAGE_RANGE_3; /* Driver 3.3V */
Hiroaki_Okoshi 0:a21b8a29df03 40
Hiroaki_Okoshi 0:a21b8a29df03 41 uint32_t pageError = 0;
Hiroaki_Okoshi 0:a21b8a29df03 42
Hiroaki_Okoshi 0:a21b8a29df03 43 HAL_FLASHEx_Erase(&erase, &pageError); /* Erase use by HAL_FLASHEx */
Hiroaki_Okoshi 0:a21b8a29df03 44 }
Hiroaki_Okoshi 0:a21b8a29df03 45
Hiroaki_Okoshi 0:a21b8a29df03 46 void writeFlash(uint32_t address, uint8_t *data, uint32_t size)
Hiroaki_Okoshi 0:a21b8a29df03 47 {
Hiroaki_Okoshi 0:a21b8a29df03 48 HAL_FLASH_Unlock(); /* Unlock FLASH */
Hiroaki_Okoshi 0:a21b8a29df03 49 _eraseFlash(); /* Erase sector 23 */
Hiroaki_Okoshi 0:a21b8a29df03 50 do {
Hiroaki_Okoshi 0:a21b8a29df03 51 HAL_FLASH_Program(FLASH_TYPEPROGRAM_BYTE, address, *data);
Hiroaki_Okoshi 0:a21b8a29df03 52 } while (++address, ++data, --size);
Hiroaki_Okoshi 0:a21b8a29df03 53 HAL_FLASH_Lock(); /* Lock FLASH */
Hiroaki_Okoshi 0:a21b8a29df03 54 }
Hiroaki_Okoshi 0:a21b8a29df03 55
Hiroaki_Okoshi 0:a21b8a29df03 56 void loadFlash(uint32_t address, uint8_t *data, uint32_t size)
Hiroaki_Okoshi 0:a21b8a29df03 57 {
Hiroaki_Okoshi 0:a21b8a29df03 58 memcpy(data, (uint8_t*)address, size);
Hiroaki_Okoshi 0:a21b8a29df03 59 }
Hiroaki_Okoshi 0:a21b8a29df03 60
Hiroaki_Okoshi 0:a21b8a29df03 61 typedef struct {
Hiroaki_Okoshi 0:a21b8a29df03 62 char wifi_ssid[20] = "WIFI_SSID" ;
Hiroaki_Okoshi 0:a21b8a29df03 63 char wifi_passwd[20] = "WIFI_PASSWORD" ;
Hiroaki_Okoshi 0:a21b8a29df03 64 } NTRIP_Condition;
Hiroaki_Okoshi 0:a21b8a29df03 65
Hiroaki_Okoshi 0:a21b8a29df03 66 NTRIP_Condition get_ntrip_condition (){
Hiroaki_Okoshi 0:a21b8a29df03 67
Hiroaki_Okoshi 0:a21b8a29df03 68 NTRIP_Condition ntrip_condition;
Hiroaki_Okoshi 0:a21b8a29df03 69
Hiroaki_Okoshi 0:a21b8a29df03 70 mbed_stats_sys_t stats;
Hiroaki_Okoshi 0:a21b8a29df03 71 mbed_stats_sys_get(&stats);
Hiroaki_Okoshi 0:a21b8a29df03 72
Hiroaki_Okoshi 0:a21b8a29df03 73 printf("\n ---- ODIN-W2 Status -----\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 74 printf("Mbed OS version %d.%d.%d\r\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
Hiroaki_Okoshi 0:a21b8a29df03 75 printf("CPU ID: 0x%x\r\n", stats.cpu_id);
Hiroaki_Okoshi 0:a21b8a29df03 76 printf("Compiler ID: %d\r\n", stats.compiler_id);
Hiroaki_Okoshi 0:a21b8a29df03 77 printf("Compiler Version: %ld\r\n", stats.compiler_version);
Hiroaki_Okoshi 0:a21b8a29df03 78
Hiroaki_Okoshi 0:a21b8a29df03 79 const uint32_t address = 0x81E0000;
Hiroaki_Okoshi 0:a21b8a29df03 80
Hiroaki_Okoshi 0:a21b8a29df03 81 loadFlash(address, (uint8_t*)&ntrip_condition, sizeof(NTRIP_Condition));
Hiroaki_Okoshi 0:a21b8a29df03 82 printf (" -------------------------\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 83 printf ("| Current C099 conditions |\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 84 printf (" -------------------------\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 85 printf ("WiFi SSID = %s \r\n" , ntrip_condition.wifi_ssid );
Hiroaki_Okoshi 0:a21b8a29df03 86 printf ("WiFi Password = %s \r\n" , ntrip_condition.wifi_passwd );
Hiroaki_Okoshi 0:a21b8a29df03 87
Hiroaki_Okoshi 0:a21b8a29df03 88 DigitalIn switch_in0(SW0); // PUSH = 0 ;
Hiroaki_Okoshi 0:a21b8a29df03 89 switch_in0.mode(PullUp);
Hiroaki_Okoshi 0:a21b8a29df03 90 int x = switch_in0;
Hiroaki_Okoshi 0:a21b8a29df03 91 int y = 1;
Hiroaki_Okoshi 0:a21b8a29df03 92
Hiroaki_Okoshi 0:a21b8a29df03 93 char buffer[4]="OK";
Hiroaki_Okoshi 0:a21b8a29df03 94
Hiroaki_Okoshi 0:a21b8a29df03 95 printf (" --------------------------------------------\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 96 printf ("| If you release RESET while turning on SW0, |\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 97 printf ("| ODIN will enter the condition change mode. |\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 98 printf (" --------------------------------------------\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 99
Hiroaki_Okoshi 0:a21b8a29df03 100 while( (strstr(buffer,"OK") == NULL) || ( x == 0 ) ) // if SW0 is PUSH -> Change Condition
Hiroaki_Okoshi 0:a21b8a29df03 101 {
Hiroaki_Okoshi 0:a21b8a29df03 102 x = 1 ;
Hiroaki_Okoshi 0:a21b8a29df03 103 y = 0 ;
Hiroaki_Okoshi 0:a21b8a29df03 104 printf ("Please Input Condition\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 105
Hiroaki_Okoshi 0:a21b8a29df03 106 printf("\r\nWiFi SSID = ");
Hiroaki_Okoshi 0:a21b8a29df03 107 scanf ("%s" , ntrip_condition.wifi_ssid );
Hiroaki_Okoshi 0:a21b8a29df03 108 printf("%s\r\nWiFi Password = " ,ntrip_condition.wifi_ssid);
Hiroaki_Okoshi 0:a21b8a29df03 109 scanf ("%s" , ntrip_condition.wifi_passwd );
Hiroaki_Okoshi 0:a21b8a29df03 110 printf("%s\r\nNtrip Server (ex:rtk2go.com)= ",ntrip_condition.wifi_passwd);
Hiroaki_Okoshi 0:a21b8a29df03 111 printf (" -------------------------\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 112 printf ("| Changed C099 conditions |\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 113 printf (" -------------------------\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 114 printf ("WiFi SSID = %s \r\n" , ntrip_condition.wifi_ssid );
Hiroaki_Okoshi 0:a21b8a29df03 115 printf ("WiFi Password = %s \r\n" , ntrip_condition.wifi_passwd );
Hiroaki_Okoshi 0:a21b8a29df03 116 printf (" -----------------------------------------------------------------------\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 117 printf ("| If this is all right, enter \"OK\". If not, enter \"NG\". (and ENTER) |\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 118 printf (" -----------------------------------------------------------------------\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 119
Hiroaki_Okoshi 0:a21b8a29df03 120 scanf("%s", buffer);
Hiroaki_Okoshi 0:a21b8a29df03 121 printf("%s\r\n",buffer);
Hiroaki_Okoshi 0:a21b8a29df03 122 }
Hiroaki_Okoshi 0:a21b8a29df03 123
Hiroaki_Okoshi 0:a21b8a29df03 124 if ( y == 0 ) {
Hiroaki_Okoshi 0:a21b8a29df03 125 printf ("Write changed condition\r\n");
Hiroaki_Okoshi 0:a21b8a29df03 126 writeFlash(address, (uint8_t*)&ntrip_condition, sizeof(NTRIP_Condition));
Hiroaki_Okoshi 0:a21b8a29df03 127 }
Hiroaki_Okoshi 0:a21b8a29df03 128
Hiroaki_Okoshi 0:a21b8a29df03 129 return ntrip_condition;
Hiroaki_Okoshi 0:a21b8a29df03 130 }
Hiroaki_Okoshi 0:a21b8a29df03 131
Hiroaki_Okoshi 0:a21b8a29df03 132
Hiroaki_Okoshi 0:a21b8a29df03 133 // Requests come in here
Hiroaki_Okoshi 0:a21b8a29df03 134 void request_handler(ParsedHttpRequest* request, TCPSocket* socket) {
Hiroaki_Okoshi 0:a21b8a29df03 135
Hiroaki_Okoshi 0:a21b8a29df03 136 DigitalOut led(LED1);
Hiroaki_Okoshi 0:a21b8a29df03 137
Hiroaki_Okoshi 0:a21b8a29df03 138 printf("Request came in: %s %s\n", http_method_str(request->get_method()), request->get_url().c_str());
Hiroaki_Okoshi 0:a21b8a29df03 139
Hiroaki_Okoshi 0:a21b8a29df03 140 if (request->get_method() == HTTP_GET && request->get_url() == "/") {
Hiroaki_Okoshi 0:a21b8a29df03 141 HttpResponseBuilder builder(200);
Hiroaki_Okoshi 0:a21b8a29df03 142 builder.set_header("Content-Type", "text/html; charset=utf-8");
Hiroaki_Okoshi 0:a21b8a29df03 143
Hiroaki_Okoshi 0:a21b8a29df03 144 char response[] = "<html><head><title>Hello from mbed</title></head>"
Hiroaki_Okoshi 0:a21b8a29df03 145 "<body>"
Hiroaki_Okoshi 0:a21b8a29df03 146 "<h1>mbed webserver</h1>"
Hiroaki_Okoshi 0:a21b8a29df03 147 "<button id=\"toggle\">Toggle LED</button>"
Hiroaki_Okoshi 0:a21b8a29df03 148 "<script>document.querySelector('#toggle').onclick = function() {"
Hiroaki_Okoshi 0:a21b8a29df03 149 "var x = new XMLHttpRequest(); x.open('POST', '/toggle'); x.send();"
Hiroaki_Okoshi 0:a21b8a29df03 150 "}</script>"
Hiroaki_Okoshi 0:a21b8a29df03 151 "</body></html>";
Hiroaki_Okoshi 0:a21b8a29df03 152
Hiroaki_Okoshi 0:a21b8a29df03 153 builder.send(socket, response, sizeof(response) - 1);
Hiroaki_Okoshi 0:a21b8a29df03 154 }
Hiroaki_Okoshi 0:a21b8a29df03 155 else if (request->get_method() == HTTP_POST && request->get_url() == "/toggle") {
Hiroaki_Okoshi 0:a21b8a29df03 156 printf("toggle LED called\n");
Hiroaki_Okoshi 0:a21b8a29df03 157 led = !led;
Hiroaki_Okoshi 0:a21b8a29df03 158
Hiroaki_Okoshi 0:a21b8a29df03 159 HttpResponseBuilder builder(200);
Hiroaki_Okoshi 0:a21b8a29df03 160 builder.send(socket, NULL, 0);
Hiroaki_Okoshi 0:a21b8a29df03 161 }
Hiroaki_Okoshi 0:a21b8a29df03 162 else {
Hiroaki_Okoshi 0:a21b8a29df03 163 HttpResponseBuilder builder(404);
Hiroaki_Okoshi 0:a21b8a29df03 164 builder.send(socket, NULL, 0);
Hiroaki_Okoshi 0:a21b8a29df03 165 }
Hiroaki_Okoshi 0:a21b8a29df03 166 }
Hiroaki_Okoshi 0:a21b8a29df03 167
Hiroaki_Okoshi 0:a21b8a29df03 168 int main() {
Hiroaki_Okoshi 0:a21b8a29df03 169
Hiroaki_Okoshi 0:a21b8a29df03 170 NTRIP_Condition ntrip_condition = get_ntrip_condition();
Hiroaki_Okoshi 0:a21b8a29df03 171
Hiroaki_Okoshi 0:a21b8a29df03 172 printf("Mbed OS version %d.%d.%d\r\n", MBED_MAJOR_VERSION, MBED_MINOR_VERSION, MBED_PATCH_VERSION);
Hiroaki_Okoshi 0:a21b8a29df03 173
Hiroaki_Okoshi 0:a21b8a29df03 174 wifi = WiFiInterface::get_default_instance();
Hiroaki_Okoshi 0:a21b8a29df03 175 int ret=1;
Hiroaki_Okoshi 0:a21b8a29df03 176 ret = wifi->connect(ntrip_condition.wifi_ssid, ntrip_condition.wifi_passwd, NSAPI_SECURITY_WPA_WPA2);
Hiroaki_Okoshi 0:a21b8a29df03 177 if (ret != 0) {
Hiroaki_Okoshi 0:a21b8a29df03 178 printf("\nConnection error: %d\n", ret);
Hiroaki_Okoshi 0:a21b8a29df03 179 }
Hiroaki_Okoshi 0:a21b8a29df03 180 else {
Hiroaki_Okoshi 0:a21b8a29df03 181 printf("Success\n\n");
Hiroaki_Okoshi 0:a21b8a29df03 182 printf("MAC: %s\n", wifi->get_mac_address());
Hiroaki_Okoshi 0:a21b8a29df03 183 printf("IP: %s\n", wifi->get_ip_address());
Hiroaki_Okoshi 0:a21b8a29df03 184 printf("Netmask: %s\n", wifi->get_netmask());
Hiroaki_Okoshi 0:a21b8a29df03 185 printf("Gateway: %s\n", wifi->get_gateway());
Hiroaki_Okoshi 0:a21b8a29df03 186 printf("RSSI: %d\n\n", wifi->get_rssi());
Hiroaki_Okoshi 0:a21b8a29df03 187 }
Hiroaki_Okoshi 0:a21b8a29df03 188
Hiroaki_Okoshi 0:a21b8a29df03 189 // Connect to the network (see mbed_app.json for the connectivity method used)
Hiroaki_Okoshi 0:a21b8a29df03 190 if (!wifi) {
Hiroaki_Okoshi 0:a21b8a29df03 191 printf("Cannot connect to the network, see serial output\n");
Hiroaki_Okoshi 0:a21b8a29df03 192 return 1;
Hiroaki_Okoshi 0:a21b8a29df03 193 }
Hiroaki_Okoshi 0:a21b8a29df03 194
Hiroaki_Okoshi 0:a21b8a29df03 195 HttpServer server(wifi);
Hiroaki_Okoshi 0:a21b8a29df03 196 nsapi_error_t res = server.start(8080, &request_handler);
Hiroaki_Okoshi 0:a21b8a29df03 197
Hiroaki_Okoshi 0:a21b8a29df03 198 if (res == NSAPI_ERROR_OK) {
Hiroaki_Okoshi 0:a21b8a29df03 199 printf("Server is listening at http://%s:8080\n", wifi->get_ip_address());
Hiroaki_Okoshi 0:a21b8a29df03 200 }
Hiroaki_Okoshi 0:a21b8a29df03 201 else {
Hiroaki_Okoshi 0:a21b8a29df03 202 printf("Server could not be started... %d\n", res);
Hiroaki_Okoshi 0:a21b8a29df03 203 }
Hiroaki_Okoshi 0:a21b8a29df03 204
Hiroaki_Okoshi 0:a21b8a29df03 205 wait(osWaitForever);
Hiroaki_Okoshi 0:a21b8a29df03 206
Hiroaki_Okoshi 0:a21b8a29df03 207 }