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

Dependencies:   WiConnect mbed

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?

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 * 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