This is a working example for the depreciated string based API mbed server socket function. Solid on LPC1768. I have included a 32k favicon file for web page stability. Multiple simultaneous connections are no issue here.
main.cpp@1:b7b5017e8d01, 2020-06-13 (annotated)
- Committer:
- star297
- Date:
- Sat Jun 13 13:24:10 2020 +0000
- Revision:
- 1:b7b5017e8d01
- Parent:
- 0:8e3c163d3dbb
tidy .json
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
star297 | 0:8e3c163d3dbb | 1 | #include "mbed.h" |
star297 | 0:8e3c163d3dbb | 2 | #include "NetworkInterface.h" |
star297 | 0:8e3c163d3dbb | 3 | #include "NTPclient.h" |
star297 | 0:8e3c163d3dbb | 4 | #include "favicon_ico.h" |
star297 | 0:8e3c163d3dbb | 5 | |
star297 | 0:8e3c163d3dbb | 6 | // define static IP settings |
star297 | 0:8e3c163d3dbb | 7 | #define IP "192.168.1.180" |
star297 | 0:8e3c163d3dbb | 8 | #define GATEWAY "192.168.1.1" |
star297 | 0:8e3c163d3dbb | 9 | #define NETMASK "255.255.255.0" |
star297 | 0:8e3c163d3dbb | 10 | #define PORT 80 |
star297 | 0:8e3c163d3dbb | 11 | |
star297 | 0:8e3c163d3dbb | 12 | NetworkInterface *net = NetworkInterface::get_default_instance(); |
star297 | 0:8e3c163d3dbb | 13 | |
star297 | 0:8e3c163d3dbb | 14 | TCPServer server; |
star297 | 0:8e3c163d3dbb | 15 | TCPSocket client; |
star297 | 0:8e3c163d3dbb | 16 | SocketAddress clientAddress; |
star297 | 0:8e3c163d3dbb | 17 | |
star297 | 0:8e3c163d3dbb | 18 | NTPclient ntp(*net); |
star297 | 0:8e3c163d3dbb | 19 | |
star297 | 0:8e3c163d3dbb | 20 | DigitalOut led(LED1); |
star297 | 0:8e3c163d3dbb | 21 | time_t seconds; |
star297 | 0:8e3c163d3dbb | 22 | |
star297 | 0:8e3c163d3dbb | 23 | char requestType[16]; |
star297 | 0:8e3c163d3dbb | 24 | char request[64]; |
star297 | 0:8e3c163d3dbb | 25 | |
star297 | 0:8e3c163d3dbb | 26 | char *sendbuffer = new char[512]; // create data send buffer space |
star297 | 0:8e3c163d3dbb | 27 | char recevbuffer[1024]; // create http receive buffer space |
star297 | 0:8e3c163d3dbb | 28 | |
star297 | 0:8e3c163d3dbb | 29 | int main() |
star297 | 0:8e3c163d3dbb | 30 | { |
star297 | 0:8e3c163d3dbb | 31 | printf("\033[0m\033[2J\033[HTCP NTP client and server example\r\n\n\n"); // Tera Term clear screen |
star297 | 0:8e3c163d3dbb | 32 | seconds = time(NULL); |
star297 | 0:8e3c163d3dbb | 33 | printf("Initial RTC time: %s\r\n", ctime(&seconds)); |
star297 | 0:8e3c163d3dbb | 34 | |
star297 | 0:8e3c163d3dbb | 35 | // Include to set static IP |
star297 | 0:8e3c163d3dbb | 36 | net->set_network (IP, NETMASK, GATEWAY); |
star297 | 0:8e3c163d3dbb | 37 | |
star297 | 0:8e3c163d3dbb | 38 | printf("Connecting to network...\n\n"); |
star297 | 0:8e3c163d3dbb | 39 | |
star297 | 0:8e3c163d3dbb | 40 | nsapi_size_or_error_t r = net->connect(); |
star297 | 0:8e3c163d3dbb | 41 | if (r != 0) { |
star297 | 0:8e3c163d3dbb | 42 | printf("Error! net.connect() returned: %d\n", r); |
star297 | 0:8e3c163d3dbb | 43 | while(1); // stop here and find the connection problem |
star297 | 0:8e3c163d3dbb | 44 | } |
star297 | 0:8e3c163d3dbb | 45 | |
star297 | 0:8e3c163d3dbb | 46 | const char *ip = net->get_ip_address(); |
star297 | 0:8e3c163d3dbb | 47 | |
star297 | 0:8e3c163d3dbb | 48 | if(ip){ |
star297 | 0:8e3c163d3dbb | 49 | printf("\nConnected\n\nGet NTP time...\n"); |
star297 | 0:8e3c163d3dbb | 50 | if(ntp.getNTP("0.pool.ntp.org",3600,1,1)){ |
star297 | 0:8e3c163d3dbb | 51 | seconds = time(NULL); |
star297 | 0:8e3c163d3dbb | 52 | printf("RTC time set by NTP: %s\n\n", ctime(&seconds)); |
star297 | 0:8e3c163d3dbb | 53 | } |
star297 | 0:8e3c163d3dbb | 54 | else{printf("No NTP could not set RTC !!\n\n"); |
star297 | 0:8e3c163d3dbb | 55 | } |
star297 | 0:8e3c163d3dbb | 56 | }else{ |
star297 | 0:8e3c163d3dbb | 57 | printf("No IP!!\n"); |
star297 | 0:8e3c163d3dbb | 58 | while(1); |
star297 | 0:8e3c163d3dbb | 59 | } |
star297 | 0:8e3c163d3dbb | 60 | |
star297 | 0:8e3c163d3dbb | 61 | printf("Starting Server...\r\n\n"); |
star297 | 0:8e3c163d3dbb | 62 | |
star297 | 0:8e3c163d3dbb | 63 | /* Open the server on ethernet stack */ |
star297 | 0:8e3c163d3dbb | 64 | server.open(net); |
star297 | 0:8e3c163d3dbb | 65 | /* Bind the HTTP port (TCP 80) to the server */ |
star297 | 0:8e3c163d3dbb | 66 | server.bind(ip, 80); |
star297 | 0:8e3c163d3dbb | 67 | /* Can handle 5 simultaneous connections */ |
star297 | 0:8e3c163d3dbb | 68 | server.listen(5); |
star297 | 0:8e3c163d3dbb | 69 | //listening for http GET request |
star297 | 0:8e3c163d3dbb | 70 | printf("Ready\r\n\n"); |
star297 | 0:8e3c163d3dbb | 71 | |
star297 | 0:8e3c163d3dbb | 72 | printf("The Server IP address: '%s'\n", ip); |
star297 | 0:8e3c163d3dbb | 73 | printf("Waiting for connection....\r\n\n"); |
star297 | 0:8e3c163d3dbb | 74 | |
star297 | 0:8e3c163d3dbb | 75 | nsapi_size_or_error_t result; |
star297 | 0:8e3c163d3dbb | 76 | |
star297 | 0:8e3c163d3dbb | 77 | while(1){ |
star297 | 0:8e3c163d3dbb | 78 | |
star297 | 0:8e3c163d3dbb | 79 | server.accept(&client, &clientAddress); |
star297 | 0:8e3c163d3dbb | 80 | |
star297 | 0:8e3c163d3dbb | 81 | led=1; |
star297 | 0:8e3c163d3dbb | 82 | result=client.recv(recevbuffer, 1024); |
star297 | 0:8e3c163d3dbb | 83 | if (result < 0) { |
star297 | 0:8e3c163d3dbb | 84 | printf("Error! socket.recv() returned: %d\n", result); |
star297 | 0:8e3c163d3dbb | 85 | } |
star297 | 0:8e3c163d3dbb | 86 | |
star297 | 0:8e3c163d3dbb | 87 | sscanf(recevbuffer,"%s %s",requestType,request); |
star297 | 0:8e3c163d3dbb | 88 | printf("\nClient IP: %s \n", clientAddress.get_ip_address()); |
star297 | 0:8e3c163d3dbb | 89 | //printf("Received Msg:\n%s\n\n", recevbuffer); // include to view complete receive buffer |
star297 | 0:8e3c163d3dbb | 90 | printf("request: %s Type: %s\n", requestType,request); |
star297 | 0:8e3c163d3dbb | 91 | |
star297 | 0:8e3c163d3dbb | 92 | if(strcmp(request,"/")==0){ |
star297 | 0:8e3c163d3dbb | 93 | //send current mcu rtc time to client |
star297 | 0:8e3c163d3dbb | 94 | time_t seconds = time(NULL); |
star297 | 0:8e3c163d3dbb | 95 | sprintf(sendbuffer,"HTTP/1.1 200 OK\n Content-type: text/plain\r\n\r\n <h1> Hello !!</h1>\r\n\n <h1>Time is: %s</h1>\r\n", ctime(&seconds)); |
star297 | 0:8e3c163d3dbb | 96 | printf("Sending Message\n"); |
star297 | 0:8e3c163d3dbb | 97 | result=client.send(sendbuffer, strlen(sendbuffer)); // send data in buffer to http port. |
star297 | 0:8e3c163d3dbb | 98 | printf("Sent Message, %d bytes\n",result); |
star297 | 0:8e3c163d3dbb | 99 | } |
star297 | 0:8e3c163d3dbb | 100 | else if(strcmp(request,"/favicon.ico")==0){ |
star297 | 0:8e3c163d3dbb | 101 | //send favicon if requested |
star297 | 0:8e3c163d3dbb | 102 | printf("Sending Favicon\n"); |
star297 | 0:8e3c163d3dbb | 103 | result=client.send((char*)favicon_ico,sizeof(favicon_ico)); |
star297 | 0:8e3c163d3dbb | 104 | printf("Sent Favicon, %d bytes\n",result); |
star297 | 0:8e3c163d3dbb | 105 | } |
star297 | 0:8e3c163d3dbb | 106 | else{ |
star297 | 0:8e3c163d3dbb | 107 | // send page not found reply |
star297 | 0:8e3c163d3dbb | 108 | sprintf(sendbuffer,"HTTP/1.1 404 Not Found\nContent-type: text/plain\r\n\r\npage not found"); |
star297 | 0:8e3c163d3dbb | 109 | printf("Sending Not Found Message\n"); |
star297 | 0:8e3c163d3dbb | 110 | result=client.send(sendbuffer, strlen(sendbuffer)); |
star297 | 0:8e3c163d3dbb | 111 | printf("Sent Not Found Message, %d bytes\n",result); |
star297 | 0:8e3c163d3dbb | 112 | } |
star297 | 0:8e3c163d3dbb | 113 | //close socket |
star297 | 0:8e3c163d3dbb | 114 | client.close(); |
star297 | 0:8e3c163d3dbb | 115 | led=0; |
star297 | 0:8e3c163d3dbb | 116 | } |
star297 | 0:8e3c163d3dbb | 117 | } |