Thermometer connected to internet
Dependencies: BME280 EthernetInterface FXOS8700Q HTTPClient-wolfSSL NTPClient NetworkAPI OAuth4Tw TSL2561_I2C eCompass_FPU_Lib mbed-rtos mbed wolfSSL
Fork of TCP_Server_Example by
EnvServer.cpp@12:12369ee344ab, 2015-09-27 (annotated)
- Committer:
- zeus3110
- Date:
- Sun Sep 27 11:04:54 2015 +0000
- Revision:
- 12:12369ee344ab
Network thermometer test program
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
zeus3110 | 12:12369ee344ab | 1 | #include "EnvServer.h" |
zeus3110 | 12:12369ee344ab | 2 | #include "Sensor.h" |
zeus3110 | 12:12369ee344ab | 3 | |
zeus3110 | 12:12369ee344ab | 4 | Select select; |
zeus3110 | 12:12369ee344ab | 5 | tcp::Socket server; |
zeus3110 | 12:12369ee344ab | 6 | tcp::Socket client[MAX_CLIENTS]; |
zeus3110 | 12:12369ee344ab | 7 | tcp::Socket *socket = NULL; |
zeus3110 | 12:12369ee344ab | 8 | |
zeus3110 | 12:12369ee344ab | 9 | void EnvServer(void const *arg) |
zeus3110 | 12:12369ee344ab | 10 | { |
zeus3110 | 12:12369ee344ab | 11 | int result = 0; |
zeus3110 | 12:12369ee344ab | 12 | int index = 0; |
zeus3110 | 12:12369ee344ab | 13 | int num=0; |
zeus3110 | 12:12369ee344ab | 14 | char SendBuf[16]; |
zeus3110 | 12:12369ee344ab | 15 | network::Buffer buffer(256); |
zeus3110 | 12:12369ee344ab | 16 | //std::string message("Hello world!"); |
zeus3110 | 12:12369ee344ab | 17 | |
zeus3110 | 12:12369ee344ab | 18 | // Configure the server socket (assume everty thing works) |
zeus3110 | 12:12369ee344ab | 19 | server.open(); |
zeus3110 | 12:12369ee344ab | 20 | server.bind(WAIT_PORT); |
zeus3110 | 12:12369ee344ab | 21 | server.listen(MAX_CLIENTS); |
zeus3110 | 12:12369ee344ab | 22 | printf("Start waiting ...\r\n"); |
zeus3110 | 12:12369ee344ab | 23 | |
zeus3110 | 12:12369ee344ab | 24 | // Add sockets to the select api |
zeus3110 | 12:12369ee344ab | 25 | select.set(&server, Select::Read); |
zeus3110 | 12:12369ee344ab | 26 | for (index = 0; index < MAX_CLIENTS; index++) { |
zeus3110 | 12:12369ee344ab | 27 | select.set(&client[index], Select::Read); |
zeus3110 | 12:12369ee344ab | 28 | } |
zeus3110 | 12:12369ee344ab | 29 | |
zeus3110 | 12:12369ee344ab | 30 | do { |
zeus3110 | 12:12369ee344ab | 31 | // Wait for activity |
zeus3110 | 12:12369ee344ab | 32 | result = select.wait(); |
zeus3110 | 12:12369ee344ab | 33 | if (result < -1) { |
zeus3110 | 12:12369ee344ab | 34 | printf("Failed to select\n\r"); |
zeus3110 | 12:12369ee344ab | 35 | break; |
zeus3110 | 12:12369ee344ab | 36 | } |
zeus3110 | 12:12369ee344ab | 37 | |
zeus3110 | 12:12369ee344ab | 38 | // Get the first socket |
zeus3110 | 12:12369ee344ab | 39 | socket = (tcp::Socket *)select.getReadable(); |
zeus3110 | 12:12369ee344ab | 40 | |
zeus3110 | 12:12369ee344ab | 41 | for (; socket != NULL; socket = (tcp::Socket *)select.getReadable()) { |
zeus3110 | 12:12369ee344ab | 42 | // Check if there was a connection request. |
zeus3110 | 12:12369ee344ab | 43 | if (socket->getHandle() == server.getHandle()) { |
zeus3110 | 12:12369ee344ab | 44 | // Find an unused client |
zeus3110 | 12:12369ee344ab | 45 | for (index = 0; index < MAX_CLIENTS; index++) { |
zeus3110 | 12:12369ee344ab | 46 | if (client[index].getStatus() == network::Socket::Closed) { |
zeus3110 | 12:12369ee344ab | 47 | break; |
zeus3110 | 12:12369ee344ab | 48 | } |
zeus3110 | 12:12369ee344ab | 49 | } |
zeus3110 | 12:12369ee344ab | 50 | |
zeus3110 | 12:12369ee344ab | 51 | // Maximum connections reached |
zeus3110 | 12:12369ee344ab | 52 | if (index == MAX_CLIENTS) { |
zeus3110 | 12:12369ee344ab | 53 | printf("Maximum connections reached\n\r"); |
zeus3110 | 12:12369ee344ab | 54 | continue; |
zeus3110 | 12:12369ee344ab | 55 | } |
zeus3110 | 12:12369ee344ab | 56 | |
zeus3110 | 12:12369ee344ab | 57 | // Accept the client |
zeus3110 | 12:12369ee344ab | 58 | socket->accept(client[index]); |
zeus3110 | 12:12369ee344ab | 59 | printf("Client connected %s:%d\n\r", |
zeus3110 | 12:12369ee344ab | 60 | client[index].getRemoteEndpoint().getAddress().toString().c_str(), |
zeus3110 | 12:12369ee344ab | 61 | client[index].getRemoteEndpoint().getPort()); |
zeus3110 | 12:12369ee344ab | 62 | |
zeus3110 | 12:12369ee344ab | 63 | // Send a nice message to the client |
zeus3110 | 12:12369ee344ab | 64 | //client[index].write((void *)message.data(), message.size()); |
zeus3110 | 12:12369ee344ab | 65 | continue; |
zeus3110 | 12:12369ee344ab | 66 | } |
zeus3110 | 12:12369ee344ab | 67 | |
zeus3110 | 12:12369ee344ab | 68 | // It was not the server socket, so it must be a client talking to us. |
zeus3110 | 12:12369ee344ab | 69 | num=socket->read(buffer); |
zeus3110 | 12:12369ee344ab | 70 | switch (num) { |
zeus3110 | 12:12369ee344ab | 71 | case 0: |
zeus3110 | 12:12369ee344ab | 72 | // Remote end disconnected |
zeus3110 | 12:12369ee344ab | 73 | printf("Client disconnected %s:%d\n\r", |
zeus3110 | 12:12369ee344ab | 74 | socket->getRemoteEndpoint().getAddress().toString().c_str(), |
zeus3110 | 12:12369ee344ab | 75 | socket->getRemoteEndpoint().getPort()); |
zeus3110 | 12:12369ee344ab | 76 | |
zeus3110 | 12:12369ee344ab | 77 | // Close socket |
zeus3110 | 12:12369ee344ab | 78 | socket->close(); |
zeus3110 | 12:12369ee344ab | 79 | break; |
zeus3110 | 12:12369ee344ab | 80 | |
zeus3110 | 12:12369ee344ab | 81 | case -1: |
zeus3110 | 12:12369ee344ab | 82 | printf("Error while reading data from socket\n\r"); |
zeus3110 | 12:12369ee344ab | 83 | socket->close(); |
zeus3110 | 12:12369ee344ab | 84 | break; |
zeus3110 | 12:12369ee344ab | 85 | |
zeus3110 | 12:12369ee344ab | 86 | default: |
zeus3110 | 12:12369ee344ab | 87 | printf("Message from %s:%d\n\r", |
zeus3110 | 12:12369ee344ab | 88 | socket->getRemoteEndpoint().getAddress().toString().c_str(), |
zeus3110 | 12:12369ee344ab | 89 | socket->getRemoteEndpoint().getPort()); |
zeus3110 | 12:12369ee344ab | 90 | |
zeus3110 | 12:12369ee344ab | 91 | //command |
zeus3110 | 12:12369ee344ab | 92 | if(strcmp((char *)buffer.data(),TEMP_CMD)==0) { |
zeus3110 | 12:12369ee344ab | 93 | printf("Temperature:\r\n"); |
zeus3110 | 12:12369ee344ab | 94 | sprintf(SendBuf,"%2.2f",pSensor->getTemperature()); |
zeus3110 | 12:12369ee344ab | 95 | } else if(strcmp((char *)buffer.data(),HUMIDITY_CMD)==0) { |
zeus3110 | 12:12369ee344ab | 96 | printf("Humidity:\r\n"); |
zeus3110 | 12:12369ee344ab | 97 | sprintf(SendBuf,"%3.2f",pSensor->getHumidity()); |
zeus3110 | 12:12369ee344ab | 98 | } else if(strcmp((char *)buffer.data(),PRESSURE_CMD)==0) { |
zeus3110 | 12:12369ee344ab | 99 | printf("Pressure:\r\n"); |
zeus3110 | 12:12369ee344ab | 100 | sprintf(SendBuf,"%4.2f",pSensor->getPressure()); |
zeus3110 | 12:12369ee344ab | 101 | } else if(strcmp((char *)buffer.data(),ILLUM_CMD)==0) { |
zeus3110 | 12:12369ee344ab | 102 | printf("Illuminance:\r\n"); |
zeus3110 | 12:12369ee344ab | 103 | sprintf(SendBuf,"%5.2f",pLumSensor->getLux()); |
zeus3110 | 12:12369ee344ab | 104 | } else { |
zeus3110 | 12:12369ee344ab | 105 | printf("Unknown command:\r\n"); |
zeus3110 | 12:12369ee344ab | 106 | sprintf(SendBuf,"NG"); |
zeus3110 | 12:12369ee344ab | 107 | } |
zeus3110 | 12:12369ee344ab | 108 | |
zeus3110 | 12:12369ee344ab | 109 | socket->write((void *)SendBuf,strlen(SendBuf)); |
zeus3110 | 12:12369ee344ab | 110 | |
zeus3110 | 12:12369ee344ab | 111 | printf("Command:%s Result:%s\n\r", (char *)buffer.data(),SendBuf); |
zeus3110 | 12:12369ee344ab | 112 | } |
zeus3110 | 12:12369ee344ab | 113 | } |
zeus3110 | 12:12369ee344ab | 114 | |
zeus3110 | 12:12369ee344ab | 115 | } while (server.getStatus() == network::Socket::Listening); |
zeus3110 | 12:12369ee344ab | 116 | } |