WiFi DipCortex USB CDC
Dependencies: HTTPClient NTPClient USBDevice WebSocketClient cc3000_hostdriver_mbedsocket mbed
Fork of WiFiDip-UsbKitchenSink by
http://www.soldersplash.co.uk/products/wifi-dipcortex/
Demo shows you how to implement the CC3000 library with the WiFi DipCortex.
The demo shows :
- USB CDC ( Serial ) Menu system allow control of the module and starting each example
- Smart Connect
- Manual connect
- Connection status
- Ping
- TCP Client
- TCP Server
- Web Socket read/write to sockets.mbed.org
- HTTP Client test Post, Put, Delete
- Posting ADC data to Xively every 1 second
- UDP Client
- UDP Server
- NTP Example, contacts time server to get the current time
You will need a Driver for the USB CDC port which can be found here : http://www.soldersplash.co.uk/docs/DipCortex-USB-CDC.zip
Please refer to : http://mbed.org/users/SolderSplashLabs/notebook/dipcortex---getting-started-with-mbed/ as well as the SolderSplash Forum for support http://forum.soldersplash.co.uk/viewforum.php?f=15
Revision 0:0bce3a738bcb, committed 2013-11-04
- Comitter:
- SolderSplashLabs
- Date:
- Mon Nov 04 19:55:00 2013 +0000
- Child:
- 1:6f4eaec531c4
- Commit message:
- Test Project, USB CDC and CC3000 Library
Changed in this revision
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/HTTPClient.lib Mon Nov 04 19:55:00 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/donatien/code/HTTPClient/#1f743885e7de
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/NTPClient.lib Mon Nov 04 19:55:00 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/SolderSplashLabs/code/NTPClient/#240ec02c4bc3
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/USBDevice.lib Mon Nov 04 19:55:00 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/SolderSplashLabs/code/USBDevice/#01e56c952fe0
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebSocketClient.lib Mon Nov 04 19:55:00 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/samux/code/WebSocketClient/#4567996414a5
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cc3000_hostdriver_mbedsocket.lib Mon Nov 04 19:55:00 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/SolderSplashLabs/code/cc3000_hostdriver_mbedsocket/#960b73df5981
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Nov 04 19:55:00 2013 +0000 @@ -0,0 +1,617 @@ + +#include "mbed.h" +#include "cc3000.h" +#include "wifi.h" +#include "UDPSocket.h" +#include "tcpTests.h" +#include "main.h" +#include "USBSerial.h" +#include "NTPClient.h" +#include <time.h> + +using namespace mbed_cc3000; + +/* cc3000 module declaration specific for user's board. Check also init() */ +#if (MY_BOARD == WIGO) +cc3000 wifi(PTA16, PTA13, PTD0, SPI(PTD2, PTD3, PTC5), PORTA_IRQn); +#elif (MY_BOARD == WIFI_DIPCORTEX) +cc3000 wifi(p28, p27, p30, SPI(p21, p14, p37), PIN_INT0_IRQn); +Serial uart(p19, p20); +USBSerial pc; // USB CDC serial port +#else + +#endif + +#ifndef CC3000_UNENCRYPTED_SMART_CONFIG + const uint8_t smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36}; +#else + const uint8_t smartconfigkey = 0; +#endif + +const int ECHO_SERVER_PORT_UDP = 81; +uint8_t *HostToPing = (uint8_t *)"google.com"; +tNetappIpconfigRetArgs ipinfo; +extern char tmpBuffer[512]; + +MENU_LEVEL currentMenu = MENU_TOP; + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Resolve a hostname and ping it +*/ +// ------------------------------------------------------------------------------------------------------------ +void PingTest ( void ) +{ +uint32_t ip; +int32_t resolveRetCode = 0; + + pc.printf("Get an IP address for %s\r\n",HostToPing); + resolveRetCode = wifi._socket.gethostbyname(HostToPing,strlen((const char *)HostToPing), &ip); + pc.printf("gethostbyname Returned code : %i \r\n", resolveRetCode); + + if (resolveRetCode > -1) + { + uint8_t add0 = (ip >> 24); + uint8_t add1 = (ip >> 16); + uint8_t add2 = (ip >> 8); + uint8_t add3 = (ip >> 0); + pc.printf("IP address of %s: %d.%d.%d.%d \r\n", HostToPing, add0, add1, add2, add3); + + pc.printf("Sending ping\r\n"); + uint32_t reply_count = wifi.ping(ip, 5, 500, 32); + pc.printf("Received %d replies\r\n", reply_count); + pc.printf("Ping complete.\r\n"); + } + else + { + pc.printf("Failed to resolve\r\n"); + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Test the NTP library +*/ +// ------------------------------------------------------------------------------------------------------------ +void NtpTest ( void ) +{ +NTPClient ntp; +struct tm *currentTime; + if (ntp.setTime("0.pool.ntp.org",123,10000) == 0) + { + pc.printf("\r\nGot the time successfully\r\n"); + currentTime = localtime(&ntp.NTPLastResult); + pc.printf("NTP Response : %s\r\n", asctime(currentTime)); + } + else + { + pc.printf("NTP Update Failed\r\n"); + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Send a UDP Packet, wait for response +*/ +// ------------------------------------------------------------------------------------------------------------ +void UdpClientTest ( void ) +{ +UDPSocket socket; +int n = 0; +Endpoint outEndpoint; +Endpoint inEndpoint; + + if (0 == socket.bind(ECHO_SERVER_PORT_UDP) ) + { + + // 2 second timeout + socket.set_blocking(false, 2000); + + pc.printf("\r\n!! Press any key to stop !!\r\n\r\n"); + + while (1) + { + if( outEndpoint.set_address(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_UDP) < 0 ) + { + pc.printf("Failed to set endpoint address.\r\n"); + break; + } + else + { + if ( socket.sendTo( outEndpoint, hello, sizeof(hello) ) < 0 ) + { + pc.printf("Failed to send the packet.\r\n"); + } + else + { + // Message sent, recv reply + pc.printf("UDP Socket Sent : %s \r\n", hello); + n = socket.receiveFrom( inEndpoint, tmpBuffer, sizeof(tmpBuffer) ); + if ( n < 0 ) + { + pc.printf("Failed to recv the UDP packet.\r\n"); + } + else + { + tmpBuffer[n] = '\0'; + pc.printf("UDP Socket Recv'd : %s \r\n", tmpBuffer); + } + } + } + + // Should we stop? + if ( pc.readable() ) + { + pc.getc(); + break; + } + } + + if ( wifi.is_connected() ) + { + socket.close(); + } + } + else + { + // Failed to bind to the socket + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Listen on a UDP port for messages +*/ +// ------------------------------------------------------------------------------------------------------------ +void UdpServerTest ( void ) +{ +UDPSocket socket; +Endpoint client; +int n = 0; + + if (0 == socket.bind(ECHO_SERVER_PORT_UDP) ) + { + pc.printf("\r\n!! Press any key to stop listening !!\r\n\r\n"); + + while (true) + { + pc.printf("Waiting for packet...\r\n"); + n = socket.receiveFrom(client, tmpBuffer, sizeof(tmpBuffer)); + + pc.printf("Received packet from: %s\n", client.get_address()); + socket.sendTo(client, tmpBuffer, n); + + // Should we stop? + if ( pc.readable() ) + { + pc.getc(); + break; + } + } + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Print menu header +*/ +// ------------------------------------------------------------------------------------------------------------ +void Menu_PrintHeader ( void ) +{ + if (( wifi.is_enabled() ) && ( wifi.is_dhcp_configured() )) + { + wifi.get_ip_config(&ipinfo); + } + + pc.printf("\r\n"); + pc.printf("+-------------------------------------------+\r\n"); + pc.printf("| WiFi DipCortex / CC3000 Kitchen Sink |\r\n"); + pc.printf("+-------------------------------------------+\r\n"); + if (! wifi.is_enabled() ) + { + pc.printf("| CC3000 Disabled |\r\n"); + } + else if ( wifi.is_dhcp_configured() ) + { + pc.printf("| SSID : %-33s|\r\n", ipinfo.uaSSID); + pc.printf("| IP : %-35s|\r\n", wifi.getIPAddress()); + } + else if ( wifi.is_connected() ) + { + pc.printf("| Connecting, waiting for DHCP |\r\n"); + } + else + { + pc.printf("| Not Connected |\r\n"); + } + pc.printf("+-------------------------------------------+\r\n"); + pc.printf("\r\n"); +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Control the wifi connection +*/ +// ------------------------------------------------------------------------------------------------------------ +char WaitForSerialCommand ( void ) +{ +char charIn = 0; +char prevCharIn; + + pc.printf("Enter command character : "); + + while (1) + { + prevCharIn = charIn; + charIn = pc.getc(); + + pc.printf("%c", charIn); + if ((charIn == '\n') || (charIn == '\r')) + { + break; + } + } + + return ( prevCharIn ); +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Configure the module for smart connect mode allow configuration over the air +*/ +// ------------------------------------------------------------------------------------------------------------ +void SmartConfig ( void ) +{ + // We dont want to auto reconnect to an access point + wifi._wlan.ioctl_set_connection_policy(0, 0, 0); + + // start smart config will disconnect, set the prefix + // wait for a message via a SmartConfig app, store it to the profile list + // finally it will reenable auto connection, triggering the module to connect to the new access point + wifi.start_smart_config(0); +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Print cc3000 information +*/ +// ------------------------------------------------------------------------------------------------------------ +void print_cc3000_info() { +uint8_t myMAC[8]; +uint8_t buffer[2]; +int32_t status = 0; +tNetappIpconfigRetArgs ipinfo2; +tUserFS cc_user_info; +const char * WIFI_STATUS[] = {"Disconnected", "Scanning", "Connecting", "Connected"}; + + wifi.get_user_file_info((uint8_t *)&cc_user_info, sizeof(cc_user_info)); + wifi.get_mac_address(myMAC); + pc.printf(" MAC address : %02x:%02x:%02x:%02x:%02x:%02x\r\n", myMAC[0], myMAC[1], myMAC[2], myMAC[3], myMAC[4], myMAC[5]); + + if (! wifi._nvmem.read_sp_version( (unsigned char*)&buffer ) ) + { + pc.printf(" CC3000 Firmware Version : %u.%u \r\n", buffer[0], buffer[1]); + } + else + { + pc.printf(" CC3000 Read nvmem failed!"); + } + + status = wifi._wlan.ioctl_statusget(); + if (( status > -1 ) && ( status < 4 )) + { + pc.printf(" Wifi Status : %s\r\n", WIFI_STATUS[status]); + } + else + { + pc.printf(" Wifi Status : %d\r\n", status); + } + + if ( wifi.is_dhcp_configured() ) + { + wifi.get_ip_config(&ipinfo2); + pc.printf(" Connected to : %s \r\n", ipinfo2.uaSSID); + pc.printf(" IP : %d.%d.%d.%d \r\n", ipinfo2.aucIP[3], ipinfo2.aucIP[2], ipinfo2.aucIP[1], ipinfo2.aucIP[0]); + pc.printf(" Gateway : %d.%d.%d.%d \r\n", ipinfo2.aucDefaultGateway[3], ipinfo2.aucDefaultGateway[2], ipinfo2.aucDefaultGateway[1], ipinfo2.aucDefaultGateway[0]); + pc.printf(" Subnet : %d.%d.%d.%d \r\n", ipinfo2.aucSubnetMask[3], ipinfo2.aucSubnetMask[2], ipinfo2.aucSubnetMask[1], ipinfo2.aucSubnetMask[0]); + pc.printf(" DNS : %d.%d.%d.%d \r\n", ipinfo2.aucDNSServer[3], ipinfo2.aucDNSServer[2], ipinfo2.aucDNSServer[1], ipinfo2.aucDNSServer[0]); + + pc.printf(" Cached IP : %s \r\n", wifi.getIPAddress()); + pc.printf(" Cached Gateway : %s \r\n", wifi.getGateway()); + pc.printf(" Cached Subnet : %s \r\n", wifi.getNetworkMask()); + + } + else + { + pc.printf(" Not connected \r\n"); + } +} + + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Control the wifi connection +*/ +// ------------------------------------------------------------------------------------------------------------ +void Menu_ConnectionControl ( void ) +{ +uint32_t ip = 0; + Menu_PrintHeader(); + pc.printf(" 1 - Enable auto connect to any previous access point\r\n"); + pc.printf(" 2 - Disable auto connect \r\n"); + pc.printf(" 3 - Connect to %s \r\n", SSID); + pc.printf(" 4 - Disconnect \r\n"); + pc.printf(" 5 - Start SmartConfig \r\n"); + pc.printf(" 6 - Erase profiles \r\n"); + pc.printf(" 7 - Get Status \r\n"); + pc.printf(" x - Top Menu \r\n"); + + pc.printf("\r\n"); + + switch(WaitForSerialCommand()) + { + case '1': + wifi._wlan.ioctl_set_connection_policy(0, 0, 1); + break; + + case '2': + wifi._wlan.ioctl_set_connection_policy(0, 0, 0); + break; + + case '3': + + //wifi.start(0); + + // Enable DHCP + wifi._netapp.dhcp(&ip, &ip, &ip, &ip); + + if ( AP_SECURITY == NONE ) + { + wifi.connect_non_blocking((uint8_t *)SSID, 0, AP_SECURITY); + } + else + { + pc.printf("\r\n Connecting to : %s key : %s", SSID, AP_KEY ); + wifi.connect_non_blocking((uint8_t *)SSID, (uint8_t *)AP_KEY, AP_SECURITY); + + } + break; + + case '4' : + // Stop the module re-connecting + wifi._wlan.ioctl_set_connection_policy(0, 0, 0); + // Then disconnect + wifi.disconnect(); + break; + + case '5' : + SmartConfig(); + break; + + case '6' : + wifi._wlan.ioctl_del_profile(255); + break; + + case '7' : + print_cc3000_info(); + break; + + case '8': + //wifi._spi.manualIrqCheck(); + break; + + case 'x': + currentMenu = MENU_TOP; + break; + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief +*/ +// ------------------------------------------------------------------------------------------------------------ +void Menu_UdpControl ( void ) +{ + Menu_PrintHeader(); + + pc.printf(" 1 - UDP Client, Connect to %s:%d\r\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_UDP); + pc.printf(" 2 - UDP Server \r\n"); + pc.printf(" 3 - NTP Client \r\n"); + pc.printf(" x - Exit to top menu \r\n"); + + pc.printf("\r\n"); + + switch(WaitForSerialCommand()) + { + case '1': + UdpClientTest(); + break; + case '2': + UdpServerTest(); + break; + case '3': + NtpTest(); + break; + case '0': + case 'x': + currentMenu = MENU_TOP; + break; + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief +*/ +// ------------------------------------------------------------------------------------------------------------ +void Menu_TcpControl ( void ) +{ + Menu_PrintHeader(); + + pc.printf(" 1 - TCP Client, Connect to %s:%d\r\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_TCP); + pc.printf(" 2 - TCP Server, listen on %d.%d.%d.%d:%d\r\n", ipinfo.aucIP[3], ipinfo.aucIP[2], ipinfo.aucIP[1], ipinfo.aucIP[0], ECHO_SERVER_PORT_TCP); + pc.printf(" 3 - Web Socket Write \r\n"); + pc.printf(" 4 - Web Socket Read \r\n"); + pc.printf(" 5 - HTTP Client \r\n"); + pc.printf(" 6 - Xively Post ADC's \r\n"); + pc.printf(" x - Exit to top menu "); + pc.printf("\r\n"); + + switch(WaitForSerialCommand()) + { + case '1': + TcpClientTest(); + break; + case '2': + TcpServerTest(); + break; + case '3': + WebSocketTest(); + break; + case '4': + + break; + case '5': + HttpClientTest(); + break; + case '6': + XivelySimpleTest(); + break; + case '0': + case 'x': + currentMenu = MENU_TOP; + break; + } +} + + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Display a menu to the user +*/ +// ------------------------------------------------------------------------------------------------------------ +void Menu_Top ( void ) +{ + Menu_PrintHeader(); + + pc.printf(" 1 - Connection control menu \r\n" ); + pc.printf(" 2 - TCP test menu \r\n" ); + pc.printf(" 3 - UDP test menu \r\n" ); + pc.printf(" 4 - Connection status \r\n"); + pc.printf(" 5 - Ping - %s \r\n", HostToPing); + pc.printf(" x - Top Menu \r\n"); + + pc.printf("\r\n"); + + switch(WaitForSerialCommand()) + { + case '1': + currentMenu = MENU_CONNECTION; + break; + case '2': + currentMenu = MENU_TCP; + break; + case '3': + currentMenu = MENU_UDP; + break; + case '4': + print_cc3000_info(); + break; + case '5': + PingTest(); + break; + case 'x': + currentMenu = MENU_TOP; + break; + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Pick which menu to display +*/ +// ------------------------------------------------------------------------------------------------------------ +void MenuSwitch ( void ) +{ +bool connected = false; + + if ( wifi.is_dhcp_configured() ) + { + connected = true; + } + + switch ( currentMenu ) + { + case MENU_TOP : + Menu_Top(); + break; + + case MENU_CONNECTION : + Menu_ConnectionControl(); + break; + + case MENU_TCP : + if (connected) + { + Menu_TcpControl(); + } + else + { + currentMenu = MENU_TOP; + } + break; + + case MENU_UDP : + if (connected) + { + Menu_UdpControl(); + } + else + { + currentMenu = MENU_TOP; + } + break; + + default : + pc.printf("Unknown command\r\n"); + break; + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Init +*/ +// ------------------------------------------------------------------------------------------------------------ +void init() +{ + NVIC_SetPriority(SSP1_IRQn, 0x0); + NVIC_SetPriority(PIN_INT0_IRQn, 0x1); + + // SysTick set to lower priority than Wi-Fi SPI bus interrupt + NVIC_SetPriority(SysTick_IRQn, 0x2); +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief main loop +*/ +// ------------------------------------------------------------------------------------------------------------ +int main( void ) +{ + // Initalise the WiFi Module + init(); + + uart.baud(SERIAL_BAUD_RATE); + + wait(1); + wifi.start(0); + + wait_ms(750); + + while (1) + { + MenuSwitch(); + } +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.h Mon Nov 04 19:55:00 2013 +0000 @@ -0,0 +1,17 @@ + +#ifndef MAIN_H +#define MAIN_H + +#define SERIAL_BAUD_RATE 115200 + +typedef enum MENU_LEVEL +{ + MENU_TOP = 0, + MENU_CONNECTION, + MENU_TCP, + MENU_UDP +} MENU_LEVEL; + +extern cc3000 wifi; + +#endif
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed.bld Mon Nov 04 19:55:00 2013 +0000 @@ -0,0 +1,1 @@ +http://mbed.org/users/mbed_official/code/mbed/builds/a9913a65894f \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tcpTests.cpp Mon Nov 04 19:55:00 2013 +0000 @@ -0,0 +1,374 @@ +#include "mbed.h" +#include "cc3000.h" +#include "USBSerial.h" + +#include "TCPSocketConnection.h" +#include "TCPSocketServer.h" +#include "HTTPClient.h" +#include "Websocket.h" + +using namespace mbed_cc3000; + + +extern cc3000 wifi; +extern USBSerial pc; + +HTTPClient http; + +// Goto the viewier page here : http://sockets.mbed.org/SolderSplashLabs/viewer to see the websocket writes +const char WEB_SOCKET_URL[] = {"ws://sockets.mbed.org/ws/SolderSplashLabs/wo"}; +const char* ECHO_SERVER_ADDRESS = "192.168.0.10"; +const int ECHO_SERVER_PORT_TCP = 80; +char hello[] = "Hello World\r\n"; +char tmpBuffer[512]; + + +//char XivelyUrl[] = "http://api.xively.com/v2/feeds/1197891669"; +char XivelyHostname[] = "api.xively.com"; +char XivelyPath[] = "/v2/feeds/1197891669"; +char XivelyApiKey[] = "jUoEs8IbcqKyREzrjCM84H6CehLRMuiG06jjJ15hG0diR2yk"; + +AnalogIn adc0(P0_11); //P2 +AnalogIn adc1(P0_12); //P3 +AnalogIn adc2(P0_13); //P4 +AnalogIn adc3(P0_14); //P5 +AnalogIn adc5(P0_16); //P8 +AnalogIn adc6(P0_22); //P9 +AnalogIn adc7(P0_23); //P10 + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Post all analog inputs to xively +*/ +// ------------------------------------------------------------------------------------------------------------ +void XivelySimpleTest ( void ) +{ +TCPSocketConnection socket; +int res = 0; +uint16_t counter = 0; +int httpCmdLen = 0; + + //if ( wifi.is_connected() ) + + while (1) + { + if (socket.connect(XivelyHostname, 80) < 0) + { + pc.printf("\r\nUnable to connect to (%s) on port (%d)\r\n", XivelyHostname, 80); + socket.close(); + } + else + { + // Block for 1 second + socket.set_blocking( true, 1000 ); + counter ++; + + // Build the header + httpCmdLen = sprintf(&tmpBuffer[0], "PUT %s.csv HTTP/1.1\r\n", XivelyPath ); + httpCmdLen += sprintf(&tmpBuffer[httpCmdLen], "Host: %s\r\nUser-Agent: WiFi-DipCortex\r\n", XivelyHostname); + httpCmdLen += sprintf(&tmpBuffer[httpCmdLen], "X-ApiKey: %s\r\n", XivelyApiKey); + httpCmdLen += sprintf(&tmpBuffer[httpCmdLen], "Content-Type: text/csv\r\nContent-Length: 91\r\n"); + httpCmdLen += sprintf(&tmpBuffer[httpCmdLen], "Connection: close\r\n\r\n"); + + // add the data + httpCmdLen += sprintf(&tmpBuffer[httpCmdLen], "ADC0, %05d\r\nADC1, %05d\r\nADC2, %05d\r\nADC3, %05d\r\nADC5, %05d\r\nADC6, %05d\r\nADC7, %05d\r\n\0", + adc0.read_u16(), adc1.read_u16(), adc2.read_u16(), adc3.read_u16(), adc5.read_u16(), adc6.read_u16(), adc7.read_u16()); + + pc.printf("Data to be sent : \r\n %s", tmpBuffer); + + pc.printf("Posting ADC's to Xively \r\n"); + res = socket.send_all(tmpBuffer, httpCmdLen); + + if ( res > 0 ) + { + pc.printf("%05d : Data Sent \r\n", counter); + } + else + { + pc.printf("Failed to send\r\n"); + break; + } + + res = socket.receive(tmpBuffer, 512); + + if ( res > 0 ) + { + pc.printf("TCP Socket Recv'd : \r\n %s", tmpBuffer); + tmpBuffer[res] = '\0'; + } + else + { + tmpBuffer[0] = '\0'; + pc.printf("TCP : Failed to Recv\r\n"); + break; + } + + socket.close(); + } + + wait_ms(1000); + + if ( pc.readable() ) + { + pc.printf("Ending Xively Post \r\n"); + pc.getc(); + break; + } + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Exercise the HTTP Client library +*/ +// ------------------------------------------------------------------------------------------------------------ +void HttpClientTest ( void ) +{ + + //GET data + pc.printf("\r\nTrying to fetch page... \r\n"); + int ret = http.get("http://mbed.org/media/uploads/donatien/hello.txt", tmpBuffer, 128); + if (!ret) + { + pc.printf("Page fetched successfully - read %d characters \r\n", strlen(tmpBuffer)); + pc.printf("Result: %s \r\n", tmpBuffer); + } + else + { + pc.printf("Error - ret = %d - HTTP return code = %d \r\n", tmpBuffer, http.getHTTPResponseCode()); + } + + //POST data + HTTPMap map; + HTTPText inText(tmpBuffer, 512); + map.put("Hello", "World"); + map.put("test", "1234"); + pc.printf(" \r\nTrying to post data... \r\n"); + ret = http.post("http://httpbin.org/post", map, &inText); + if (!ret) + { + pc.printf("Executed POST successfully - read %d characters \r\n", strlen(tmpBuffer)); + pc.printf("Result: %s \r\n", tmpBuffer); + } + else + { + pc.printf("Error - ret = %d - HTTP return code = %d \r\n", ret, http.getHTTPResponseCode()); + } + + //PUT data + strcpy(tmpBuffer, "This is a PUT test!"); + HTTPText outText(tmpBuffer); + //HTTPText inText(tmpBuffer, 512); + pc.printf(" \r\nTrying to put resource... \r\n"); + ret = http.put("http://httpbin.org/put", outText, &inText); + if (!ret) + { + pc.printf("Executed PUT successfully - read %d characters \r\n", strlen(tmpBuffer)); + pc.printf("Result: %s \r\n", tmpBuffer); + } + else + { + pc.printf("Error - ret = %d - HTTP return code = %d \r\n", ret, http.getHTTPResponseCode()); + } + + //DELETE data + //HTTPText inText(tmpBuffer, 512); + pc.printf(" \r\nTrying to delete resource... \r\n"); + ret = http.del("http://httpbin.org/delete", &inText); + if (!ret) + { + pc.printf("Executed DELETE successfully - read %d characters \r\n", strlen(tmpBuffer)); + pc.printf("Result: %s \r\n", tmpBuffer); + } + else + { + pc.printf("Error - ret = %d - HTTP return code = %d \r\n", ret, http.getHTTPResponseCode()); + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Open a WebSocket, send a string +*/ +// ------------------------------------------------------------------------------------------------------------ +void WebSocketTest ( void ) +{ + +int res = 0; +uint16_t counter = 0; +uint16_t reconnects = 0; +uint8_t myMAC[8]; + + wifi.get_mac_address(myMAC); + + Websocket ws((char *)WEB_SOCKET_URL); + if ( ws.connect() ) + { + pc.printf("Connected to websocket server.\r\n"); + + pc.printf("\r\n!! Press any key to stop sending !!\r\n\r\n"); + while (1) + { + counter ++; + sprintf(tmpBuffer, "WiFi DipCortex / CC3000 - %05d - %02x:%02x:%02x:%02x:%02x:%02x\r\n", counter, myMAC[0], myMAC[1], myMAC[2], myMAC[3], myMAC[4], myMAC[5]); + + if ( wifi.is_connected() ) + { + res = ws.send(tmpBuffer); + pc.printf("Reconnects : %05d, Messages Sent : %05d, Websocket send returned : %d.\r\n", reconnects, counter, res); + + if ( -1 == res ) + { + pc.printf("Websocket Failure, reconnecting .... \r\n"); + ws.close(); + if ( ws.connect() ) + { + // Reconnected + reconnects ++; + } + else + { + // Failure! + break; + } + } + + wait_ms(1000); + } + else + { + pc.printf("WiFi Connection Lost .... \r\n"); + } + + if ( pc.readable() ) + { + pc.printf("Closing Socket \r\n"); + pc.getc(); + break; + } + } + + ws.close(); + pc.printf("Websocket Closed \r\n"); + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Open a TCP port send a string and wait for a reply +*/ +// ------------------------------------------------------------------------------------------------------------ +void TcpClientTest ( void ) +{ +uint16_t counter = 0; +TCPSocketConnection socket; +int n = 0; + + if (socket.connect(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_TCP) < 0) + { + pc.printf("\r\nUnable to connect to (%s) on port (%d)\r\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_TCP); + } + else + { + // Block for 1 second + socket.set_blocking( true, 1000 ); + + pc.printf("\r\n!! Press any key to stop sending !!\r\n\r\n"); + while (1) + { + counter ++; + + n = socket.send_all(hello, sizeof(hello) - 1); + + if ( n > 0 ) + { + pc.printf("%05d : TCP Socket Sent : Hello World\r\n", counter); + } + else + { + pc.printf("Failed to send\r\n"); + break; + } + + n = socket.receive(tmpBuffer, 256); + + if ( n > 0 ) + { + pc.printf("TCP Socket Recv'd : %s \r\n", tmpBuffer); + tmpBuffer[n] = '\0'; + } + else + { + tmpBuffer[0] = '\0'; + pc.printf("TCP : Failed to Recv\r\n"); + break; + } + + wait_ms(50); + + // Should we stop? + if ( pc.readable() ) + { + pc.printf("Closing Socket \r\n"); + pc.getc(); + break; + } + } + if ( wifi.is_connected() ) + { + socket.close(); + } + pc.printf("Completed.\r\n"); + } +} + + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Opens a sockets to listen for connections, upon connection a message is sent and the + client disconnected +*/ +// ------------------------------------------------------------------------------------------------------------ +void TcpServerTest ( void ) +{ +int32_t status; +TCPSocketServer server; +TCPSocketConnection client; + + server.bind(80); + server.listen(); + pc.printf("\r\n!! Press any key to stop listening !!\r\n\r\n"); + while (1) + { + status = server.accept(client); + if (status >= 0) + { + client.set_blocking(false, 1500); // Timeout after (1.5)s + pc.printf("Connection from: %s \r\n", client.get_address()); + //client.receive(buffer, sizeof(buffer)); + //pc.printf("Received: %s \r\n",buffer); + pc.printf("Sending the message to the server. \r\n"); + client.send_all(hello, sizeof(hello)); + client.close(); + } + + // Should we stop? + if ( pc.readable() ) + { + pc.printf("Closing Socket \r\n"); + pc.getc(); + break; + } + + if (! wifi.is_connected() ) + { + pc.printf("WiFi Connection lost \r\n"); + break; + } + } + + if ( wifi.is_connected() ) + { + server.close(); + } +} \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tcpTests.h Mon Nov 04 19:55:00 2013 +0000 @@ -0,0 +1,14 @@ +#ifndef TCPTESTS_H +#define TCPTESTS_H + +void HttpClientTest ( void ); +void WebSocketTest ( void ); +void TcpClientTest ( void ); +void TcpServerTest ( void ); +void XivelySimpleTest ( void ); + +extern const char *ECHO_SERVER_ADDRESS; +extern const int ECHO_SERVER_PORT_TCP = 80; +extern char *hello; + +#endif \ No newline at end of file
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/wifi.h Mon Nov 04 19:55:00 2013 +0000 @@ -0,0 +1,46 @@ +/* mbed Microcontroller Library + * Copyright (c) 2006-2013 ARM Limited + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef WIFI_H +#define WIFI_H + +#include "cc3000.h" + +#define WIGO 1 +#define WIFI_DIPCORTEX 2 +#define UNDEFINED 3 + +#define MY_BOARD WIFI_DIPCORTEX + +// use this defines in AP_SECURITY +#define NONE 0 +#define WEP 1 +#define WPA 2 +#define WPA2 3 + +// use smart config +#define USE_SMART_CONFIG 0 + + // Default SSID Settings +#define SSID "soldersplash" +#define AP_KEY "wifidipcortex" +#define AP_SECURITY WPA2 + +void init(); +void connect_to_ssid(uint8_t *ssid); +void connect_to_ssid(char *ssid, char *key, unsigned char sec_mode); +void print_cc3000_info(); + +#endif