Example application demonstrating the TCP server API of the WiConnect Host Library

Dependencies:   WiConnect mbed

Committer:
dan_ackme
Date:
Tue Aug 26 16:34:48 2014 -0700
Revision:
1:7d0cf8716c2c
Parent:
0:19d3a6600a5a
Child:
4:abbf9de9c9e3
fixed warning

Who changed what in which revision?

UserRevisionLine numberNew 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