Webserver only w/o any other functions, single thread. Running on STM32F013+W5500
Dependencies: NTPClient W5500Interface Watchdog device_configuration eeprom_flash mbed-rpc-nucleo mbed-rtos mbed
Fork of F103-Serial-to-Ethernet by
main.cpp@3:972ed747474c, 2014-09-21 (annotated)
- Committer:
- olympux
- Date:
- Sun Sep 21 08:15:57 2014 +0000
- Revision:
- 3:972ed747474c
- Parent:
- 2:18f10e7209f4
- Child:
- 4:568c97f2a407
Add TCP/UDP server/client. Tested TCP/UDP server separately.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
olympux | 0:c2eac797face | 1 | /* |
olympux | 0:c2eac797face | 2 | * |
olympux | 2:18f10e7209f4 | 3 | * Alarm and Monitoring application |
olympux | 0:c2eac797face | 4 | |
olympux | 0:c2eac797face | 5 | */ |
olympux | 0:c2eac797face | 6 | #include "mbed.h" |
olympux | 0:c2eac797face | 7 | #include "EthernetInterface.h" |
olympux | 0:c2eac797face | 8 | #include "rtos.h" |
olympux | 0:c2eac797face | 9 | |
olympux | 0:c2eac797face | 10 | |
olympux | 2:18f10e7209f4 | 11 | /* |
olympux | 2:18f10e7209f4 | 12 | * Hardware defines |
olympux | 0:c2eac797face | 13 | */ |
olympux | 2:18f10e7209f4 | 14 | #define ST_NUCLEO // hardware pin mapping |
olympux | 0:c2eac797face | 15 | |
olympux | 0:c2eac797face | 16 | #ifdef ST_NUCLEO |
olympux | 0:c2eac797face | 17 | // ST Nucleo |
olympux | 0:c2eac797face | 18 | SPI spi(PA_7, PA_6, PA_5); // mosi, miso, sclk |
olympux | 0:c2eac797face | 19 | EthernetInterface eth(&spi, PC_8, PC_9); // spi, cs, reset |
olympux | 0:c2eac797face | 20 | #endif |
olympux | 0:c2eac797face | 21 | |
olympux | 2:18f10e7209f4 | 22 | Serial uart(USBTX,USBRX); |
olympux | 2:18f10e7209f4 | 23 | |
olympux | 0:c2eac797face | 24 | |
olympux | 2:18f10e7209f4 | 25 | /* |
olympux | 2:18f10e7209f4 | 26 | * Network configuration |
olympux | 2:18f10e7209f4 | 27 | */ |
olympux | 2:18f10e7209f4 | 28 | #define TCP_SERVER_PORT 10000 |
olympux | 3:972ed747474c | 29 | #define UDP_LOCAL_PORT 11000 |
olympux | 2:18f10e7209f4 | 30 | //#define USE_DHCP // DHCP or static |
olympux | 0:c2eac797face | 31 | |
olympux | 0:c2eac797face | 32 | #ifndef USE_DHCP |
olympux | 0:c2eac797face | 33 | // for static IP setting |
olympux | 0:c2eac797face | 34 | const char * IP_Addr = "192.168.0.120"; |
olympux | 0:c2eac797face | 35 | const char * IP_Subnet = "255.255.255.0"; |
olympux | 0:c2eac797face | 36 | const char * IP_Gateway = "192.168.0.1"; |
olympux | 0:c2eac797face | 37 | #endif |
olympux | 0:c2eac797face | 38 | |
olympux | 3:972ed747474c | 39 | #define TCP_SERVER |
olympux | 3:972ed747474c | 40 | //#define TCP_CLIENT |
olympux | 3:972ed747474c | 41 | //#define UDP_SERVER |
olympux | 3:972ed747474c | 42 | //#define UDP_CLIENT |
olympux | 3:972ed747474c | 43 | //#define NTP |
olympux | 3:972ed747474c | 44 | |
olympux | 3:972ed747474c | 45 | char buffer[256]; // socket buffer |
olympux | 3:972ed747474c | 46 | |
olympux | 0:c2eac797face | 47 | |
olympux | 2:18f10e7209f4 | 48 | |
olympux | 2:18f10e7209f4 | 49 | /* |
olympux | 2:18f10e7209f4 | 50 | * RTOS |
olympux | 2:18f10e7209f4 | 51 | */ |
olympux | 2:18f10e7209f4 | 52 | struct message_t { |
olympux | 2:18f10e7209f4 | 53 | int len; |
olympux | 2:18f10e7209f4 | 54 | char *msg; |
olympux | 2:18f10e7209f4 | 55 | }; |
olympux | 3:972ed747474c | 56 | Queue<message_t, 16> uart_queue; |
olympux | 2:18f10e7209f4 | 57 | |
olympux | 3:972ed747474c | 58 | Mutex uart_mutex; |
olympux | 2:18f10e7209f4 | 59 | |
olympux | 2:18f10e7209f4 | 60 | |
olympux | 2:18f10e7209f4 | 61 | /* |
olympux | 2:18f10e7209f4 | 62 | * Threads |
olympux | 2:18f10e7209f4 | 63 | */ |
olympux | 0:c2eac797face | 64 | void uart_thread(void const *args) { |
olympux | 2:18f10e7209f4 | 65 | message_t *p_message; |
olympux | 0:c2eac797face | 66 | |
olympux | 0:c2eac797face | 67 | while (true) { |
olympux | 3:972ed747474c | 68 | osEvent evt = uart_queue.get(); |
olympux | 2:18f10e7209f4 | 69 | if (evt.status == osEventMessage) { |
olympux | 2:18f10e7209f4 | 70 | p_message = (message_t*)evt.value.p; |
olympux | 3:972ed747474c | 71 | uart_mutex.lock(); |
olympux | 3:972ed747474c | 72 | //uart.printf("len=%d\n", p_message->len); |
olympux | 3:972ed747474c | 73 | uart.printf("%s\n", p_message->msg); |
olympux | 3:972ed747474c | 74 | uart_mutex.unlock(); |
olympux | 2:18f10e7209f4 | 75 | } |
olympux | 0:c2eac797face | 76 | } |
olympux | 0:c2eac797face | 77 | } |
olympux | 0:c2eac797face | 78 | |
olympux | 0:c2eac797face | 79 | |
olympux | 0:c2eac797face | 80 | int main() |
olympux | 0:c2eac797face | 81 | { |
olympux | 3:972ed747474c | 82 | message_t message; |
olympux | 2:18f10e7209f4 | 83 | |
olympux | 3:972ed747474c | 84 | /* |
olympux | 3:972ed747474c | 85 | * configure |
olympux | 3:972ed747474c | 86 | */ |
olympux | 3:972ed747474c | 87 | uart.baud(115200); |
olympux | 0:c2eac797face | 88 | |
olympux | 0:c2eac797face | 89 | |
olympux | 3:972ed747474c | 90 | /* |
olympux | 3:972ed747474c | 91 | * UI threads |
olympux | 3:972ed747474c | 92 | */ |
olympux | 3:972ed747474c | 93 | Thread t1(uart_thread); |
olympux | 3:972ed747474c | 94 | |
olympux | 3:972ed747474c | 95 | |
olympux | 3:972ed747474c | 96 | |
olympux | 3:972ed747474c | 97 | |
olympux | 3:972ed747474c | 98 | /* |
olympux | 3:972ed747474c | 99 | * Ethernet |
olympux | 3:972ed747474c | 100 | */ |
olympux | 3:972ed747474c | 101 | uint8_t mac[6]; |
olympux | 3:972ed747474c | 102 | |
olympux | 0:c2eac797face | 103 | mbed_mac_address((char *)mac); // using the MAC address in LPC11U24 or LPC1178 |
olympux | 0:c2eac797face | 104 | mac[0] = 0x00; mac[1] = 0x08; mac[2] = 0xDC; mac[3] = 0x00; mac[4] = 0x00; mac[5] = 0x00; |
olympux | 0:c2eac797face | 105 | |
olympux | 3:972ed747474c | 106 | printf("Start\n"); |
olympux | 0:c2eac797face | 107 | #ifdef USE_DHCP |
olympux | 0:c2eac797face | 108 | int ret = eth.init(mac); //Use DHCP |
olympux | 0:c2eac797face | 109 | #else |
olympux | 0:c2eac797face | 110 | int ret = eth.init(mac, IP_Addr, IP_Subnet, IP_Gateway); // static |
olympux | 0:c2eac797face | 111 | #endif |
olympux | 0:c2eac797face | 112 | |
olympux | 0:c2eac797face | 113 | if (!ret) { |
olympux | 2:18f10e7209f4 | 114 | uart.printf("Initialized, MAC: %s\n", eth.getMACAddress()); |
olympux | 0:c2eac797face | 115 | } else { |
olympux | 2:18f10e7209f4 | 116 | uart.printf("Error eth.init() - ret = %d\n", ret); |
olympux | 0:c2eac797face | 117 | return -1; |
olympux | 0:c2eac797face | 118 | } |
olympux | 0:c2eac797face | 119 | |
olympux | 0:c2eac797face | 120 | ret = eth.connect(); |
olympux | 0:c2eac797face | 121 | if (!ret) { |
olympux | 3:972ed747474c | 122 | uart.printf("IP: %s, MASK: %s, GW: %s\n", eth.getIPAddress(), eth.getNetworkMask(), eth.getGateway()); |
olympux | 0:c2eac797face | 123 | } else { |
olympux | 2:18f10e7209f4 | 124 | uart.printf("Error eth.connect() - ret = %d\n", ret); |
olympux | 0:c2eac797face | 125 | return -1; |
olympux | 0:c2eac797face | 126 | } |
olympux | 3:972ed747474c | 127 | |
olympux | 3:972ed747474c | 128 | |
olympux | 3:972ed747474c | 129 | #ifdef TCP_SERVER |
olympux | 3:972ed747474c | 130 | TCPSocketServer tcp_server; |
olympux | 3:972ed747474c | 131 | TCPSocketConnection tcp_client; |
olympux | 3:972ed747474c | 132 | |
olympux | 3:972ed747474c | 133 | tcp_server.bind(TCP_SERVER_PORT); |
olympux | 3:972ed747474c | 134 | tcp_server.listen(); |
olympux | 3:972ed747474c | 135 | #endif |
olympux | 3:972ed747474c | 136 | |
olympux | 3:972ed747474c | 137 | #ifdef UDP_SERVER |
olympux | 3:972ed747474c | 138 | UDPSocket udp_server; |
olympux | 3:972ed747474c | 139 | Endpoint ep_udp_client; |
olympux | 3:972ed747474c | 140 | |
olympux | 3:972ed747474c | 141 | ret = udp_server.bind(UDP_LOCAL_PORT); |
olympux | 3:972ed747474c | 142 | //printf("sock.bind = %d\n", ret); |
olympux | 3:972ed747474c | 143 | #endif |
olympux | 0:c2eac797face | 144 | |
olympux | 3:972ed747474c | 145 | #ifdef TCP_CLIENT |
olympux | 3:972ed747474c | 146 | TCPSocketConnection tcp_socket; |
olympux | 3:972ed747474c | 147 | #endif |
olympux | 0:c2eac797face | 148 | |
olympux | 3:972ed747474c | 149 | #ifdef UDP_CLIENT |
olympux | 3:972ed747474c | 150 | UDPSocket udp_socket; |
olympux | 3:972ed747474c | 151 | Endpoint ep_udp_server; |
olympux | 3:972ed747474c | 152 | #endif |
olympux | 3:972ed747474c | 153 | |
olympux | 3:972ed747474c | 154 | |
olympux | 3:972ed747474c | 155 | /* |
olympux | 3:972ed747474c | 156 | * TCP server |
olympux | 3:972ed747474c | 157 | */ |
olympux | 3:972ed747474c | 158 | #ifdef TCP_SERVER |
olympux | 0:c2eac797face | 159 | while (true) { |
olympux | 3:972ed747474c | 160 | //uart.printf("\nWait for new connection...\n"); |
olympux | 3:972ed747474c | 161 | tcp_server.accept(tcp_client); |
olympux | 3:972ed747474c | 162 | tcp_client.set_blocking(false, 10000); // Timeout after (10)s |
olympux | 0:c2eac797face | 163 | |
olympux | 3:972ed747474c | 164 | //uart.printf("Connection from: %s\n", client.get_address()); |
olympux | 0:c2eac797face | 165 | while (true) { |
olympux | 3:972ed747474c | 166 | int n = tcp_client.receive(buffer, sizeof(buffer)); |
olympux | 0:c2eac797face | 167 | if (n <= 0) break; |
olympux | 2:18f10e7209f4 | 168 | |
olympux | 2:18f10e7209f4 | 169 | // send to uart |
olympux | 2:18f10e7209f4 | 170 | buffer[n] = '\0'; |
olympux | 2:18f10e7209f4 | 171 | message.len = n; |
olympux | 2:18f10e7209f4 | 172 | message.msg = buffer; |
olympux | 3:972ed747474c | 173 | uart_queue.put(&message); |
olympux | 2:18f10e7209f4 | 174 | |
olympux | 2:18f10e7209f4 | 175 | // echo to tcp client |
olympux | 3:972ed747474c | 176 | tcp_client.send_all(buffer, n); |
olympux | 0:c2eac797face | 177 | if (n <= 0) break; |
olympux | 0:c2eac797face | 178 | } |
olympux | 0:c2eac797face | 179 | |
olympux | 3:972ed747474c | 180 | tcp_client.close(); |
olympux | 3:972ed747474c | 181 | } |
olympux | 3:972ed747474c | 182 | #endif |
olympux | 3:972ed747474c | 183 | |
olympux | 3:972ed747474c | 184 | /* |
olympux | 3:972ed747474c | 185 | * UDP server |
olympux | 3:972ed747474c | 186 | */ |
olympux | 3:972ed747474c | 187 | #ifdef UDP_SERVER |
olympux | 3:972ed747474c | 188 | while (true) { |
olympux | 3:972ed747474c | 189 | //printf("\nWait for packet...\n"); |
olympux | 3:972ed747474c | 190 | int n = udp_server.receiveFrom(ep_udp_client, buffer, sizeof(buffer)); |
olympux | 3:972ed747474c | 191 | if (n < 0) continue; |
olympux | 3:972ed747474c | 192 | |
olympux | 3:972ed747474c | 193 | // send to uart |
olympux | 3:972ed747474c | 194 | buffer[n] = '\0'; |
olympux | 3:972ed747474c | 195 | message.len = n; |
olympux | 3:972ed747474c | 196 | message.msg = buffer; |
olympux | 3:972ed747474c | 197 | uart_queue.put(&message); |
olympux | 3:972ed747474c | 198 | |
olympux | 3:972ed747474c | 199 | // echo |
olympux | 3:972ed747474c | 200 | //printf("Received packet from: %s\n", client.get_address()); |
olympux | 3:972ed747474c | 201 | udp_server.sendTo(ep_udp_client, buffer, n); |
olympux | 3:972ed747474c | 202 | } |
olympux | 3:972ed747474c | 203 | #endif |
olympux | 3:972ed747474c | 204 | |
olympux | 3:972ed747474c | 205 | |
olympux | 3:972ed747474c | 206 | /* |
olympux | 3:972ed747474c | 207 | * TCP client |
olympux | 3:972ed747474c | 208 | */ |
olympux | 3:972ed747474c | 209 | #ifdef TCP_CLIENT |
olympux | 3:972ed747474c | 210 | while (tcp_socket.connect(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT) < 0) { |
olympux | 3:972ed747474c | 211 | printf("Unable to connect to (%s) on port (%d)\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT); |
olympux | 3:972ed747474c | 212 | wait(1); |
olympux | 0:c2eac797face | 213 | } |
olympux | 3:972ed747474c | 214 | |
olympux | 3:972ed747474c | 215 | char hello[] = "Hello World\n"; |
olympux | 3:972ed747474c | 216 | tcp_socket.send_all(hello, sizeof(hello) - 1); |
olympux | 3:972ed747474c | 217 | |
olympux | 3:972ed747474c | 218 | char buf[256]; |
olympux | 3:972ed747474c | 219 | int n = tcp_socket.receive(buf, 256); |
olympux | 3:972ed747474c | 220 | buf[n] = '\0'; |
olympux | 3:972ed747474c | 221 | printf("%s", buf); |
olympux | 3:972ed747474c | 222 | |
olympux | 3:972ed747474c | 223 | tcp_socket.close(); |
olympux | 3:972ed747474c | 224 | eth.disconnect(); |
olympux | 3:972ed747474c | 225 | |
olympux | 3:972ed747474c | 226 | while(true) {} |
olympux | 3:972ed747474c | 227 | #endif |
olympux | 3:972ed747474c | 228 | |
olympux | 3:972ed747474c | 229 | |
olympux | 3:972ed747474c | 230 | /* |
olympux | 3:972ed747474c | 231 | * UDP client |
olympux | 3:972ed747474c | 232 | */ |
olympux | 3:972ed747474c | 233 | #ifdef UDP_CLIENT |
olympux | 3:972ed747474c | 234 | ret = udp_socket.init(); |
olympux | 3:972ed747474c | 235 | udp_socket.bind(0); |
olympux | 3:972ed747474c | 236 | printf("sock.bind = %d\n", ret); |
olympux | 3:972ed747474c | 237 | if (ret == -1) printf("Socket creation Fail\n"); |
olympux | 3:972ed747474c | 238 | |
olympux | 3:972ed747474c | 239 | ep_udp_server.set_address(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT); |
olympux | 3:972ed747474c | 240 | |
olympux | 3:972ed747474c | 241 | printf("\nSend UDP data\n"); |
olympux | 3:972ed747474c | 242 | |
olympux | 3:972ed747474c | 243 | char out_buffer[] = "Hello World\n"; |
olympux | 3:972ed747474c | 244 | ret = udp_socket.sendTo(ep_udp_server, out_buffer, sizeof(out_buffer)); |
olympux | 3:972ed747474c | 245 | if (ret < 0) printf("UDP Send Error\n"); |
olympux | 3:972ed747474c | 246 | else printf("UDP Send: %d\n", ret); |
olympux | 3:972ed747474c | 247 | |
olympux | 3:972ed747474c | 248 | char in_buffer[256]; |
olympux | 3:972ed747474c | 249 | int n = udp_socket.receiveFrom(ep_udp_server, in_buffer, sizeof(in_buffer)); |
olympux | 3:972ed747474c | 250 | |
olympux | 3:972ed747474c | 251 | in_buffer[n] = '\0'; |
olympux | 3:972ed747474c | 252 | printf("%s\n", in_buffer); |
olympux | 3:972ed747474c | 253 | |
olympux | 3:972ed747474c | 254 | udp_socket.close(); |
olympux | 3:972ed747474c | 255 | |
olympux | 3:972ed747474c | 256 | eth.disconnect(); |
olympux | 3:972ed747474c | 257 | while(1) {} |
olympux | 3:972ed747474c | 258 | #endif |
olympux | 3:972ed747474c | 259 | |
olympux | 3:972ed747474c | 260 | |
olympux | 3:972ed747474c | 261 | /* |
olympux | 3:972ed747474c | 262 | * NTP |
olympux | 3:972ed747474c | 263 | */ |
olympux | 3:972ed747474c | 264 | #ifdef NTP |
olympux | 3:972ed747474c | 265 | time_t ctTime; |
olympux | 3:972ed747474c | 266 | ctTime = time(NULL); |
olympux | 3:972ed747474c | 267 | printf("1. Current Time is: %s\r\n", ctime(&ctTime)); |
olympux | 3:972ed747474c | 268 | |
olympux | 3:972ed747474c | 269 | printf("Trying to update time...\r\n"); |
olympux | 3:972ed747474c | 270 | if (ntp.setTime("0.pool.ntp.org") == 0) { |
olympux | 3:972ed747474c | 271 | ctTime = time(NULL); |
olympux | 3:972ed747474c | 272 | printf("2. Current Time is: %s\r\n", ctime(&ctTime)); |
olympux | 3:972ed747474c | 273 | |
olympux | 3:972ed747474c | 274 | // resetting GMT+9 |
olympux | 3:972ed747474c | 275 | set_time( time(NULL) + 32400 ); // 9x60x60 |
olympux | 3:972ed747474c | 276 | // |
olympux | 3:972ed747474c | 277 | printf("Set time successfully\r\n"); |
olympux | 3:972ed747474c | 278 | //time_t ctTime; |
olympux | 3:972ed747474c | 279 | ctTime = time(NULL); |
olympux | 3:972ed747474c | 280 | printf("Time is set to (UTC): %s\r\n", ctime(&ctTime)); |
olympux | 3:972ed747474c | 281 | } else { |
olympux | 3:972ed747474c | 282 | printf("Error\r\n"); |
olympux | 3:972ed747474c | 283 | } |
olympux | 3:972ed747474c | 284 | |
olympux | 3:972ed747474c | 285 | eth.disconnect(); |
olympux | 3:972ed747474c | 286 | |
olympux | 3:972ed747474c | 287 | while(1) { |
olympux | 3:972ed747474c | 288 | } |
olympux | 3:972ed747474c | 289 | #endif |
olympux | 3:972ed747474c | 290 | |
olympux | 3:972ed747474c | 291 | while(true) {} |
olympux | 0:c2eac797face | 292 | } |