Simple HTTP server example with W5500 (WIZnet chipset) .access the mbed via any browser, mbed echo back http request header.
Dependencies: WIZnet_Library mbed
Fork of HTTPServer_echoback_WIZ550io by
main.cpp@21:8f790ebb9f3c, 2015-12-30 (annotated)
- Committer:
- sjallouli
- Date:
- Wed Dec 30 23:26:05 2015 +0000
- Revision:
- 21:8f790ebb9f3c
- Parent:
- 20:f0c3af075949
Port to NUCLEO-STM32F401
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
donatien | 0:bb128f0e952f | 1 | #include "mbed.h" |
sjallouli | 21:8f790ebb9f3c | 2 | #include "WIZnetInterface.h" |
hsgw | 13:25ce35614dd1 | 3 | #include <stdio.h> |
hsgw | 13:25ce35614dd1 | 4 | #include <string.h> |
donatien | 0:bb128f0e952f | 5 | |
sjallouli | 21:8f790ebb9f3c | 6 | #define USE_DHCP 1 |
hsgw | 13:25ce35614dd1 | 7 | |
sjallouli | 21:8f790ebb9f3c | 8 | const char * IP_Addr = "192.168.1.2"; |
sjallouli | 21:8f790ebb9f3c | 9 | const char * IP_Subnet = "255.255.255.0"; |
sjallouli | 21:8f790ebb9f3c | 10 | const char * IP_Gateway = "192.168.1.1"; |
sjallouli | 21:8f790ebb9f3c | 11 | unsigned char MAC_Addr[6] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xD0 }; |
sjallouli | 21:8f790ebb9f3c | 12 | |
sjallouli | 21:8f790ebb9f3c | 13 | Serial pc(SERIAL_TX, SERIAL_RX); |
sjallouli | 21:8f790ebb9f3c | 14 | |
sjallouli | 21:8f790ebb9f3c | 15 | SPI spi(SPI_MOSI, SPI_MISO, SPI_SCK); // mosi, miso, sclk |
sjallouli | 21:8f790ebb9f3c | 16 | |
sjallouli | 21:8f790ebb9f3c | 17 | #define PORT 80 |
sjallouli | 21:8f790ebb9f3c | 18 | |
hsgw | 13:25ce35614dd1 | 19 | bool serverIsListened = false; |
hsgw | 13:25ce35614dd1 | 20 | bool clientIsConnected = false; |
hsgw | 13:25ce35614dd1 | 21 | |
hsgw | 13:25ce35614dd1 | 22 | int main (void) |
hsgw | 13:25ce35614dd1 | 23 | { |
sjallouli | 21:8f790ebb9f3c | 24 | spi.frequency(1000000); |
sjallouli | 21:8f790ebb9f3c | 25 | WIZnetInterface ethernet(&spi,D10, D3); |
Bongjun | 16:ea8f49af2d86 | 26 | |
sjallouli | 21:8f790ebb9f3c | 27 | pc.printf("Ethernet Init\r\n"); |
sjallouli | 21:8f790ebb9f3c | 28 | #if USE_DHCP |
sjallouli | 21:8f790ebb9f3c | 29 | int ret = ethernet.init(MAC_Addr); |
sjallouli | 21:8f790ebb9f3c | 30 | #else |
sjallouli | 21:8f790ebb9f3c | 31 | int ret = ethernet.init(MAC_Addr,IP_Addr,IP_Subnet,IP_Gateway); |
sjallouli | 21:8f790ebb9f3c | 32 | #endif |
Bongjun | 16:ea8f49af2d86 | 33 | |
sjallouli | 21:8f790ebb9f3c | 34 | if (!ret) |
sjallouli | 21:8f790ebb9f3c | 35 | { |
sjallouli | 21:8f790ebb9f3c | 36 | pc.printf("Initialized, MAC: %s\r\n", ethernet.getMACAddress()); |
sjallouli | 21:8f790ebb9f3c | 37 | ret = ethernet.connect(); |
sjallouli | 21:8f790ebb9f3c | 38 | |
sjallouli | 21:8f790ebb9f3c | 39 | if (!ret) |
sjallouli | 21:8f790ebb9f3c | 40 | { |
sjallouli | 21:8f790ebb9f3c | 41 | pc.printf("IP: %s, MASK: %s, GW: %s\r\n", ethernet.getIPAddress(), ethernet.getNetworkMask(), ethernet.getGateway()); |
sjallouli | 21:8f790ebb9f3c | 42 | } |
sjallouli | 21:8f790ebb9f3c | 43 | else |
sjallouli | 21:8f790ebb9f3c | 44 | { |
sjallouli | 21:8f790ebb9f3c | 45 | pc.printf("Error ethernet.connect() - ret = %d\r\n", ret); |
sjallouli | 21:8f790ebb9f3c | 46 | exit(0); |
sjallouli | 21:8f790ebb9f3c | 47 | } |
sjallouli | 21:8f790ebb9f3c | 48 | } |
sjallouli | 21:8f790ebb9f3c | 49 | else |
sjallouli | 21:8f790ebb9f3c | 50 | { |
sjallouli | 21:8f790ebb9f3c | 51 | pc.printf("Error ethernet.init() - ret = %d\r\n", ret); |
sjallouli | 21:8f790ebb9f3c | 52 | exit(0); |
sjallouli | 21:8f790ebb9f3c | 53 | } |
Bongjun | 16:ea8f49af2d86 | 54 | |
Bongjun | 17:c42419afb2f8 | 55 | // late binding |
Bongjun | 17:c42419afb2f8 | 56 | TCPSocketServer svr; |
Bongjun | 17:c42419afb2f8 | 57 | TCPSocketConnection client; |
Bongjun | 20:f0c3af075949 | 58 | |
sjallouli | 21:8f790ebb9f3c | 59 | //setup tcp socket |
sjallouli | 21:8f790ebb9f3c | 60 | if(svr.bind(PORT)< 0) |
sjallouli | 21:8f790ebb9f3c | 61 | { |
sjallouli | 21:8f790ebb9f3c | 62 | pc.printf("tcp server bind failed.\n\r"); |
Bongjun | 16:ea8f49af2d86 | 63 | return -1; |
sjallouli | 21:8f790ebb9f3c | 64 | } |
sjallouli | 21:8f790ebb9f3c | 65 | else |
sjallouli | 21:8f790ebb9f3c | 66 | { |
sjallouli | 21:8f790ebb9f3c | 67 | pc.printf("tcp server bind successed.\n\r"); |
hsgw | 13:25ce35614dd1 | 68 | serverIsListened = true; |
hsgw | 13:25ce35614dd1 | 69 | } |
hsgw | 13:25ce35614dd1 | 70 | |
sjallouli | 21:8f790ebb9f3c | 71 | if(svr.listen(1) < 0) |
sjallouli | 21:8f790ebb9f3c | 72 | { |
sjallouli | 21:8f790ebb9f3c | 73 | pc.printf("tcp server listen failed.\n\r"); |
hsgw | 13:25ce35614dd1 | 74 | return -1; |
sjallouli | 21:8f790ebb9f3c | 75 | } |
sjallouli | 21:8f790ebb9f3c | 76 | else |
sjallouli | 21:8f790ebb9f3c | 77 | { |
sjallouli | 21:8f790ebb9f3c | 78 | pc.printf("tcp server is listening...\n\r"); |
emilmont | 7:65188f4a8c25 | 79 | } |
hsgw | 13:25ce35614dd1 | 80 | |
hsgw | 13:25ce35614dd1 | 81 | //listening for http GET request |
sjallouli | 21:8f790ebb9f3c | 82 | while (serverIsListened) |
sjallouli | 21:8f790ebb9f3c | 83 | { |
sjallouli | 21:8f790ebb9f3c | 84 | //blocking mode(never timeout) |
sjallouli | 21:8f790ebb9f3c | 85 | if(svr.accept(client)<0) |
sjallouli | 21:8f790ebb9f3c | 86 | { |
sjallouli | 21:8f790ebb9f3c | 87 | pc.printf("failed to accept connection.\n\r"); |
sjallouli | 21:8f790ebb9f3c | 88 | } |
sjallouli | 21:8f790ebb9f3c | 89 | else |
sjallouli | 21:8f790ebb9f3c | 90 | { |
sjallouli | 21:8f790ebb9f3c | 91 | pc.printf("connection success!\n\rIP: %s\n\r",client.get_address()); |
sjallouli | 21:8f790ebb9f3c | 92 | clientIsConnected = true; |
Bongjun | 17:c42419afb2f8 | 93 | |
sjallouli | 21:8f790ebb9f3c | 94 | while(clientIsConnected) |
sjallouli | 21:8f790ebb9f3c | 95 | { |
sjallouli | 21:8f790ebb9f3c | 96 | char buffer[1024] = {}; |
sjallouli | 21:8f790ebb9f3c | 97 | |
sjallouli | 21:8f790ebb9f3c | 98 | switch(client.receive(buffer, 1023)) |
sjallouli | 21:8f790ebb9f3c | 99 | { |
sjallouli | 21:8f790ebb9f3c | 100 | case 0: |
sjallouli | 21:8f790ebb9f3c | 101 | pc.printf("recieved buffer is empty.\n\r"); |
sjallouli | 21:8f790ebb9f3c | 102 | clientIsConnected = false; |
sjallouli | 21:8f790ebb9f3c | 103 | break; |
sjallouli | 21:8f790ebb9f3c | 104 | |
sjallouli | 21:8f790ebb9f3c | 105 | case -1: |
sjallouli | 21:8f790ebb9f3c | 106 | pc.printf("failed to read data from client.\n\r"); |
sjallouli | 21:8f790ebb9f3c | 107 | clientIsConnected = false; |
sjallouli | 21:8f790ebb9f3c | 108 | break; |
sjallouli | 21:8f790ebb9f3c | 109 | |
sjallouli | 21:8f790ebb9f3c | 110 | default: |
sjallouli | 21:8f790ebb9f3c | 111 | pc.printf("Recieved Data: %d\n\r\n\r%.*s\n\r",strlen(buffer),strlen(buffer),buffer); |
sjallouli | 21:8f790ebb9f3c | 112 | |
sjallouli | 21:8f790ebb9f3c | 113 | if(buffer[0] == 'G' && buffer[1] == 'E' && buffer[2] == 'T' ) |
sjallouli | 21:8f790ebb9f3c | 114 | { |
sjallouli | 21:8f790ebb9f3c | 115 | pc.printf("GET request incomming.\n\r"); |
sjallouli | 21:8f790ebb9f3c | 116 | //setup http response header & data |
sjallouli | 21:8f790ebb9f3c | 117 | char echoHeader[256] = {}; |
sjallouli | 21:8f790ebb9f3c | 118 | sprintf(echoHeader,"HTTP/1.1 200 OK\n\rContent-Length: %d\n\rContent-Type: text\n\rConnection: Close\n\r\n\r",strlen(buffer)); |
sjallouli | 21:8f790ebb9f3c | 119 | client.send(echoHeader,strlen(echoHeader)); |
sjallouli | 21:8f790ebb9f3c | 120 | client.send(buffer,strlen(buffer)); |
sjallouli | 21:8f790ebb9f3c | 121 | clientIsConnected = false; |
sjallouli | 21:8f790ebb9f3c | 122 | pc.printf("echo back done.\n\r"); |
hsgw | 13:25ce35614dd1 | 123 | } |
sjallouli | 21:8f790ebb9f3c | 124 | |
sjallouli | 21:8f790ebb9f3c | 125 | break; |
hsgw | 13:25ce35614dd1 | 126 | } |
sjallouli | 21:8f790ebb9f3c | 127 | } |
sjallouli | 21:8f790ebb9f3c | 128 | |
sjallouli | 21:8f790ebb9f3c | 129 | pc.printf("close connection.\n\rtcp server is listening...\n\r"); |
sjallouli | 21:8f790ebb9f3c | 130 | |
sjallouli | 21:8f790ebb9f3c | 131 | client.close(); |
hsgw | 13:25ce35614dd1 | 132 | } |
sjallouli | 21:8f790ebb9f3c | 133 | } |
donatien | 0:bb128f0e952f | 134 | } |