Demo apps : receive a string from a client and respond with a different string, TCP/IP client

Dependencies:   CC3000_Hostdriver mbed

Note

Avnet Wi-Go board

For those using Avnet's Wi-Go board, there also is a full IOT demo available at
http://mbed.org/users/frankvnk/code/Wi-Go_IOT_Demo/

New cc3000 HostDriver release

For new projects, use cc3000 mbed socket compatible API driver and examples

Info

Demo application for testing the wireless CC3000 module on the Wi-Go board.

Warning

The on-board Firmware must be updated to mbed enable a Wi-Go system.
Goto the Component page to get the FirmwareUpdate tool (scroll down to the FirmwareUpdate topic).

Setup

Note

It is recommended to run initial tests WITHOUT security settings.

  • Setup a wireless router with a non-secured wireless connection using the wireless settings stored in doTCPIP.h.
  • Alternatively, these settings can be altered to match the wireless router settings (SSID, security and static IP parameters).
    When the unsecure test works, AP_KEY and AP_SECURITY can be enabled and set to your preferred values.
    Valid values for AP_SECURITY are : NONE, WEP, WPA and WPA2
// Modify the following settings as necessary for your Wi-Fi Network setup:
#define IP_ALLOC_METHOD USE_DHCP        // for DHCP assigned IP address   
//#define IP_ALLOC_METHOD USE_STATIC_IP // for static IP address

// Default SSID Settings
//#define AP_KEY         "thisthis" 
//#define AP_SECURITY    WPA2          // WPA2 must be enabled for use with iPhone or Android phone hotspot!

#define SSID           "iot"
#define STATIC_IP_OCT1 192
#define STATIC_IP_OCT2 168
#define STATIC_IP_OCT3 0
#define STATIC_IP_OCT4 10

#define STATIC_GW_OCT4 1       // Static Gateway address  = STATIC_IP_OCT1.STATIC_IP_OCT2.STATIC_IP_OCT3.STATIC_GW_OCT4


  • Download Python 2.7 from http://www.python.org/download/
    Install it on a computer able to make a wireless connection to the router we previously set up.
  • Make a wireless connection between your computer and the router.
  • Download this Python script to the Python2.7 folder (credit : Jim Carver from Avnet).
  • Import the CC3000_Simple_Socket code into your compiler and save it to the Wi-Go board.

Running the application for the first time

  • Open a terminal program (eg: TeraTerm) and connect to the Wi-Go module (serial speed : 115200 baud).
  • Press the reset button on the Wi-Go module.
  • Following startup screen will appear (the dots in the MAC address will show your CC3000's real MAC address):
CC3000 Python demo.


Wi-Go MAC address ..:..:..:..:..:..

FTC        1
PP_version 3.3
SERV_PACK  1.11
DRV_VER    7.13.19
FW_VER     7.12.14

<0> Normal run. SmartConfig will
    start if no valid connection exists.
<1> Connect using fixed SSID : iot
<2> TCP/IP client:
    Discover public IP address.
    Get time and date from a daytime server in Italy.
<9> SmartConfig.


  • For the initial test, select option <1> (Connect using fixed SSID : ...).
  • If all goes well, the following screen is shown (the IP address and mDNS status can be different):
Starting TCP/IP Server
RunSmartConfig= 0
Attempting SSID Connection
waiting
waiting
waiting
mDNS Status= 31be
Connected

*** Wi-Go board DHCP assigned IP Address = 192.168.0.101
mDNS Status= 3dbe
Server waiting for connection to Python


  • On the computer where you installed Python2.7:
    • Make sure the wireless connection between your computer and the router is active.
    • Open a DOS prompt and go to the folder where Python2.7 is installed.
    • Type following command :
python wigo_test.py -a 192.168.0.101 -p 15000


Note

Don't forget to replace the IP address with the real IP address assigned by DHCP to the CC3000 module.

If a connection is established, the DOS window will show

-----------------
run tcp client
-----------------
connected to  remote ip=192.168.0.101 remote port=15000
Press ENTER ....


In return the Wi-Go board will send following info to the serial port:

Connected


When we press Enter in the DOS window, the Wi-Go board will send following info to the serial port:

Input = Hello Wi-Go
status= 13
Done, press any key to repeat


And the DOS window will show:

recv from :  data:  Hello Python


Application option <2> : TCP/IP client

This is a simple demo to discover a public IP address and get the date and time from a daytime server (port 13).

Using the application's options <0> or <9>

Options <0> (Normal run) and <9> (SmartConfig) are very similar.
They both allow us to connect the CC3000 to another wireless network, without changing the pre-configured settings stored in doTCPIP.h.

As mentioned before, option <0> will automatically start SmartConfig if no valid connection exists (First Time Config),
but if the CC3000 was previously configured using SmartConfig, it will automatically connect to the wireless network.

Option <9> can be used to switch to another wireless connection.


See TI's pages on how to use the SmartConfig tool:

The Prefix can be set in cc3000.cpp. Do not change the default value for the prefix (TTT) when you want to use TI's Smartconfig application.

char aucCC3000_prefix[] = {'T', 'T', 'T'};      // Smart Config Prefix

The Device Name mentioned on the SmartConfig page is declared in doTCPIP.cpp

char DevServname[] = "CC3000";
Committer:
frankvnk
Date:
Thu Oct 17 18:10:26 2013 +0000
Revision:
7:f13025166308
Parent:
1:32d1ef95eceb
HostDriver update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:a8e46e27d041 1 /*****************************************************************************
frankvnk 0:a8e46e27d041 2 *
frankvnk 0:a8e46e27d041 3 * cc3000.h - CC3000 Function Definitions
frankvnk 0:a8e46e27d041 4 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
frankvnk 0:a8e46e27d041 5 *
frankvnk 0:a8e46e27d041 6 * Redistribution and use in source and binary forms, with or without
frankvnk 0:a8e46e27d041 7 * modification, are permitted provided that the following conditions
frankvnk 0:a8e46e27d041 8 * are met:
frankvnk 0:a8e46e27d041 9 *
frankvnk 0:a8e46e27d041 10 * Redistributions of source code must retain the above copyright
frankvnk 0:a8e46e27d041 11 * notice, this list of conditions and the following disclaimer.
frankvnk 0:a8e46e27d041 12 *
frankvnk 0:a8e46e27d041 13 * Redistributions in binary form must reproduce the above copyright
frankvnk 0:a8e46e27d041 14 * notice, this list of conditions and the following disclaimer in the
frankvnk 0:a8e46e27d041 15 * documentation and/or other materials provided with the
frankvnk 0:a8e46e27d041 16 * distribution.
frankvnk 0:a8e46e27d041 17 *
frankvnk 0:a8e46e27d041 18 * Neither the name of Texas Instruments Incorporated nor the names of
frankvnk 0:a8e46e27d041 19 * its contributors may be used to endorse or promote products derived
frankvnk 0:a8e46e27d041 20 * from this software without specific prior written permission.
frankvnk 0:a8e46e27d041 21 *
frankvnk 0:a8e46e27d041 22 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
frankvnk 0:a8e46e27d041 23 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
frankvnk 0:a8e46e27d041 24 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
frankvnk 0:a8e46e27d041 25 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
frankvnk 0:a8e46e27d041 26 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
frankvnk 0:a8e46e27d041 27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
frankvnk 0:a8e46e27d041 28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
frankvnk 0:a8e46e27d041 29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
frankvnk 0:a8e46e27d041 30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
frankvnk 0:a8e46e27d041 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
frankvnk 0:a8e46e27d041 32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
frankvnk 0:a8e46e27d041 33 *
frankvnk 0:a8e46e27d041 34 *****************************************************************************/
frankvnk 0:a8e46e27d041 35
frankvnk 0:a8e46e27d041 36 #ifndef CC3000_H
frankvnk 0:a8e46e27d041 37 #define CC3000_H
frankvnk 0:a8e46e27d041 38
frankvnk 0:a8e46e27d041 39 #include "wlan.h"
frankvnk 0:a8e46e27d041 40
frankvnk 0:a8e46e27d041 41 //*****************************************************************************
frankvnk 0:a8e46e27d041 42 //
frankvnk 0:a8e46e27d041 43 //! \addtogroup cc3000
frankvnk 0:a8e46e27d041 44 //! @{
frankvnk 0:a8e46e27d041 45 //
frankvnk 0:a8e46e27d041 46 //*****************************************************************************
frankvnk 0:a8e46e27d041 47
frankvnk 0:a8e46e27d041 48 /** CC3000 Functions
frankvnk 0:a8e46e27d041 49 *
frankvnk 0:a8e46e27d041 50 */
frankvnk 0:a8e46e27d041 51 #ifdef __cplusplus
frankvnk 0:a8e46e27d041 52 extern "C" {
frankvnk 0:a8e46e27d041 53 #endif
frankvnk 0:a8e46e27d041 54
frankvnk 0:a8e46e27d041 55 extern DigitalOut ledr;
frankvnk 0:a8e46e27d041 56 extern DigitalOut ledg;
frankvnk 0:a8e46e27d041 57 extern DigitalOut ledb;
frankvnk 0:a8e46e27d041 58 extern DigitalOut led1;
frankvnk 0:a8e46e27d041 59 extern DigitalOut led2;
frankvnk 0:a8e46e27d041 60 extern DigitalOut led3;
frankvnk 0:a8e46e27d041 61
frankvnk 0:a8e46e27d041 62 #define RED_OFF ledr = 1;
frankvnk 0:a8e46e27d041 63 #define RED_ON ledr = 0;
frankvnk 0:a8e46e27d041 64 #define RED_TOGGLE ledr = !ledr;
frankvnk 0:a8e46e27d041 65 #define GREEN_OFF ledg = 1;
frankvnk 0:a8e46e27d041 66 #define GREEN_ON ledg = 0;
frankvnk 0:a8e46e27d041 67 #define GREEN_TOGGLE ledg = !ledg;
frankvnk 0:a8e46e27d041 68 #define BLUE_OFF ledb = 1;
frankvnk 0:a8e46e27d041 69 #define BLUE_ON ledb = 0;
frankvnk 0:a8e46e27d041 70 #define BLUE_TOGGLE ledb = !ledb;
frankvnk 0:a8e46e27d041 71 #define LED_D1_OFF led1 = 1;
frankvnk 0:a8e46e27d041 72 #define LED_D1_ON led1 = 0;
frankvnk 0:a8e46e27d041 73 #define LED_D1_TOGGLE led1 = !led1;
frankvnk 0:a8e46e27d041 74 #define LED_D2_OFF led2 = 1;
frankvnk 0:a8e46e27d041 75 #define LED_D2_ON led2 = 0;
frankvnk 0:a8e46e27d041 76 #define LED_D2_TOGGLE led2 = !led2;
frankvnk 0:a8e46e27d041 77 #define LED_D3_OFF led3 = 1;
frankvnk 0:a8e46e27d041 78 #define LED_D3_ON led3 = 0;
frankvnk 0:a8e46e27d041 79 #define LED_D3_TOGGLE led3 = !led3;
frankvnk 0:a8e46e27d041 80
frankvnk 0:a8e46e27d041 81 #define SOCKET_INACTIVE_ERR -57
frankvnk 0:a8e46e27d041 82 #define NUM_STATES 6
frankvnk 0:a8e46e27d041 83 #define MAX_SSID_LEN 32
frankvnk 0:a8e46e27d041 84 #define FIRST_TIME_CONFIG_SET 0xAA
frankvnk 0:a8e46e27d041 85 #define NETAPP_IPCONFIG_MAC_OFFSET (20)
frankvnk 0:a8e46e27d041 86 #define CC3000_APP_BUFFER_SIZE (5)
frankvnk 0:a8e46e27d041 87 #define CC3000_RX_BUFFER_OVERHEAD_SIZE (20)
frankvnk 0:a8e46e27d041 88
frankvnk 0:a8e46e27d041 89 // CC3000 State Machine Definitions
frankvnk 0:a8e46e27d041 90 enum cc3000StateEnum
frankvnk 0:a8e46e27d041 91 {
frankvnk 0:a8e46e27d041 92 CC3000_UNINIT = 0x01, // CC3000 Driver Uninitialized
frankvnk 0:a8e46e27d041 93 CC3000_INIT = 0x02, // CC3000 Driver Initialized
frankvnk 0:a8e46e27d041 94 CC3000_ASSOC = 0x04, // CC3000 Associated to AP
frankvnk 0:a8e46e27d041 95 CC3000_IP_ALLOC = 0x08, // CC3000 has IP Address
frankvnk 0:a8e46e27d041 96 CC3000_SERVER_INIT = 0x10, // CC3000 Server Initialized
frankvnk 0:a8e46e27d041 97 CC3000_CLIENT_CONNECTED = 0x20 // CC3000 Client Connected to Server
frankvnk 0:a8e46e27d041 98 };
frankvnk 0:a8e46e27d041 99
frankvnk 0:a8e46e27d041 100
frankvnk 0:a8e46e27d041 101 /**
frankvnk 0:a8e46e27d041 102 * Turn all LEDs Off
frankvnk 0:a8e46e27d041 103 * @param none
frankvnk 0:a8e46e27d041 104 * @return none
frankvnk 0:a8e46e27d041 105 */
frankvnk 0:a8e46e27d041 106 void initLEDs(void);
frankvnk 0:a8e46e27d041 107
frankvnk 0:a8e46e27d041 108 /** Connect to an Access Point using the specified SSID.
frankvnk 0:a8e46e27d041 109 * @param ssidName is a string of the AP's SSID
frankvnk 0:a8e46e27d041 110 * @return none
frankvnk 0:a8e46e27d041 111 */
frankvnk 0:a8e46e27d041 112 int ConnectUsingSSID(char * ssidName);
frankvnk 0:a8e46e27d041 113
frankvnk 0:a8e46e27d041 114 /** Handle asynchronous events from CC3000 device.
frankvnk 0:a8e46e27d041 115 * @param lEventType Event type
frankvnk 0:a8e46e27d041 116 * @param data
frankvnk 0:a8e46e27d041 117 * @param length
frankvnk 0:a8e46e27d041 118 * @return none
frankvnk 0:a8e46e27d041 119 */
frankvnk 0:a8e46e27d041 120 void CC3000_UsynchCallback(long lEventType, char * data, unsigned char length);
frankvnk 0:a8e46e27d041 121
frankvnk 0:a8e46e27d041 122 /** Initialize a CC3000 device and triggers it to start operation.
frankvnk 0:a8e46e27d041 123 * @param none
frankvnk 0:a8e46e27d041 124 * @return none
frankvnk 0:a8e46e27d041 125 */
frankvnk 0:a8e46e27d041 126 int initDriver(void);
frankvnk 0:a8e46e27d041 127
frankvnk 0:a8e46e27d041 128 /** Return the highest state which we're in.
frankvnk 0:a8e46e27d041 129 * @param None
frankvnk 0:a8e46e27d041 130 * @return none
frankvnk 0:a8e46e27d041 131 */
frankvnk 0:a8e46e27d041 132 char highestCC3000State(void);
frankvnk 0:a8e46e27d041 133
frankvnk 0:a8e46e27d041 134 /** Return the current state bits.
frankvnk 0:a8e46e27d041 135 * @param None
frankvnk 0:a8e46e27d041 136 * @return none
frankvnk 0:a8e46e27d041 137 */
frankvnk 0:a8e46e27d041 138 char currentCC3000State(void);
frankvnk 0:a8e46e27d041 139
frankvnk 0:a8e46e27d041 140 /** Sets a state from the state machine.
frankvnk 0:a8e46e27d041 141 * @param None
frankvnk 0:a8e46e27d041 142 * @return none
frankvnk 0:a8e46e27d041 143 */
frankvnk 0:a8e46e27d041 144 void setCC3000MachineState(char stat);
frankvnk 0:a8e46e27d041 145
frankvnk 0:a8e46e27d041 146 /** Unsets a state from the state machine.
frankvnk 0:a8e46e27d041 147 * Also handles LEDs.\n
frankvnk 0:a8e46e27d041 148 * @param None
frankvnk 0:a8e46e27d041 149 * @return none
frankvnk 0:a8e46e27d041 150 */
frankvnk 0:a8e46e27d041 151 void unsetCC3000MachineState(char stat);
frankvnk 0:a8e46e27d041 152
frankvnk 0:a8e46e27d041 153 /** Resets the State Machine.
frankvnk 0:a8e46e27d041 154 * @param None
frankvnk 0:a8e46e27d041 155 * @return none
frankvnk 0:a8e46e27d041 156 */
frankvnk 0:a8e46e27d041 157 void resetCC3000StateMachine(void);
frankvnk 0:a8e46e27d041 158
frankvnk 0:a8e46e27d041 159 /** Obtains the CC3000 Connection Information from the CC3000.
frankvnk 0:a8e46e27d041 160 * @param None
frankvnk 0:a8e46e27d041 161 * @return none
frankvnk 0:a8e46e27d041 162 */
frankvnk 0:a8e46e27d041 163 #ifndef CC3000_TINY_DRIVER
frankvnk 0:a8e46e27d041 164 tNetappIpconfigRetArgs * getCC3000Info(void);
frankvnk 0:a8e46e27d041 165 #endif
frankvnk 0:a8e46e27d041 166
frankvnk 0:a8e46e27d041 167 /** Trigger a smart configuration process on CC3000.
frankvnk 0:a8e46e27d041 168 * It exits upon completion of the process.\n
frankvnk 0:a8e46e27d041 169 * @param None
frankvnk 0:a8e46e27d041 170 * @return none
frankvnk 0:a8e46e27d041 171 */
frankvnk 0:a8e46e27d041 172 void StartSmartConfig(void);
frankvnk 0:a8e46e27d041 173
frankvnk 0:a8e46e27d041 174 #ifdef __cplusplus
frankvnk 0:a8e46e27d041 175 }
frankvnk 0:a8e46e27d041 176 #endif // __cplusplus
frankvnk 0:a8e46e27d041 177
frankvnk 0:a8e46e27d041 178 //*****************************************************************************
frankvnk 0:a8e46e27d041 179 //
frankvnk 0:a8e46e27d041 180 // Close the Doxygen group.
frankvnk 0:a8e46e27d041 181 //! @}
frankvnk 0:a8e46e27d041 182 //
frankvnk 0:a8e46e27d041 183 //*****************************************************************************
frankvnk 0:a8e46e27d041 184
frankvnk 0:a8e46e27d041 185 #endif // CC3000_H
frankvnk 0:a8e46e27d041 186
frankvnk 1:32d1ef95eceb 187