Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
source/main.cpp@0:a21b8a29df03, 2021-10-09 (annotated)
- 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?
| User | Revision | Line number | New 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 | } |