WiFi DipCortex / CC3000 Demo - Contains a menu driven set of tests to initalise and control the CC3000 radio. Also allowing you to test various TCP and UDP connections.
Dependencies: NTPClient WebSocketClient cc3000_hostdriver_mbedsocket mbed HTTPClient
http://www.soldersplash.co.uk/products/wifi-dipcortex/
Please Note, this example uses the serial port so you will need an external RS232 TTL to USB adapter.
Diff: main.cpp
- Revision:
- 0:039d229f3d6b
- Child:
- 2:3adf4a0475d7
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Mon Oct 07 21:18:18 2013 +0000 @@ -0,0 +1,609 @@ + +#include "mbed.h" +#include "cc3000.h" + +#include "Websocket.h" +#include "wifi.h" + +#include "TCPSocketConnection.h" +#include "TCPSocketServer.h" + +#include "UDPSocket.h" + +#include "NTPClient.h" +#include "main.h" + +using namespace mbed_cc3000; + +// TODO : List internal varibles & CC3000 buffers +// AP point scanning +// List open sockets +// Overkill mode 2 TCP 2 UDP echo ports? + +#define SERIAL_BAUD_RATE 115200 +Serial pc(p19, p20); +extern cc3000 wifi; +//Serial pc(USBTX, USBRX); + +const char* ECHO_SERVER_ADDRESS = "192.168.0.10"; +const int ECHO_SERVER_PORT_TCP = 80; +const int ECHO_SERVER_PORT_UDP = 81; +uint8_t *HostToPing = (uint8_t *)"google.com"; +char hello[] = "Hello World\r\n"; +const char WEB_SOCKET_URL[] = {"ws://sockets.mbed.org/ws/SolderSplashLabs/wo"}; + +typedef enum MENU_LEVEL +{ + MENU_TOP = 0, + MENU_CONNECTION, + MENU_TCP, + MENU_UDP +} MENU_LEVEL; + +MENU_LEVEL currentMenu = MENU_TOP; + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Resolve a hostname and ping it +*/ +// ------------------------------------------------------------------------------------------------------------ +void PingTest ( void ) +{ +uint32_t ip; +int32_t resolveRetCode = 0; + + printf("Get an IP address for %s\r\n",HostToPing); + resolveRetCode = wifi._socket.gethostbyname(HostToPing,strlen((const char *)HostToPing), &ip); + 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); + printf("IP address of %s: %d.%d.%d.%d \r\n", HostToPing, add0, add1, add2, add3); + + printf("Sending ping\r\n"); + uint32_t reply_count = wifi.ping(ip, 5, 500, 32); + printf("Received %d replies\r\n", reply_count); + printf("Ping complete.\r\n"); + } + else + { + printf("Failed to resolve\r\n"); + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Test the NTP library +*/ +// ------------------------------------------------------------------------------------------------------------ +void NtpTest ( void ) +{ +NTPClient ntp; + + if (ntp.setTime("0.pool.ntp.org",123,10000) == 0) + { + printf("Set time successfully\r\n"); + time_t ctTime; + ctTime = time(NULL); + printf("Time is set to (UTC): %s\r\n", ctime(&ctTime)); + } + else + { + printf("NTP Update Failed\r\n"); + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Open a WebSocket, send string a string +*/ +// ------------------------------------------------------------------------------------------------------------ +void WebSocketTest ( void ) +{ +int res = 0; +uint32_t counter = 0; + + Websocket ws((char *)WEB_SOCKET_URL); + if ( ws.connect() ) + { + printf("Connected to websocket server.\r\n"); + + printf("\r\n!! Press any key to stop sending !!\r\n\r\n"); + while (1) + { + counter ++; + res = ws.send("WiFi DipCortex / CC3000 - Says Hello"); + printf("%05d : Websocket send returned : %d.\r\n", counter, res); + + if ( -1 == res ) break; + + wait_ms(1000); + + if ( pc.readable() ) + { + pc.getc(); + break; + } + } + + ws.close(); + 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; +char buf[256]; +int n = 0; + + if (socket.connect(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_TCP) < 0) + { + printf("Unable 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 ); + + 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 ) + { + printf("%05d : TCP Socket Sent : Hello World\r\n", counter); + } + else + { + printf("Failed to send\r\n"); + break; + } + + n = socket.receive(buf, 256); + + if ( n > 0 ) + { + printf("TCP Socket Recv'd : %s \r\n", buf); + buf[n] = '\0'; + } + else + { + buf[0] = '\0'; + printf("Failed to Recv\r\n"); + break; + } + + wait_ms(250); + + // Should we stop? + if ( pc.readable() ) + { + pc.getc(); + break; + } + } + socket.close(); + printf("Completed.\r\n"); + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Opens a sockets to listen for connections +*/ +// ------------------------------------------------------------------------------------------------------------ +void TcpServerTest ( void ) +{ +int32_t status; +char buffer[256]; +TCPSocketServer server; +TCPSocketConnection client; + + server.bind(15000); + server.listen(); + while (1) + { + status = server.accept(client); + if (status >= 0) + { + client.set_blocking(false, 1500); // Timeout after (1.5)s + printf("Connection from: %s \r\n", client.get_address()); + char buffer[256]; + //client.receive(buffer, sizeof(buffer)); + //printf("Received: %s \r\n",buffer); + printf("Sending the message to the server. \r\n"); + client.send_all(hello, sizeof(hello)); + client.close(); + } + + // Should we stop? + if ( pc.readable() ) + { + pc.getc(); + break; + } + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Send a UDP Packet, wait for response +*/ +// ------------------------------------------------------------------------------------------------------------ +void UdpClientTest ( void ) +{ +UDPSocket socket; +char buf[256]; +int n = 0; +Endpoint outEndpoint; +Endpoint inEndpoint; + + if (0 == socket.bind(ECHO_SERVER_PORT_UDP) ) + { + + // 2 second timeout + socket.set_blocking(false, 2000); + + while (1) + { + if( outEndpoint.set_address(ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_UDP) < 0 ) + { + printf("Failed to set endpoint address.\r\n"); + break; + } + else if ( socket.sendTo( outEndpoint, hello, sizeof(hello) ) < 0 ) + { + printf("Failed to send the packet.\r\n"); + } + else + { + // Message sent, recv reply + printf("UDP Socket Sent : %s \r\n", hello); + n = socket.receiveFrom( inEndpoint, buf, sizeof(buf) ); + if ( n < 0 ) + { + printf("Failed to recv the UDP packet.\r\n"); + } + else + { + buf[n] = '\0'; + printf("UDP Socket Recv'd : %s \r\n", buf); + } + } + + // Should we stop? + if ( pc.readable() ) + { + pc.getc(); + break; + } + } + + socket.close(); + } + else + { + // Failed to bind to the socket + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Listen on a UDP port for messages +*/ +// ------------------------------------------------------------------------------------------------------------ +void UdpServerTest ( void ) +{ +UDPSocket socket; +Endpoint client; +char buffer[256]; +int n = 0; + + if (0 == socket.bind(ECHO_SERVER_PORT_UDP) ) + { + while (true) + { + printf("Waiting for packet...\r\n"); + n = socket.receiveFrom(client, buffer, sizeof(buffer)); + + printf("Received packet from: %s\n", client.get_address()); + socket.sendTo(client, buffer, n); + + // Should we stop? + if ( pc.readable() ) + { + pc.getc(); + break; + } + } + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Print menu header +*/ +// ------------------------------------------------------------------------------------------------------------ +void Menu_PrintHeader ( void ) +{ +tNetappIpconfigRetArgs ipinfo; + + if ( wifi.is_dhcp_configured() ) + { + wifi.get_ip_config(&ipinfo); + } + + printf("\r\n"); + printf("+-------------------------------------------+\r\n"); + printf("| WiFi DipCortex / CC3000 Kitchen Sink |\r\n"); + printf("+-------------------------------------------+\r\n"); + if ( wifi.is_dhcp_configured() ) + { + printf("| SSID : %-33s|\r\n", ipinfo.uaSSID); + printf("| IP : %d.%d.%d.%d |\r\n", ipinfo.aucIP[3], ipinfo.aucIP[2], ipinfo.aucIP[1], ipinfo.aucIP[0]); + } + else + { + printf("| Not Connected |\r\n"); + } + printf("+-------------------------------------------+\r\n"); + printf("\r\n"); +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Control the wifi connection +*/ +// ------------------------------------------------------------------------------------------------------------ +char WaitForSerialCommand ( void ) +{ +char charIn = 0; +char prevCharIn; + + while (1) + { + prevCharIn = charIn; + charIn = pc.getc(); + printf("%c", charIn); + if ((charIn == '\n') || (charIn == '\r')) + { + break; + } + } + + return ( prevCharIn ); +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Control the wifi connection +*/ +// ------------------------------------------------------------------------------------------------------------ +void Menu_ConnectionControl ( void ) +{ + Menu_PrintHeader(); + printf(" 1 - Enable auto connect to any previous access point\r\n"); + printf(" 2 - Disable auto connect \r\n"); + printf(" 3 - Connect to %s \r\n", SSID); + printf(" 4 - Disconnect \r\n"); + printf(" 5 - Get Status \r\n"); + printf(" x - Top Menu \r\n"); + + printf("\r\n"); + printf("Enter command character : "); + + switch(WaitForSerialCommand()) + { + case '1': + wifi._wlan.ioctl_set_connection_policy(0, 1, 1); + break; + + case '2': + wifi._wlan.ioctl_set_connection_policy(0, 0, 0); + break; + + case '3': + if ( AP_SECURITY == NONE ) + { + connect_to_ssid((uint8_t *)SSID); + } + else + { + connect_to_ssid(SSID,AP_KEY,AP_SECURITY); + } + break; + + case '4' : + wifi.disconnect(); + break; + + case '5' : + print_cc3000_info(); + break; + + case 'x': + currentMenu = MENU_TOP; + break; + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief +*/ +// ------------------------------------------------------------------------------------------------------------ +void Menu_UdpControl ( void ) +{ + Menu_PrintHeader(); + + printf(" 1 - UDP Client, Connect to %s:%d\r\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_UDP); + printf(" 2 - UDP Server \r\n"); + printf(" 3 - NTP Client \r\n"); + printf(" x - Exit to top menu \r\n"); + + printf("\r\n"); + printf("Enter command character : "); + + switch(WaitForSerialCommand()) + { + case '1': + UdpClientTest(); + break; + case '2': + UdpServerTest(); + break; + case '3': + NtpTest(); + break; + case 'x': + currentMenu = MENU_TOP; + break; + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief +*/ +// ------------------------------------------------------------------------------------------------------------ +void Menu_TcpControl ( void ) +{ + Menu_PrintHeader(); + + printf(" 1 - TCP Client, Connect to %s:%d\r\n", ECHO_SERVER_ADDRESS, ECHO_SERVER_PORT_TCP); + printf(" 2 - TCP Server, listen on port\r\n", ECHO_SERVER_PORT_TCP); + printf(" 3 - Web Socket Write \r\n"); + printf(" 4 - Web Socket Read \r\n"); + printf(" x - Exit to top menu "); + printf("\r\n"); + printf("Enter command character : "); + + switch(WaitForSerialCommand()) + { + case '1': + TcpClientTest(); + break; + case '2': + TcpServerTest(); + break; + case '3': + WebSocketTest(); + break; + case 'x': + currentMenu = MENU_TOP; + break; + } +} + + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief Display a menu to the user +*/ +// ------------------------------------------------------------------------------------------------------------ +void Menu_Top ( void ) +{ + Menu_PrintHeader(); + + printf(" 1 - Connection control menu \r\n" ); + printf(" 2 - TCP test menu \r\n" ); + printf(" 3 - UDP test menu \r\n" ); + printf(" 4 - Connection status \r\n"); + printf(" 5 - Ping - %s \r\n", HostToPing); + + printf("\r\n"); + printf("Enter command character : "); + + 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 : + if (connected) Menu_Top(); + break; + + case MENU_CONNECTION : + Menu_ConnectionControl(); + break; + + case MENU_TCP : + if (connected) Menu_TcpControl(); + break; + + case MENU_UDP : + if (connected) Menu_UdpControl(); + break; + + default : + printf("Unknown command\r\n"); + break; + } +} + +// ------------------------------------------------------------------------------------------------------------ +/*! + @brief main loop +*/ +// ------------------------------------------------------------------------------------------------------------ +int main( void ) +{ + // Initalise the WiFi Module + init(); + pc.baud(SERIAL_BAUD_RATE); + + wifi.start(0); + + while (1) + { + MenuSwitch(); + } +}