ACKme
/
wiconnect-tcp_server_example
Example application demonstrating the TCP server API of the WiConnect Host Library
example.cpp@0:19d3a6600a5a, 2014-08-26 (annotated)
- Committer:
- dan_ackme
- Date:
- Tue Aug 26 23:07:17 2014 +0000
- Revision:
- 0:19d3a6600a5a
- Child:
- 1:7d0cf8716c2c
Initial check-in
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 | /****************************************************************************** |
dan_ackme | 0:19d3a6600a5a | 47 | * Includes |
dan_ackme | 0:19d3a6600a5a | 48 | */ |
dan_ackme | 0:19d3a6600a5a | 49 | |
dan_ackme | 0:19d3a6600a5a | 50 | // include C library headers |
dan_ackme | 0:19d3a6600a5a | 51 | #include <stdio.h> // needed for printf |
dan_ackme | 0:19d3a6600a5a | 52 | |
dan_ackme | 0:19d3a6600a5a | 53 | // include target specific defines |
dan_ackme | 0:19d3a6600a5a | 54 | #include "target_config.h" |
dan_ackme | 0:19d3a6600a5a | 55 | // include the Wiconnect Host Library API header |
dan_ackme | 0:19d3a6600a5a | 56 | #include "Wiconnect.h" |
dan_ackme | 0:19d3a6600a5a | 57 | |
dan_ackme | 0:19d3a6600a5a | 58 | |
dan_ackme | 0:19d3a6600a5a | 59 | |
dan_ackme | 0:19d3a6600a5a | 60 | /****************************************************************************** |
dan_ackme | 0:19d3a6600a5a | 61 | * Local Functions |
dan_ackme | 0:19d3a6600a5a | 62 | */ |
dan_ackme | 0:19d3a6600a5a | 63 | |
dan_ackme | 0:19d3a6600a5a | 64 | |
dan_ackme | 0:19d3a6600a5a | 65 | /****************************************************************************** |
dan_ackme | 0:19d3a6600a5a | 66 | * Global Defines |
dan_ackme | 0:19d3a6600a5a | 67 | */ |
dan_ackme | 0:19d3a6600a5a | 68 | |
dan_ackme | 0:19d3a6600a5a | 69 | // Transmit/receive buffers for the remote client socket |
dan_ackme | 0:19d3a6600a5a | 70 | static uint8_t clientRxBuffer[256], clientTxBuffer[256]; |
dan_ackme | 0:19d3a6600a5a | 71 | |
dan_ackme | 0:19d3a6600a5a | 72 | // Serial used for printfs to terminal (i.e. NOT used for WiConnect) |
dan_ackme | 0:19d3a6600a5a | 73 | static Serial consoleSerial(STDIO_UART_TX, STDIO_UART_RX); |
dan_ackme | 0:19d3a6600a5a | 74 | |
dan_ackme | 0:19d3a6600a5a | 75 | |
dan_ackme | 0:19d3a6600a5a | 76 | |
dan_ackme | 0:19d3a6600a5a | 77 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 78 | // STEP 1: Instantiate WiConnect Library |
dan_ackme | 0:19d3a6600a5a | 79 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 80 | |
dan_ackme | 0:19d3a6600a5a | 81 | |
dan_ackme | 0:19d3a6600a5a | 82 | // Setup wiconnect serial interface configuration |
dan_ackme | 0:19d3a6600a5a | 83 | // Here we only specify the rx buffer size and not rx buffer pointer, this means |
dan_ackme | 0:19d3a6600a5a | 84 | // The serial RX buffer will be dynamically allocated |
dan_ackme | 0:19d3a6600a5a | 85 | SerialConfig serialConfig(WICONNECT_RX_PIN, WICONNECT_TX_PIN, 256, NULL); |
dan_ackme | 0:19d3a6600a5a | 86 | |
dan_ackme | 0:19d3a6600a5a | 87 | // Instantiate the Wiconnect library |
dan_ackme | 0:19d3a6600a5a | 88 | // Here we specify the buffer size ONLY which means we're using dynmaic allocation |
dan_ackme | 0:19d3a6600a5a | 89 | Wiconnect wiconnectIfc(serialConfig, 256, NULL, WICONNECT_RESET_PIN); |
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 | /****************************************************************************** |
dan_ackme | 0:19d3a6600a5a | 96 | * Starting point of application |
dan_ackme | 0:19d3a6600a5a | 97 | */ |
dan_ackme | 0:19d3a6600a5a | 98 | int main(int argc, char **argv) |
dan_ackme | 0:19d3a6600a5a | 99 | { |
dan_ackme | 0:19d3a6600a5a | 100 | WiconnectResult result; |
dan_ackme | 0:19d3a6600a5a | 101 | // Instantiate a client socket object with statically allocaed transmit/receive buffers |
dan_ackme | 0:19d3a6600a5a | 102 | // Note: this socket object isn't valid until tcpAccept() is called with in |
dan_ackme | 0:19d3a6600a5a | 103 | WiconnectSocket clientSocket(sizeof(clientRxBuffer), clientRxBuffer, sizeof(clientTxBuffer), clientTxBuffer); |
dan_ackme | 0:19d3a6600a5a | 104 | |
dan_ackme | 0:19d3a6600a5a | 105 | consoleSerial.baud(115200); // console terminal to 115200 baud |
dan_ackme | 0:19d3a6600a5a | 106 | |
dan_ackme | 0:19d3a6600a5a | 107 | |
dan_ackme | 0:19d3a6600a5a | 108 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 109 | // STEP 2: Initiate Communication with WiFi Module |
dan_ackme | 0:19d3a6600a5a | 110 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 111 | |
dan_ackme | 0:19d3a6600a5a | 112 | printf("Initializing WiConnect Library...\r\n"); |
dan_ackme | 0:19d3a6600a5a | 113 | |
dan_ackme | 0:19d3a6600a5a | 114 | // Initialize communication with WiFi module |
dan_ackme | 0:19d3a6600a5a | 115 | if(WICONNECT_FAILED(result, wiconnectIfc.init(true))) |
dan_ackme | 0:19d3a6600a5a | 116 | { |
dan_ackme | 0:19d3a6600a5a | 117 | printf("Failed to initialize communication with WiFi module: %s\r\n" |
dan_ackme | 0:19d3a6600a5a | 118 | "Make sure the wires are connected correctly\r\n", Wiconnect::getWiconnectResultStr(result)); |
dan_ackme | 0:19d3a6600a5a | 119 | for(;;); // infinite loop |
dan_ackme | 0:19d3a6600a5a | 120 | } |
dan_ackme | 0:19d3a6600a5a | 121 | |
dan_ackme | 0:19d3a6600a5a | 122 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 123 | // STEP 3: Join the network |
dan_ackme | 0:19d3a6600a5a | 124 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 125 | |
dan_ackme | 0:19d3a6600a5a | 126 | printf("Joining WiFi network: %s\r\n", NETWORK_SSID); |
dan_ackme | 0:19d3a6600a5a | 127 | |
dan_ackme | 0:19d3a6600a5a | 128 | // Initialize communication with WiFi module |
dan_ackme | 0:19d3a6600a5a | 129 | if(WICONNECT_FAILED(result, wiconnectIfc.join(NETWORK_SSID, NETWORK_PASSWORD))) |
dan_ackme | 0:19d3a6600a5a | 130 | { |
dan_ackme | 0:19d3a6600a5a | 131 | printf("Failed to join network: %s\r\n", Wiconnect::getWiconnectResultStr(result)); |
dan_ackme | 0:19d3a6600a5a | 132 | for(;;); // infinite loop |
dan_ackme | 0:19d3a6600a5a | 133 | } |
dan_ackme | 0:19d3a6600a5a | 134 | |
dan_ackme | 0:19d3a6600a5a | 135 | |
dan_ackme | 0:19d3a6600a5a | 136 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 137 | // STEP 4: Start the TCP server |
dan_ackme | 0:19d3a6600a5a | 138 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 139 | |
dan_ackme | 0:19d3a6600a5a | 140 | printf("Starting TCP server, listening on: %s:%d\r\n", wiconnectIfc.getIpAddress(), TCP_SERVER_PORT); |
dan_ackme | 0:19d3a6600a5a | 141 | |
dan_ackme | 0:19d3a6600a5a | 142 | if(WICONNECT_FAILED(result, wiconnectIfc.tcpListen(TCP_SERVER_PORT, TCP_SERVER_MAX_CLIENTS))) |
dan_ackme | 0:19d3a6600a5a | 143 | { |
dan_ackme | 0:19d3a6600a5a | 144 | printf("Failed to start TCP server: %s\r\n", Wiconnect::getWiconnectResultStr(result)); |
dan_ackme | 0:19d3a6600a5a | 145 | for(;;); // infinite loop |
dan_ackme | 0:19d3a6600a5a | 146 | } |
dan_ackme | 0:19d3a6600a5a | 147 | |
dan_ackme | 0:19d3a6600a5a | 148 | |
dan_ackme | 0:19d3a6600a5a | 149 | for(;;) |
dan_ackme | 0:19d3a6600a5a | 150 | { |
dan_ackme | 0:19d3a6600a5a | 151 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 152 | // STEP 5: Wait for clients to connect |
dan_ackme | 0:19d3a6600a5a | 153 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 154 | |
dan_ackme | 0:19d3a6600a5a | 155 | printf("Waiting for a client to connect...\r\n"); |
dan_ackme | 0:19d3a6600a5a | 156 | |
dan_ackme | 0:19d3a6600a5a | 157 | if(WICONNECT_FAILED(result, wiconnectIfc.tcpAccept(clientSocket))) |
dan_ackme | 0:19d3a6600a5a | 158 | { |
dan_ackme | 0:19d3a6600a5a | 159 | printf("Failed to accept client: %s\r\n", Wiconnect::getWiconnectResultStr(result)); |
dan_ackme | 0:19d3a6600a5a | 160 | continue; |
dan_ackme | 0:19d3a6600a5a | 161 | } |
dan_ackme | 0:19d3a6600a5a | 162 | printf("Client connected: %s:%d\r\n", clientSocket.getHost(), clientSocket.getRemotePort()); |
dan_ackme | 0:19d3a6600a5a | 163 | |
dan_ackme | 0:19d3a6600a5a | 164 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 165 | // STEP 6: Receive data from client |
dan_ackme | 0:19d3a6600a5a | 166 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 167 | |
dan_ackme | 0:19d3a6600a5a | 168 | uint8_t *dataPtr; // pointer to client socket's internal RX buffer |
dan_ackme | 0:19d3a6600a5a | 169 | uint16_t readSize; // will contain number of bytes available in RX buffer |
dan_ackme | 0:19d3a6600a5a | 170 | if(WICONNECT_FAILED(result, clientSocket.read(&dataPtr, &readSize))) |
dan_ackme | 0:19d3a6600a5a | 171 | { |
dan_ackme | 0:19d3a6600a5a | 172 | printf("Failed to read data from client: %s\r\n", Wiconnect::getWiconnectResultStr(result)); |
dan_ackme | 0:19d3a6600a5a | 173 | clientSocket.close(); |
dan_ackme | 0:19d3a6600a5a | 174 | continue; |
dan_ackme | 0:19d3a6600a5a | 175 | } |
dan_ackme | 0:19d3a6600a5a | 176 | |
dan_ackme | 0:19d3a6600a5a | 177 | printf("From client: %s\r\n", dataPtr); |
dan_ackme | 0:19d3a6600a5a | 178 | |
dan_ackme | 0:19d3a6600a5a | 179 | |
dan_ackme | 0:19d3a6600a5a | 180 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 181 | // STEP 7: Send data to client |
dan_ackme | 0:19d3a6600a5a | 182 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 183 | |
dan_ackme | 0:19d3a6600a5a | 184 | if(WICONNECT_FAILED(result, clientSocket.puts("Hello client!!\r\n"))) |
dan_ackme | 0:19d3a6600a5a | 185 | { |
dan_ackme | 0:19d3a6600a5a | 186 | printf("Failed to send data to client: %s\r\n", Wiconnect::getWiconnectResultStr(result)); |
dan_ackme | 0:19d3a6600a5a | 187 | clientSocket.close(); |
dan_ackme | 0:19d3a6600a5a | 188 | continue; |
dan_ackme | 0:19d3a6600a5a | 189 | } |
dan_ackme | 0:19d3a6600a5a | 190 | |
dan_ackme | 0:19d3a6600a5a | 191 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 192 | // STEP 8: Close client connection |
dan_ackme | 0:19d3a6600a5a | 193 | //------------------------------------------------------------------------- |
dan_ackme | 0:19d3a6600a5a | 194 | |
dan_ackme | 0:19d3a6600a5a | 195 | clientSocket.close(); |
dan_ackme | 0:19d3a6600a5a | 196 | } |
dan_ackme | 0:19d3a6600a5a | 197 | |
dan_ackme | 0:19d3a6600a5a | 198 | } |
dan_ackme | 0:19d3a6600a5a | 199 | |
dan_ackme | 0:19d3a6600a5a | 200 |