Lucas Tanio
/
Socket-Server-TCP
Socket server TCP
main.cpp@0:a3418da504a0, 2020-07-30 (annotated)
- Committer:
- lucastanio
- Date:
- Thu Jul 30 17:34:15 2020 +0000
- Revision:
- 0:a3418da504a0
Socket TCP
Who changed what in which revision?
User | Revision | Line number | New 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(ð)==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(ð,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(ð_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 | } |