Example application demonstrating the WiConnect Host Library and HTTP Server WebSockets.

Dependencies:   WiConnect mbed

Committer:
dan_ackme
Date:
Tue Feb 24 06:26:05 2015 +0000
Revision:
0:0cfba8d43d52
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dan_ackme 0:0cfba8d43d52 1 /**
dan_ackme 0:0cfba8d43d52 2 * @example websocket/example.cpp
dan_ackme 0:0cfba8d43d52 3 *
dan_ackme 0:0cfba8d43d52 4 * This is an example of using the wiconnect API to read data
dan_ackme 0:0cfba8d43d52 5 * from a webpage via WebSocket
dan_ackme 0:0cfba8d43d52 6 *
dan_ackme 0:0cfba8d43d52 7 * It works as follows:
dan_ackme 0:0cfba8d43d52 8 * 1. Instantiate the WiConnect Library
dan_ackme 0:0cfba8d43d52 9 * 2. Initiate Communication with WiFi Module
dan_ackme 0:0cfba8d43d52 10 * 3. Set the network credentials and other settings
dan_ackme 0:0cfba8d43d52 11 * 4. Open:
dan_ackme 0:0cfba8d43d52 12 * http://wiconnect.ack.me/_media/2.1/http_server_ws_simple/http_server_ws_simple.html
dan_ackme 0:0cfba8d43d52 13 * In your web browser
dan_ackme 0:0cfba8d43d52 14 * This program detects your browser is connected and displays the data
dan_ackme 0:0cfba8d43d52 15 * 5. That's It!
dan_ackme 0:0cfba8d43d52 16 *
dan_ackme 0:0cfba8d43d52 17 *
dan_ackme 0:0cfba8d43d52 18 */
dan_ackme 0:0cfba8d43d52 19
dan_ackme 0:0cfba8d43d52 20
dan_ackme 0:0cfba8d43d52 21 /******************************************************************************
dan_ackme 0:0cfba8d43d52 22 * Example Variables
dan_ackme 0:0cfba8d43d52 23 */
dan_ackme 0:0cfba8d43d52 24
dan_ackme 0:0cfba8d43d52 25 // This is the name of your WiFi network
dan_ackme 0:0cfba8d43d52 26 // Look for this name in your WiFi settings
dan_ackme 0:0cfba8d43d52 27 // (e.g. your phone's list of WiFi networks in the WiFi settings menu)
dan_ackme 0:0cfba8d43d52 28 // tip: add double-quotes around SSID to add spaces to name
dan_ackme 0:0cfba8d43d52 29 #define NETWORK_SSID "\"<YOUR NETWORK NAME HERE>\""
dan_ackme 0:0cfba8d43d52 30
dan_ackme 0:0cfba8d43d52 31
dan_ackme 0:0cfba8d43d52 32 // This is the password of your WiFi network
dan_ackme 0:0cfba8d43d52 33 // Leave as empty string (e.g "") to connect to OPEN network
dan_ackme 0:0cfba8d43d52 34 #define NETWORK_PASSWORD "\"<YOUR NETWORK PASSWORD HERE>\""
dan_ackme 0:0cfba8d43d52 35
dan_ackme 0:0cfba8d43d52 36
dan_ackme 0:0cfba8d43d52 37 /******************************************************************************
dan_ackme 0:0cfba8d43d52 38 * Includes
dan_ackme 0:0cfba8d43d52 39 */
dan_ackme 0:0cfba8d43d52 40
dan_ackme 0:0cfba8d43d52 41 // include C library headers
dan_ackme 0:0cfba8d43d52 42 #include <stdio.h> // needed for printf
dan_ackme 0:0cfba8d43d52 43
dan_ackme 0:0cfba8d43d52 44 // include target specific defines
dan_ackme 0:0cfba8d43d52 45 #include "target_config.h"
dan_ackme 0:0cfba8d43d52 46 // include the Wiconnect Host Library API header
dan_ackme 0:0cfba8d43d52 47 #include "Wiconnect.h"
dan_ackme 0:0cfba8d43d52 48
dan_ackme 0:0cfba8d43d52 49
dan_ackme 0:0cfba8d43d52 50
dan_ackme 0:0cfba8d43d52 51 /******************************************************************************
dan_ackme 0:0cfba8d43d52 52 * Global Defines
dan_ackme 0:0cfba8d43d52 53 */
dan_ackme 0:0cfba8d43d52 54
dan_ackme 0:0cfba8d43d52 55
dan_ackme 0:0cfba8d43d52 56 // Serial used for printfs to terminal (i.e. NOT used for WiConnect)
dan_ackme 0:0cfba8d43d52 57 static Serial consoleSerial(STDIO_UART_TX, STDIO_UART_RX);
dan_ackme 0:0cfba8d43d52 58 uint8_t rxBuffer[128], txBuffer[128];
dan_ackme 0:0cfba8d43d52 59
dan_ackme 0:0cfba8d43d52 60
dan_ackme 0:0cfba8d43d52 61 /******************************************************************************
dan_ackme 0:0cfba8d43d52 62 * Starting point of application
dan_ackme 0:0cfba8d43d52 63 */
dan_ackme 0:0cfba8d43d52 64 int main(int argc, char **argv)
dan_ackme 0:0cfba8d43d52 65 {
dan_ackme 0:0cfba8d43d52 66 WiconnectResult result;
dan_ackme 0:0cfba8d43d52 67
dan_ackme 0:0cfba8d43d52 68 consoleSerial.baud(115200); // console terminal to 115200 baud
dan_ackme 0:0cfba8d43d52 69
dan_ackme 0:0cfba8d43d52 70 //-------------------------------------------------------------------------
dan_ackme 0:0cfba8d43d52 71 // STEP 1: Instantiate WiConnect Library
dan_ackme 0:0cfba8d43d52 72 //-------------------------------------------------------------------------
dan_ackme 0:0cfba8d43d52 73
dan_ackme 0:0cfba8d43d52 74 // Setup wiconnect serial interface configuration
dan_ackme 0:0cfba8d43d52 75 // Here we only specify the rx buffer size and not rx buffer pointer, this means
dan_ackme 0:0cfba8d43d52 76 // The serial RX buffer will be dynamically allocated
dan_ackme 0:0cfba8d43d52 77 SerialConfig serialConfig(WICONNECT_RX_PIN, WICONNECT_TX_PIN, 256, NULL);
dan_ackme 0:0cfba8d43d52 78
dan_ackme 0:0cfba8d43d52 79 // Instantiate the Wiconnect library
dan_ackme 0:0cfba8d43d52 80 // Here we only specify the buffer size and not buffer pointer, this means
dan_ackme 0:0cfba8d43d52 81 // The internal buffer will be dynamically allocated
dan_ackme 0:0cfba8d43d52 82 Wiconnect wiconnect(serialConfig, 256, NULL, WICONNECT_RESET_PIN);
dan_ackme 0:0cfba8d43d52 83
dan_ackme 0:0cfba8d43d52 84 //-------------------------------------------------------------------------
dan_ackme 0:0cfba8d43d52 85 // STEP 2: Initiate Communication with WiFi Module
dan_ackme 0:0cfba8d43d52 86 //-------------------------------------------------------------------------
dan_ackme 0:0cfba8d43d52 87
dan_ackme 0:0cfba8d43d52 88 printf("Initializing WiConnect Library...\r\n");
dan_ackme 0:0cfba8d43d52 89
dan_ackme 0:0cfba8d43d52 90 // Initialize communication with WiFi module
dan_ackme 0:0cfba8d43d52 91 if(WICONNECT_FAILED(result, wiconnect.init(false)))
dan_ackme 0:0cfba8d43d52 92 {
dan_ackme 0:0cfba8d43d52 93 printf("Failed to initialize communication with WiFi module!\r\n"
dan_ackme 0:0cfba8d43d52 94 "Make sure the wires are connected correctly\r\n");
dan_ackme 0:0cfba8d43d52 95 for(;;); // infinite loop
dan_ackme 0:0cfba8d43d52 96 }
dan_ackme 0:0cfba8d43d52 97
dan_ackme 0:0cfba8d43d52 98
dan_ackme 0:0cfba8d43d52 99 //-------------------------------------------------------------------------
dan_ackme 0:0cfba8d43d52 100 // STEP 3: Set the network credentials
dan_ackme 0:0cfba8d43d52 101 // Note: We manually set the network parameters to ensure SDK backward compatibility
dan_ackme 0:0cfba8d43d52 102 //-------------------------------------------------------------------------
dan_ackme 0:0cfba8d43d52 103
dan_ackme 0:0cfba8d43d52 104 printf("Setting network SSID: %s\r\n", NETWORK_SSID);
dan_ackme 0:0cfba8d43d52 105 if(WICONNECT_FAILED(result, wiconnect.setSetting("wlan.ssid", NETWORK_SSID)))
dan_ackme 0:0cfba8d43d52 106 {
dan_ackme 0:0cfba8d43d52 107 printf("Failed to set wlan.ssid setting\r\n");
dan_ackme 0:0cfba8d43d52 108 for(;;); // infinite loop
dan_ackme 0:0cfba8d43d52 109 }
dan_ackme 0:0cfba8d43d52 110
dan_ackme 0:0cfba8d43d52 111 printf("Setting network password\r\n");
dan_ackme 0:0cfba8d43d52 112 if(WICONNECT_FAILED(result, wiconnect.setSetting("wlan.passkey", NETWORK_PASSWORD)))
dan_ackme 0:0cfba8d43d52 113 {
dan_ackme 0:0cfba8d43d52 114 printf("Failed to set wlan.passkey setting\r\n");
dan_ackme 0:0cfba8d43d52 115 for(;;); // infinite loop
dan_ackme 0:0cfba8d43d52 116 }
dan_ackme 0:0cfba8d43d52 117
dan_ackme 0:0cfba8d43d52 118 printf("Enabling mDNS\r\n");
dan_ackme 0:0cfba8d43d52 119 if(WICONNECT_FAILED(result, wiconnect.setSetting("mdns.enabled", 1)))
dan_ackme 0:0cfba8d43d52 120 {
dan_ackme 0:0cfba8d43d52 121 printf("Failed to enable mDNS\r\n");
dan_ackme 0:0cfba8d43d52 122 for(;;); // infinite loop
dan_ackme 0:0cfba8d43d52 123 }
dan_ackme 0:0cfba8d43d52 124
dan_ackme 0:0cfba8d43d52 125 printf("Setting mDNS name to: mymodule.local\r\n");
dan_ackme 0:0cfba8d43d52 126 if(WICONNECT_FAILED(result, wiconnect.setSetting("mdns.name", "mymodule.local")))
dan_ackme 0:0cfba8d43d52 127 {
dan_ackme 0:0cfba8d43d52 128 printf("Failed to set mDNS name\r\n");
dan_ackme 0:0cfba8d43d52 129 for(;;); // infinite loop
dan_ackme 0:0cfba8d43d52 130 }
dan_ackme 0:0cfba8d43d52 131
dan_ackme 0:0cfba8d43d52 132 printf("Enabling the HTTP Server\r\n");
dan_ackme 0:0cfba8d43d52 133 if(WICONNECT_FAILED(result, wiconnect.setSetting("http.server.enabled", 1)))
dan_ackme 0:0cfba8d43d52 134 {
dan_ackme 0:0cfba8d43d52 135 printf("Failed to set HTTP server enabled\r\n");
dan_ackme 0:0cfba8d43d52 136 for(;;); // infinite loop
dan_ackme 0:0cfba8d43d52 137 }
dan_ackme 0:0cfba8d43d52 138
dan_ackme 0:0cfba8d43d52 139 printf("Saving settings to Non-volatile Memory\r\n");
dan_ackme 0:0cfba8d43d52 140 if(WICONNECT_FAILED(result, wiconnect.saveSettings()))
dan_ackme 0:0cfba8d43d52 141 {
dan_ackme 0:0cfba8d43d52 142 printf("Failed save settings\r\n");
dan_ackme 0:0cfba8d43d52 143 for(;;); // infinite loop
dan_ackme 0:0cfba8d43d52 144 }
dan_ackme 0:0cfba8d43d52 145
dan_ackme 0:0cfba8d43d52 146 printf("Brining the network up\r\n");
dan_ackme 0:0cfba8d43d52 147 if(WICONNECT_FAILED(result, wiconnect.join()))
dan_ackme 0:0cfba8d43d52 148 {
dan_ackme 0:0cfba8d43d52 149 printf("Failed to join network: %s\r\n", NETWORK_SSID);
dan_ackme 0:0cfba8d43d52 150 for(;;); // infinite loop
dan_ackme 0:0cfba8d43d52 151 }
dan_ackme 0:0cfba8d43d52 152
dan_ackme 0:0cfba8d43d52 153 //-------------------------------------------------------------------------
dan_ackme 0:0cfba8d43d52 154 // STEP 4: Wait for a websocket to connect
dan_ackme 0:0cfba8d43d52 155 //-------------------------------------------------------------------------
dan_ackme 0:0cfba8d43d52 156
dan_ackme 0:0cfba8d43d52 157 printf("Using your web browser, go to:\r\n");
dan_ackme 0:0cfba8d43d52 158 printf(" http://wiconnect.ack.me/_media/2.1/http_server_ws_simple/http_server_ws_simple.html\r\n");
dan_ackme 0:0cfba8d43d52 159 printf("and click the 'Open WebSocket' button.\r\n");
dan_ackme 0:0cfba8d43d52 160 printf("Once you do that you'll be able to stream data between the webpage and host micro.\r\n");
dan_ackme 0:0cfba8d43d52 161
dan_ackme 0:0cfba8d43d52 162 WiconnectSocket websocket(sizeof(rxBuffer), rxBuffer, sizeof(txBuffer), txBuffer);
dan_ackme 0:0cfba8d43d52 163
dan_ackme 0:0cfba8d43d52 164 // wait for a client to connect
dan_ackme 0:0cfba8d43d52 165 while(true)
dan_ackme 0:0cfba8d43d52 166 {
dan_ackme 0:0cfba8d43d52 167 printf("\r\nWaiting for websockets to connect...\r\n");
dan_ackme 0:0cfba8d43d52 168 if(WICONNECT_FAILED(result, wiconnect.httpAcceptWebSocket(websocket)))
dan_ackme 0:0cfba8d43d52 169 {
dan_ackme 0:0cfba8d43d52 170 printf("Failed to accept client websocket: %d\r\n", result);
dan_ackme 0:0cfba8d43d52 171 continue;
dan_ackme 0:0cfba8d43d52 172 }
dan_ackme 0:0cfba8d43d52 173
dan_ackme 0:0cfba8d43d52 174 printf("Websocket connected!\r\n");
dan_ackme 0:0cfba8d43d52 175 printf("Address: %s:%d\r\n", websocket.getHost(), websocket.getRemotePort());
dan_ackme 0:0cfba8d43d52 176 printf("Anything typed into the console will be set to the webpage and visa versa\r\n");
dan_ackme 0:0cfba8d43d52 177
dan_ackme 0:0cfba8d43d52 178 while(true)
dan_ackme 0:0cfba8d43d52 179 {
dan_ackme 0:0cfba8d43d52 180 bool dataAvailable;
dan_ackme 0:0cfba8d43d52 181 websocket.poll(&dataAvailable, true);
dan_ackme 0:0cfba8d43d52 182
dan_ackme 0:0cfba8d43d52 183 if(!websocket.isConnected())
dan_ackme 0:0cfba8d43d52 184 {
dan_ackme 0:0cfba8d43d52 185 printf("Websocket disconnect!\r\n");
dan_ackme 0:0cfba8d43d52 186 break;
dan_ackme 0:0cfba8d43d52 187 }
dan_ackme 0:0cfba8d43d52 188
dan_ackme 0:0cfba8d43d52 189 if(dataAvailable)
dan_ackme 0:0cfba8d43d52 190 {
dan_ackme 0:0cfba8d43d52 191 uint8_t *buffer;
dan_ackme 0:0cfba8d43d52 192 uint16_t bytesRead;
dan_ackme 0:0cfba8d43d52 193 websocket.read(&buffer, &bytesRead);
dan_ackme 0:0cfba8d43d52 194 buffer[bytesRead] = 0;
dan_ackme 0:0cfba8d43d52 195 printf("%s\r\n", buffer);
dan_ackme 0:0cfba8d43d52 196 }
dan_ackme 0:0cfba8d43d52 197
dan_ackme 0:0cfba8d43d52 198 while(consoleSerial.readable())
dan_ackme 0:0cfba8d43d52 199 {
dan_ackme 0:0cfba8d43d52 200 websocket.putc(consoleSerial.getc(), false);
dan_ackme 0:0cfba8d43d52 201 }
dan_ackme 0:0cfba8d43d52 202 // flush the buffer
dan_ackme 0:0cfba8d43d52 203 websocket.flushTxBuffer();
dan_ackme 0:0cfba8d43d52 204 }
dan_ackme 0:0cfba8d43d52 205 }
dan_ackme 0:0cfba8d43d52 206
dan_ackme 0:0cfba8d43d52 207 //-------------------------------------------------------------------------
dan_ackme 0:0cfba8d43d52 208 // STEP 5: Done!
dan_ackme 0:0cfba8d43d52 209 //-------------------------------------------------------------------------
dan_ackme 0:0cfba8d43d52 210
dan_ackme 0:0cfba8d43d52 211 while(true){} // infinite loop
dan_ackme 0:0cfba8d43d52 212 }
dan_ackme 0:0cfba8d43d52 213