Y SI / Mbed OS TCP-Server-sample
Committer:
YSI
Date:
Thu Apr 08 12:39:50 2021 +0000
Revision:
0:d3cd3a4b962c
TCP-Server-sample

Who changed what in which revision?

UserRevisionLine numberNew contents of line
YSI 0:d3cd3a4b962c 1 #include "main.h"
YSI 0:d3cd3a4b962c 2
YSI 0:d3cd3a4b962c 3 int main()
YSI 0:d3cd3a4b962c 4 {
YSI 0:d3cd3a4b962c 5 Led = eth_status;
YSI 0:d3cd3a4b962c 6 queue = mbed_event_queue();
YSI 0:d3cd3a4b962c 7 while(1) if(eth_connect()) Led = recv();
YSI 0:d3cd3a4b962c 8 }
YSI 0:d3cd3a4b962c 9
YSI 0:d3cd3a4b962c 10 bool eth_connect(void)
YSI 0:d3cd3a4b962c 11 {
YSI 0:d3cd3a4b962c 12 switch(eth.get_connection_status())
YSI 0:d3cd3a4b962c 13 {
YSI 0:d3cd3a4b962c 14 case NSAPI_STATUS_DISCONNECTED:
YSI 0:d3cd3a4b962c 15 eth.set_blocking(false);
YSI 0:d3cd3a4b962c 16 eth.set_network(SocketAddress(IP_SERVER), SocketAddress("255.255.255.0"), SocketAddress("192.168.1.1")); // if not static eth.set_dhcp(true);
YSI 0:d3cd3a4b962c 17 eth.attach(callback(&eth_event));
YSI 0:d3cd3a4b962c 18 eth.connect(); break;
YSI 0:d3cd3a4b962c 19 case NSAPI_STATUS_GLOBAL_UP: return CONNECT; break;
YSI 0:d3cd3a4b962c 20 default: break;
YSI 0:d3cd3a4b962c 21 }
YSI 0:d3cd3a4b962c 22 return false;
YSI 0:d3cd3a4b962c 23 }
YSI 0:d3cd3a4b962c 24
YSI 0:d3cd3a4b962c 25 void eth_event(nsapi_event_t status, intptr_t param)
YSI 0:d3cd3a4b962c 26 {
YSI 0:d3cd3a4b962c 27 switch(param)
YSI 0:d3cd3a4b962c 28 {
YSI 0:d3cd3a4b962c 29 case NSAPI_STATUS_DISCONNECTED: eth_status = RED_DISCONNECTED; break;
YSI 0:d3cd3a4b962c 30 case NSAPI_STATUS_CONNECTING:if(eth_status == BLUE_CLIENT) clientTCP->close();
YSI 0:d3cd3a4b962c 31 eth_status = YELLOW_CONNECTING; break;
YSI 0:d3cd3a4b962c 32 case NSAPI_STATUS_GLOBAL_UP: eth_status = GREEN_GLOBAL_UP;
YSI 0:d3cd3a4b962c 33 if(!CONNECT) serverTCP_connect();
YSI 0:d3cd3a4b962c 34 else serverTCP_event(); break;
YSI 0:d3cd3a4b962c 35 default: break;
YSI 0:d3cd3a4b962c 36 }
YSI 0:d3cd3a4b962c 37 }
YSI 0:d3cd3a4b962c 38
YSI 0:d3cd3a4b962c 39 void eth_state(void)
YSI 0:d3cd3a4b962c 40 {
YSI 0:d3cd3a4b962c 41 switch(eth.get_connection_status())
YSI 0:d3cd3a4b962c 42 {
YSI 0:d3cd3a4b962c 43 case NSAPI_STATUS_DISCONNECTED: eth_status = RED_DISCONNECTED; break;
YSI 0:d3cd3a4b962c 44 case NSAPI_STATUS_CONNECTING: eth_status = YELLOW_CONNECTING; break;
YSI 0:d3cd3a4b962c 45 case NSAPI_STATUS_GLOBAL_UP: eth_status = GREEN_GLOBAL_UP; break;
YSI 0:d3cd3a4b962c 46 default: break;
YSI 0:d3cd3a4b962c 47 }
YSI 0:d3cd3a4b962c 48 }
YSI 0:d3cd3a4b962c 49
YSI 0:d3cd3a4b962c 50 bool serverTCP_connect(void)
YSI 0:d3cd3a4b962c 51 {
YSI 0:d3cd3a4b962c 52 if(!CONNECT)
YSI 0:d3cd3a4b962c 53 if(serverTCP.open(&eth) == NSAPI_ERROR_OK)
YSI 0:d3cd3a4b962c 54 if(serverTCP.bind(PORT_SERVER) == NSAPI_ERROR_OK)
YSI 0:d3cd3a4b962c 55 if(serverTCP.listen() == NSAPI_ERROR_OK)
YSI 0:d3cd3a4b962c 56 {
YSI 0:d3cd3a4b962c 57 serverTCP.set_blocking(false);
YSI 0:d3cd3a4b962c 58 serverTCP.sigio(callback(&serverTCP_event));
YSI 0:d3cd3a4b962c 59 CONNECT = true;
YSI 0:d3cd3a4b962c 60 }
YSI 0:d3cd3a4b962c 61 return CONNECT;
YSI 0:d3cd3a4b962c 62 }
YSI 0:d3cd3a4b962c 63
YSI 0:d3cd3a4b962c 64 void serverTCP_event(void)
YSI 0:d3cd3a4b962c 65 {
YSI 0:d3cd3a4b962c 66 queue->call(&serverTCP_accept);
YSI 0:d3cd3a4b962c 67 }
YSI 0:d3cd3a4b962c 68
YSI 0:d3cd3a4b962c 69 void serverTCP_accept(void)
YSI 0:d3cd3a4b962c 70 {
YSI 0:d3cd3a4b962c 71 if(eth_status == GREEN_GLOBAL_UP)
YSI 0:d3cd3a4b962c 72 {
YSI 0:d3cd3a4b962c 73 nsapi_error_t ack = NSAPI_ERROR_WOULD_BLOCK;
YSI 0:d3cd3a4b962c 74 eth_status = MAGENTA_ACCEPT;
YSI 0:d3cd3a4b962c 75 clientTCP = serverTCP.accept(&ack);
YSI 0:d3cd3a4b962c 76 switch(ack)
YSI 0:d3cd3a4b962c 77 {
YSI 0:d3cd3a4b962c 78 case NSAPI_ERROR_OK:
YSI 0:d3cd3a4b962c 79 clientTCP->set_timeout(TIMEOUT_SERVER); // config client bloquante avec timeout sinon limite de transmission a 1072 octets
YSI 0:d3cd3a4b962c 80 eth_status = BLUE_CLIENT;
YSI 0:d3cd3a4b962c 81 break;
YSI 0:d3cd3a4b962c 82 case NSAPI_ERROR_NO_CONNECTION:
YSI 0:d3cd3a4b962c 83 eth_state();
YSI 0:d3cd3a4b962c 84 serverTCP_event();
YSI 0:d3cd3a4b962c 85 break;
YSI 0:d3cd3a4b962c 86 default:
YSI 0:d3cd3a4b962c 87 eth_state();
YSI 0:d3cd3a4b962c 88 break;
YSI 0:d3cd3a4b962c 89 }
YSI 0:d3cd3a4b962c 90 }
YSI 0:d3cd3a4b962c 91 }
YSI 0:d3cd3a4b962c 92
YSI 0:d3cd3a4b962c 93 enum_status recv(void)
YSI 0:d3cd3a4b962c 94 {
YSI 0:d3cd3a4b962c 95 if(eth_connect() && (eth_status == BLUE_CLIENT))
YSI 0:d3cd3a4b962c 96 {
YSI 0:d3cd3a4b962c 97 char buffer[BUFFER_SIZE] = {0};
YSI 0:d3cd3a4b962c 98 nsapi_error_t ack = NSAPI_ERROR_WOULD_BLOCK, size = 0;
YSI 0:d3cd3a4b962c 99 while((ack = clientTCP->recv(&buffer[size], BUFFER_SIZE-size)) > NSAPI_ERROR_OK) size += ack;
YSI 0:d3cd3a4b962c 100 if(!size && (ack == NSAPI_ERROR_OK) || (ack == NSAPI_ERROR_NO_CONNECTION))
YSI 0:d3cd3a4b962c 101 {
YSI 0:d3cd3a4b962c 102 clientTCP->close();
YSI 0:d3cd3a4b962c 103 eth_state();
YSI 0:d3cd3a4b962c 104 serverTCP_event();
YSI 0:d3cd3a4b962c 105 }
YSI 0:d3cd3a4b962c 106 if(size)
YSI 0:d3cd3a4b962c 107 {
YSI 0:d3cd3a4b962c 108 string cmd(buffer);
YSI 0:d3cd3a4b962c 109 for(char &c : cmd) if((c >= 'a') && (c <= 'z')) c += 'A'-'a';
YSI 0:d3cd3a4b962c 110 if(!cmd.empty())
YSI 0:d3cd3a4b962c 111 {
YSI 0:d3cd3a4b962c 112 ostringstream ssend;
YSI 0:d3cd3a4b962c 113 if(cmd.find("GET / HTTP") != string::npos)
YSI 0:d3cd3a4b962c 114 {
YSI 0:d3cd3a4b962c 115 ssend << "HTTP/1.1 200 OK\r\nContent-Type: text/html; charset=utf-8\r\nAccess-Control-Allow-Origin: *\r\n\r\n";
YSI 0:d3cd3a4b962c 116 ssend << "<!DOCTYPE html>\r\n<html>\r\n\t<head>\r\n\t\t<title>" << MBED_PROJECT << "</title>\r\n\t\t<meta http-equiv=refresh content=10>\r\n\t</head>";
YSI 0:d3cd3a4b962c 117 ssend << "\r\n\t<body style=background-color:dimgray>\r\n\t\t<center>\r\n\t\t\t<h1>" << MBED_PROJECT << "</h1>\r\n\t\t</center>\r\n\t</body>\r\n</html>";
YSI 0:d3cd3a4b962c 118 }
YSI 0:d3cd3a4b962c 119 else ssend << "HTTP/1.1 204 No Content\r\n";
YSI 0:d3cd3a4b962c 120 send(ssend.str());
YSI 0:d3cd3a4b962c 121 }
YSI 0:d3cd3a4b962c 122 }
YSI 0:d3cd3a4b962c 123 }
YSI 0:d3cd3a4b962c 124 return eth_status;
YSI 0:d3cd3a4b962c 125 }
YSI 0:d3cd3a4b962c 126
YSI 0:d3cd3a4b962c 127 nsapi_error_t send(const string& buff)
YSI 0:d3cd3a4b962c 128 {
YSI 0:d3cd3a4b962c 129 nsapi_error_t ack = NSAPI_ERROR_WOULD_BLOCK;
YSI 0:d3cd3a4b962c 130 string ssend(buff+"\n");
YSI 0:d3cd3a4b962c 131 if((eth_status == BLUE_CLIENT) && !buff.empty())
YSI 0:d3cd3a4b962c 132 ack = clientTCP->send(ssend.c_str(), ssend.size());
YSI 0:d3cd3a4b962c 133 //------------------- HTTP request must close
YSI 0:d3cd3a4b962c 134 clientTCP->close();
YSI 0:d3cd3a4b962c 135 eth_state();
YSI 0:d3cd3a4b962c 136 serverTCP_event();
YSI 0:d3cd3a4b962c 137 //-------------------
YSI 0:d3cd3a4b962c 138 return ack;
YSI 0:d3cd3a4b962c 139 }