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 Chau Vo

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?

UserRevisionLine numberNew 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 }