Socket server TCP

Dependencies:   http_server

Committer:
lucastanio
Date:
Thu Jul 30 17:34:15 2020 +0000
Revision:
0:a3418da504a0
Socket TCP

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lucastanio 0:a3418da504a0 1 #include "mbed.h"
lucastanio 0:a3418da504a0 2 #include "EthernetInterface.h"
lucastanio 0:a3418da504a0 3 #include "TCPSocket.h"
lucastanio 0:a3418da504a0 4 #include "http_server.h"
lucastanio 0:a3418da504a0 5 #include "LocalFileSystem.h"
lucastanio 0:a3418da504a0 6
lucastanio 0:a3418da504a0 7 #define PORT 1000
lucastanio 0:a3418da504a0 8 #define SOCKET_TIMEOUT_MS 2000
lucastanio 0:a3418da504a0 9
lucastanio 0:a3418da504a0 10 //Serial interface
lucastanio 0:a3418da504a0 11 Serial pc(USBTX, USBRX,115200);
lucastanio 0:a3418da504a0 12
lucastanio 0:a3418da504a0 13 //Initialize network interface
lucastanio 0:a3418da504a0 14 EthernetInterface eth;
lucastanio 0:a3418da504a0 15
lucastanio 0:a3418da504a0 16 nsapi_error_t status;
lucastanio 0:a3418da504a0 17 int n_bytes;
lucastanio 0:a3418da504a0 18 SocketAddress eth_addr;
lucastanio 0:a3418da504a0 19 TCPSocket socket;
lucastanio 0:a3418da504a0 20 TCPSocket* client;
lucastanio 0:a3418da504a0 21 int i;
lucastanio 0:a3418da504a0 22 Thread socket_thread;
lucastanio 0:a3418da504a0 23 Thread web_server_thread;
lucastanio 0:a3418da504a0 24 char recv_buffer[40];
lucastanio 0:a3418da504a0 25 char html_page[10000];
lucastanio 0:a3418da504a0 26 int html_page_size;
lucastanio 0:a3418da504a0 27
lucastanio 0:a3418da504a0 28 HttpServer web_server;
lucastanio 0:a3418da504a0 29
lucastanio 0:a3418da504a0 30 DigitalOut heartbeat(LED1);
lucastanio 0:a3418da504a0 31 DigitalOut socket_led(LED2);
lucastanio 0:a3418da504a0 32 DigitalOut webserver_led(LED3);
lucastanio 0:a3418da504a0 33
lucastanio 0:a3418da504a0 34 //There is a configuration file that can be accessed through usb in order to configure the device
lucastanio 0:a3418da504a0 35 LocalFileSystem local("local"); //Create the local filesystem under the name "local"
lucastanio 0:a3418da504a0 36
lucastanio 0:a3418da504a0 37 FILE *html_file; //Pointer to HTML file
lucastanio 0:a3418da504a0 38
lucastanio 0:a3418da504a0 39 void socket_port()
lucastanio 0:a3418da504a0 40 {
lucastanio 0:a3418da504a0 41 if(socket.open(&eth)==NSAPI_ERROR_OK)
lucastanio 0:a3418da504a0 42 pc.printf("Socket Opened\n\r");
lucastanio 0:a3418da504a0 43 else
lucastanio 0:a3418da504a0 44 pc.printf("Error opening socket\n\r");
lucastanio 0:a3418da504a0 45
lucastanio 0:a3418da504a0 46 if(socket.bind(PORT)==NSAPI_ERROR_OK)
lucastanio 0:a3418da504a0 47 pc.printf("Socket Bind Success\n\r");
lucastanio 0:a3418da504a0 48 else
lucastanio 0:a3418da504a0 49 pc.printf("Bind Error\n\r");
lucastanio 0:a3418da504a0 50
lucastanio 0:a3418da504a0 51 if(socket.listen(QUEUED_REQUESTS)==NSAPI_ERROR_OK)
lucastanio 0:a3418da504a0 52 pc.printf("Socket Listen Success\n\r");
lucastanio 0:a3418da504a0 53 else
lucastanio 0:a3418da504a0 54 pc.printf("Listen Error\n\r");
lucastanio 0:a3418da504a0 55
lucastanio 0:a3418da504a0 56 while(1)
lucastanio 0:a3418da504a0 57 {
lucastanio 0:a3418da504a0 58 client = socket.accept(&status);
lucastanio 0:a3418da504a0 59
lucastanio 0:a3418da504a0 60 pc.printf("After accept\n\r");
lucastanio 0:a3418da504a0 61 socket_led = !socket_led;
lucastanio 0:a3418da504a0 62 if(status==NSAPI_ERROR_OK)
lucastanio 0:a3418da504a0 63 {
lucastanio 0:a3418da504a0 64 client->set_timeout(SOCKET_TIMEOUT_MS);
lucastanio 0:a3418da504a0 65 n_bytes = client->recv(recv_buffer,40);
lucastanio 0:a3418da504a0 66 if(n_bytes>0)
lucastanio 0:a3418da504a0 67 {
lucastanio 0:a3418da504a0 68 for(i=0;i<n_bytes;i++)
lucastanio 0:a3418da504a0 69 pc.putc(recv_buffer[i]);
lucastanio 0:a3418da504a0 70 switch(recv_buffer[0])
lucastanio 0:a3418da504a0 71 {
lucastanio 0:a3418da504a0 72 case 'a':
lucastanio 0:a3418da504a0 73 pc.printf("a received\n\r");
lucastanio 0:a3418da504a0 74 client->send("a=2\n\r",5);
lucastanio 0:a3418da504a0 75 break;
lucastanio 0:a3418da504a0 76 case 'b':
lucastanio 0:a3418da504a0 77 pc.printf("b received\n\r");
lucastanio 0:a3418da504a0 78 client->send("b=5\n\r",5);
lucastanio 0:a3418da504a0 79 break;
lucastanio 0:a3418da504a0 80 default:
lucastanio 0:a3418da504a0 81 pc.printf("ERROR>NOT-A-CMD\n\r");
lucastanio 0:a3418da504a0 82 client->send("ERROR>NOT-A-CMD\n\r",17);
lucastanio 0:a3418da504a0 83 }
lucastanio 0:a3418da504a0 84 ThisThread::sleep_for(2000);
lucastanio 0:a3418da504a0 85 }
lucastanio 0:a3418da504a0 86 else
lucastanio 0:a3418da504a0 87 pc.printf("Receiving Error: %d\n\r",n_bytes);
lucastanio 0:a3418da504a0 88 client->close();
lucastanio 0:a3418da504a0 89 }
lucastanio 0:a3418da504a0 90 else
lucastanio 0:a3418da504a0 91 pc.printf("Accept Error: %d\n\r",status);
lucastanio 0:a3418da504a0 92 }
lucastanio 0:a3418da504a0 93 }
lucastanio 0:a3418da504a0 94
lucastanio 0:a3418da504a0 95 void web_server_func()
lucastanio 0:a3418da504a0 96 {
lucastanio 0:a3418da504a0 97 web_server.init(&eth,html_page,html_page_size);
lucastanio 0:a3418da504a0 98 while(1)
lucastanio 0:a3418da504a0 99 {
lucastanio 0:a3418da504a0 100 web_server.run();
lucastanio 0:a3418da504a0 101 webserver_led = !webserver_led;
lucastanio 0:a3418da504a0 102 }
lucastanio 0:a3418da504a0 103 }
lucastanio 0:a3418da504a0 104
lucastanio 0:a3418da504a0 105 int main()
lucastanio 0:a3418da504a0 106 {
lucastanio 0:a3418da504a0 107 pc.printf("Starting Firmware\n\r");
lucastanio 0:a3418da504a0 108
lucastanio 0:a3418da504a0 109 // Initializng webserver
lucastanio 0:a3418da504a0 110 html_file = fopen("/local/index.htm","r"); // Open "index.html" on the local file system for reading
lucastanio 0:a3418da504a0 111 if(html_file==NULL){ //If file doesnt exist
lucastanio 0:a3418da504a0 112 pc.printf("File not found: index.htm\n\r");
lucastanio 0:a3418da504a0 113 }
lucastanio 0:a3418da504a0 114 else
lucastanio 0:a3418da504a0 115 { //File exists
lucastanio 0:a3418da504a0 116 pc.printf("HMTL file found\n\r");
lucastanio 0:a3418da504a0 117 fseek(html_file, 0, SEEK_SET);
lucastanio 0:a3418da504a0 118 html_page_size = 0;
lucastanio 0:a3418da504a0 119 while (!feof(html_file))
lucastanio 0:a3418da504a0 120 html_page[html_page_size++]= getc(html_file);
lucastanio 0:a3418da504a0 121 if(feof(html_file))
lucastanio 0:a3418da504a0 122 html_page_size--;
lucastanio 0:a3418da504a0 123 }
lucastanio 0:a3418da504a0 124
lucastanio 0:a3418da504a0 125 // Initialising Ethernet Interface
lucastanio 0:a3418da504a0 126 do{
lucastanio 0:a3418da504a0 127 status = eth.connect();
lucastanio 0:a3418da504a0 128 if(status == NSAPI_ERROR_OK || status == NSAPI_ERROR_IS_CONNECTED)
lucastanio 0:a3418da504a0 129 pc.printf("Internet connection established\n\r");
lucastanio 0:a3418da504a0 130 else
lucastanio 0:a3418da504a0 131 pc.printf("No internet connnection: Error Code: %d\n\r", status);
lucastanio 0:a3418da504a0 132 }while(status != NSAPI_ERROR_OK && status != NSAPI_ERROR_IS_CONNECTED);
lucastanio 0:a3418da504a0 133
lucastanio 0:a3418da504a0 134 // Checking IP Address (DHCP Mode)
lucastanio 0:a3418da504a0 135 if(eth.get_ip_address(&eth_addr)==NSAPI_ERROR_OK)
lucastanio 0:a3418da504a0 136 pc.printf("IP address: %s\n\r", eth_addr.get_ip_address() ? eth_addr.get_ip_address() : "None");
lucastanio 0:a3418da504a0 137 else
lucastanio 0:a3418da504a0 138 pc.printf("DHCP failure - acquiring the IP address has failed\n\r");
lucastanio 0:a3418da504a0 139
lucastanio 0:a3418da504a0 140 //while(1){}
lucastanio 0:a3418da504a0 141
lucastanio 0:a3418da504a0 142
lucastanio 0:a3418da504a0 143 socket_thread.start(socket_port);
lucastanio 0:a3418da504a0 144 web_server_thread.start(web_server_func);
lucastanio 0:a3418da504a0 145
lucastanio 0:a3418da504a0 146 while (true) {
lucastanio 0:a3418da504a0 147 heartbeat = !heartbeat;
lucastanio 0:a3418da504a0 148 ThisThread::sleep_for(1000);
lucastanio 0:a3418da504a0 149 }
lucastanio 0:a3418da504a0 150 }