ACKme
/
wiconnect-tcp_server_example
Example application demonstrating the TCP server API of the WiConnect Host Library
example.cpp@5:1c7bb44de59f, 2014-11-27 (annotated)
- Committer:
- dan_ackme
- Date:
- Thu Nov 27 10:27:22 2014 +0000
- Revision:
- 5:1c7bb44de59f
- Parent:
- 4:abbf9de9c9e3
updated for latest wiconnect
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dan_ackme | 0:19d3a6600a5a | 1 | /** |
dan_ackme | 0:19d3a6600a5a | 2 | * @example tcp_server/example.cpp |
dan_ackme | 0:19d3a6600a5a | 3 | * |
dan_ackme | 0:19d3a6600a5a | 4 | * This is an example of using the TCP server API to |
dan_ackme | 0:19d3a6600a5a | 5 | * send/receive data from a remote TCP client. |
dan_ackme | 0:19d3a6600a5a | 6 | * |
dan_ackme | 0:19d3a6600a5a | 7 | * This example is intended to be used with 'tcp_client.py' |
dan_ackme | 0:19d3a6600a5a | 8 | * python script in the same directory as this example.cpp file. |
dan_ackme | 0:19d3a6600a5a | 9 | * |
dan_ackme | 0:19d3a6600a5a | 10 | * It works as follows: |
dan_ackme | 0:19d3a6600a5a | 11 | * 1. Instantiate the WiConnect Library |
dan_ackme | 0:19d3a6600a5a | 12 | * 2. Initiate Communication with WiFi Module |
dan_ackme | 0:19d3a6600a5a | 13 | * 3. Join the network |
dan_ackme | 0:19d3a6600a5a | 14 | * 4. Start the TCP server |
dan_ackme | 0:19d3a6600a5a | 15 | * 5. Wait for clients to connect |
dan_ackme | 0:19d3a6600a5a | 16 | * 6. Receive data from client |
dan_ackme | 0:19d3a6600a5a | 17 | * 7. Send data to client |
dan_ackme | 0:19d3a6600a5a | 18 | * 8. Close client connection |
dan_ackme | 0:19d3a6600a5a | 19 | * 9. Goto sleep 5 |
dan_ackme | 0:19d3a6600a5a | 20 | * |
dan_ackme | 0:19d3a6600a5a | 21 | */ |
dan_ackme | 0:19d3a6600a5a | 22 | |
dan_ackme | 0:19d3a6600a5a | 23 | |
dan_ackme | 0:19d3a6600a5a | 24 | /****************************************************************************** |
dan_ackme | 0:19d3a6600a5a | 25 | * Example Variables |
dan_ackme | 0:19d3a6600a5a | 26 | */ |
dan_ackme | 0:19d3a6600a5a | 27 | |
dan_ackme | 0:19d3a6600a5a | 28 | // The port the server listens on |
dan_ackme | 0:19d3a6600a5a | 29 | #define TCP_SERVER_PORT 7 |
dan_ackme | 0:19d3a6600a5a | 30 | // The maximum simultaneous client connections |
dan_ackme | 0:19d3a6600a5a | 31 | // (note this example only supports 1) |
dan_ackme | 0:19d3a6600a5a | 32 | #define TCP_SERVER_MAX_CLIENTS 1 |
dan_ackme | 0:19d3a6600a5a | 33 | |
dan_ackme | 0:19d3a6600a5a | 34 | // This is the name of your WiFi network |
dan_ackme | 0:19d3a6600a5a | 35 | // Look for this name in your WiFi settings |
dan_ackme | 0:19d3a6600a5a | 36 | // (e.g. your phone's list of WiFi networks in the WiFi settings menu) |
dan_ackme | 0:19d3a6600a5a | 37 | // tip: add double-quotes around SSID to add spaces to name |
dan_ackme | 0:19d3a6600a5a | 38 | #define NETWORK_SSID "\"<YOUR NETWORK NAME HERE>\"" |
dan_ackme | 0:19d3a6600a5a | 39 | |
dan_ackme | 0:19d3a6600a5a | 40 | // This is the password of your WiFi network |
dan_ackme | 0:19d3a6600a5a | 41 | // Leave as empty string (e.g "") to connect to OPEN network |
dan_ackme | 0:19d3a6600a5a | 42 | #define NETWORK_PASSWORD "\"<YOUR NETWORK PASSWORD HERE>\"" |
dan_ackme | 0:19d3a6600a5a | 43 | |
dan_ackme | 0:19d3a6600a5a | 44 | |
dan_ackme | 0:19d3a6600a5a | 45 | /****************************************************************************** |
dan_ackme | 0:19d3a6600a5a | 46 | * Includes |
dan_ackme | 0:19d3a6600a5a | 47 | */ |
dan_ackme | 0:19d3a6600a5a | 48 | |
dan_ackme | 0:19d3a6600a5a | 49 | // include C library headers |
dan_ackme | 0:19d3a6600a5a | 50 | #include <stdio.h> // needed for printf |
dan_ackme | 0:19d3a6600a5a | 51 | |
dan_ackme | 0:19d3a6600a5a | 52 | // include target specific defines |
dan_ackme | 0:19d3a6600a5a | 53 | #include "target_config.h" |
dan_ackme | 0:19d3a6600a5a | 54 | // include the Wiconnect Host Library API header |
dan_ackme | 0:19d3a6600a5a | 55 | #include "Wiconnect.h" |
dan_ackme | 0:19d3a6600a5a | 56 | |
dan_ackme | 0:19d3a6600a5a | 57 | |
dan_ackme | 0:19d3a6600a5a | 58 | |
dan_ackme | 0:19d3a6600a5a | 59 | /****************************************************************************** |
dan_ackme | 0:19d3a6600a5a | 60 | * Local Functions |
dan_ackme | 0:19d3a6600a5a | 61 | */ |
dan_ackme | 0:19d3a6600a5a | 62 | |
dan_ackme | 0:19d3a6600a5a | 63 | |
dan_ackme | 0:19d3a6600a5a | 64 | /****************************************************************************** |
dan_ackme | 0:19d3a6600a5a | 65 | * Global Defines |
dan_ackme | 0:19d3a6600a5a | 66 | */ |
dan_ackme | 0:19d3a6600a5a | 67 | |
dan_ackme | 0:19d3a6600a5a | 68 | // Transmit/receive buffers for the remote client socket |
dan_ackme | 0:19d3a6600a5a | 69 | static uint8_t clientRxBuffer[256], clientTxBuffer[256]; |
dan_ackme | 0:19d3a6600a5a | 70 | |
dan_ackme | 0:19d3a6600a5a | 71 | // Serial used for printfs to terminal (i.e. NOT used for WiConnect) |
dan_ackme | 0:19d3a6600a5a | 72 | static Serial consoleSerial(STDIO_UART_TX, STDIO_UART_RX); |
dan_ackme | 0:19d3a6600a5a | 73 | |
dan_ackme | 0:19d3a6600a5a | 74 | |
dan_ackme | 0:19d3a6600a5a | 75 | |
dan_ackme | 0:19d3a6600a5a | 76 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 77 | // STEP 1: Instantiate WiConnect Library |
dan_ackme | 0:19d3a6600a5a | 78 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 79 | |
dan_ackme | 0:19d3a6600a5a | 80 | |
dan_ackme | 0:19d3a6600a5a | 81 | // Setup wiconnect serial interface configuration |
dan_ackme | 0:19d3a6600a5a | 82 | // Here we only specify the rx buffer size and not rx buffer pointer, this means |
dan_ackme | 0:19d3a6600a5a | 83 | // The serial RX buffer will be dynamically allocated |
dan_ackme | 0:19d3a6600a5a | 84 | SerialConfig serialConfig(WICONNECT_RX_PIN, WICONNECT_TX_PIN, 256, NULL); |
dan_ackme | 0:19d3a6600a5a | 85 | |
dan_ackme | 0:19d3a6600a5a | 86 | // Instantiate the Wiconnect library |
dan_ackme | 0:19d3a6600a5a | 87 | // Here we specify the buffer size ONLY which means we're using dynmaic allocation |
dan_ackme | 0:19d3a6600a5a | 88 | Wiconnect wiconnectIfc(serialConfig, 256, NULL, WICONNECT_RESET_PIN); |
dan_ackme | 0:19d3a6600a5a | 89 | |
dan_ackme | 0:19d3a6600a5a | 90 | |
dan_ackme | 0:19d3a6600a5a | 91 | |
dan_ackme | 0:19d3a6600a5a | 92 | |
dan_ackme | 0:19d3a6600a5a | 93 | |
dan_ackme | 0:19d3a6600a5a | 94 | /****************************************************************************** |
dan_ackme | 0:19d3a6600a5a | 95 | * Starting point of application |
dan_ackme | 0:19d3a6600a5a | 96 | */ |
dan_ackme | 0:19d3a6600a5a | 97 | int main(int argc, char **argv) |
dan_ackme | 0:19d3a6600a5a | 98 | { |
dan_ackme | 0:19d3a6600a5a | 99 | WiconnectResult result; |
dan_ackme | 0:19d3a6600a5a | 100 | // Instantiate a client socket object with statically allocaed transmit/receive buffers |
dan_ackme | 0:19d3a6600a5a | 101 | // Note: this socket object isn't valid until tcpAccept() is called with in |
dan_ackme | 0:19d3a6600a5a | 102 | WiconnectSocket clientSocket(sizeof(clientRxBuffer), clientRxBuffer, sizeof(clientTxBuffer), clientTxBuffer); |
dan_ackme | 0:19d3a6600a5a | 103 | |
dan_ackme | 0:19d3a6600a5a | 104 | consoleSerial.baud(115200); // console terminal to 115200 baud |
dan_ackme | 0:19d3a6600a5a | 105 | |
dan_ackme | 0:19d3a6600a5a | 106 | |
dan_ackme | 0:19d3a6600a5a | 107 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 108 | // STEP 2: Initiate Communication with WiFi Module |
dan_ackme | 0:19d3a6600a5a | 109 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 110 | |
dan_ackme | 0:19d3a6600a5a | 111 | printf("Initializing WiConnect Library...\r\n"); |
dan_ackme | 0:19d3a6600a5a | 112 | |
dan_ackme | 0:19d3a6600a5a | 113 | // Initialize communication with WiFi module |
dan_ackme | 0:19d3a6600a5a | 114 | if(WICONNECT_FAILED(result, wiconnectIfc.init(true))) |
dan_ackme | 0:19d3a6600a5a | 115 | { |
dan_ackme | 0:19d3a6600a5a | 116 | printf("Failed to initialize communication with WiFi module: %s\r\n" |
dan_ackme | 0:19d3a6600a5a | 117 | "Make sure the wires are connected correctly\r\n", Wiconnect::getWiconnectResultStr(result)); |
dan_ackme | 4:abbf9de9c9e3 | 118 | if(result == WICONNECT_FIRMWARE_OUTDATED) |
dan_ackme | 4:abbf9de9c9e3 | 119 | { |
dan_ackme | 5:1c7bb44de59f | 120 | printf("** The WiFi firmware is not supported. Run the ota example to update the firmware:\r\n"); |
dan_ackme | 5:1c7bb44de59f | 121 | printf("https://developer.mbed.org/teams/ACKme/code/wiconnect-ota_example\r\n\r\n"); |
dan_ackme | 4:abbf9de9c9e3 | 122 | } |
dan_ackme | 0:19d3a6600a5a | 123 | for(;;); // infinite loop |
dan_ackme | 0:19d3a6600a5a | 124 | } |
dan_ackme | 0:19d3a6600a5a | 125 | |
dan_ackme | 0:19d3a6600a5a | 126 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 127 | // STEP 3: Join the network |
dan_ackme | 0:19d3a6600a5a | 128 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 129 | |
dan_ackme | 0:19d3a6600a5a | 130 | printf("Joining WiFi network: %s\r\n", NETWORK_SSID); |
dan_ackme | 0:19d3a6600a5a | 131 | |
dan_ackme | 0:19d3a6600a5a | 132 | // Initialize communication with WiFi module |
dan_ackme | 0:19d3a6600a5a | 133 | if(WICONNECT_FAILED(result, wiconnectIfc.join(NETWORK_SSID, NETWORK_PASSWORD))) |
dan_ackme | 0:19d3a6600a5a | 134 | { |
dan_ackme | 0:19d3a6600a5a | 135 | printf("Failed to join network: %s\r\n", Wiconnect::getWiconnectResultStr(result)); |
dan_ackme | 0:19d3a6600a5a | 136 | for(;;); // infinite loop |
dan_ackme | 0:19d3a6600a5a | 137 | } |
dan_ackme | 0:19d3a6600a5a | 138 | |
dan_ackme | 0:19d3a6600a5a | 139 | |
dan_ackme | 0:19d3a6600a5a | 140 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 141 | // STEP 4: Start the TCP server |
dan_ackme | 0:19d3a6600a5a | 142 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 143 | |
dan_ackme | 0:19d3a6600a5a | 144 | printf("Starting TCP server, listening on: %s:%d\r\n", wiconnectIfc.getIpAddress(), TCP_SERVER_PORT); |
dan_ackme | 0:19d3a6600a5a | 145 | |
dan_ackme | 0:19d3a6600a5a | 146 | if(WICONNECT_FAILED(result, wiconnectIfc.tcpListen(TCP_SERVER_PORT, TCP_SERVER_MAX_CLIENTS))) |
dan_ackme | 0:19d3a6600a5a | 147 | { |
dan_ackme | 0:19d3a6600a5a | 148 | printf("Failed to start TCP server: %s\r\n", Wiconnect::getWiconnectResultStr(result)); |
dan_ackme | 0:19d3a6600a5a | 149 | for(;;); // infinite loop |
dan_ackme | 0:19d3a6600a5a | 150 | } |
dan_ackme | 0:19d3a6600a5a | 151 | |
dan_ackme | 0:19d3a6600a5a | 152 | |
dan_ackme | 0:19d3a6600a5a | 153 | for(;;) |
dan_ackme | 0:19d3a6600a5a | 154 | { |
dan_ackme | 0:19d3a6600a5a | 155 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 156 | // STEP 5: Wait for clients to connect |
dan_ackme | 0:19d3a6600a5a | 157 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 158 | |
dan_ackme | 0:19d3a6600a5a | 159 | printf("Waiting for a client to connect...\r\n"); |
dan_ackme | 0:19d3a6600a5a | 160 | |
dan_ackme | 0:19d3a6600a5a | 161 | if(WICONNECT_FAILED(result, wiconnectIfc.tcpAccept(clientSocket))) |
dan_ackme | 0:19d3a6600a5a | 162 | { |
dan_ackme | 0:19d3a6600a5a | 163 | printf("Failed to accept client: %s\r\n", Wiconnect::getWiconnectResultStr(result)); |
dan_ackme | 0:19d3a6600a5a | 164 | continue; |
dan_ackme | 0:19d3a6600a5a | 165 | } |
dan_ackme | 0:19d3a6600a5a | 166 | printf("Client connected: %s:%d\r\n", clientSocket.getHost(), clientSocket.getRemotePort()); |
dan_ackme | 0:19d3a6600a5a | 167 | |
dan_ackme | 0:19d3a6600a5a | 168 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 169 | // STEP 6: Receive data from client |
dan_ackme | 0:19d3a6600a5a | 170 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 171 | |
dan_ackme | 0:19d3a6600a5a | 172 | uint8_t *dataPtr; // pointer to client socket's internal RX buffer |
dan_ackme | 0:19d3a6600a5a | 173 | uint16_t readSize; // will contain number of bytes available in RX buffer |
dan_ackme | 0:19d3a6600a5a | 174 | if(WICONNECT_FAILED(result, clientSocket.read(&dataPtr, &readSize))) |
dan_ackme | 0:19d3a6600a5a | 175 | { |
dan_ackme | 0:19d3a6600a5a | 176 | printf("Failed to read data from client: %s\r\n", Wiconnect::getWiconnectResultStr(result)); |
dan_ackme | 0:19d3a6600a5a | 177 | clientSocket.close(); |
dan_ackme | 0:19d3a6600a5a | 178 | continue; |
dan_ackme | 0:19d3a6600a5a | 179 | } |
dan_ackme | 0:19d3a6600a5a | 180 | |
dan_ackme | 0:19d3a6600a5a | 181 | printf("From client: %s\r\n", dataPtr); |
dan_ackme | 0:19d3a6600a5a | 182 | |
dan_ackme | 0:19d3a6600a5a | 183 | |
dan_ackme | 0:19d3a6600a5a | 184 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 185 | // STEP 7: Send data to client |
dan_ackme | 0:19d3a6600a5a | 186 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 187 | |
dan_ackme | 0:19d3a6600a5a | 188 | if(WICONNECT_FAILED(result, clientSocket.puts("Hello client!!\r\n"))) |
dan_ackme | 0:19d3a6600a5a | 189 | { |
dan_ackme | 0:19d3a6600a5a | 190 | printf("Failed to send data to client: %s\r\n", Wiconnect::getWiconnectResultStr(result)); |
dan_ackme | 0:19d3a6600a5a | 191 | clientSocket.close(); |
dan_ackme | 0:19d3a6600a5a | 192 | continue; |
dan_ackme | 0:19d3a6600a5a | 193 | } |
dan_ackme | 0:19d3a6600a5a | 194 | |
dan_ackme | 0:19d3a6600a5a | 195 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 196 | // STEP 8: Close client connection |
dan_ackme | 0:19d3a6600a5a | 197 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 198 | |
dan_ackme | 0:19d3a6600a5a | 199 | clientSocket.close(); |
dan_ackme | 0:19d3a6600a5a | 200 | } |
dan_ackme | 0:19d3a6600a5a | 201 | |
dan_ackme | 0:19d3a6600a5a | 202 | } |
dan_ackme | 0:19d3a6600a5a | 203 |