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:
Sun Aug 18 07:06:20 2013 +0000
Revision:
2:13ced2cb5933
Parent:
1:32d1ef95eceb
Child:
3:63bff0590657
improved program output

Who changed what in which revision?

UserRevisionLine numberNew contents of line
frankvnk 0:a8e46e27d041 1 /*****************************************************************************
frankvnk 0:a8e46e27d041 2 *
frankvnk 0:a8e46e27d041 3 * cc3000 - CC3000 Functions Implementation
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 #include "cc3000.h"
frankvnk 0:a8e46e27d041 37
frankvnk 0:a8e46e27d041 38
frankvnk 0:a8e46e27d041 39 DigitalOut ledr (LED_RED);
frankvnk 0:a8e46e27d041 40 DigitalOut ledg (LED_GREEN);
frankvnk 0:a8e46e27d041 41 DigitalOut ledb (LED_BLUE);
frankvnk 0:a8e46e27d041 42 DigitalOut led1 (PTB8);
frankvnk 0:a8e46e27d041 43 DigitalOut led2 (PTB9);
frankvnk 0:a8e46e27d041 44 DigitalOut led3 (PTB10);
frankvnk 0:a8e46e27d041 45
frankvnk 0:a8e46e27d041 46 long ulSocket;
frankvnk 0:a8e46e27d041 47
frankvnk 0:a8e46e27d041 48 unsigned char pucIP_Addr[4];
frankvnk 0:a8e46e27d041 49 unsigned char pucIP_DefaultGWAddr[4];
frankvnk 0:a8e46e27d041 50 unsigned char pucSubnetMask[4];
frankvnk 0:a8e46e27d041 51 unsigned char pucDNS[4];
frankvnk 0:a8e46e27d041 52
frankvnk 0:a8e46e27d041 53 sockaddr tSocketAddr;
frankvnk 0:a8e46e27d041 54
frankvnk 0:a8e46e27d041 55 unsigned char prefixChangeFlag = 0;
frankvnk 0:a8e46e27d041 56 unsigned char prefixFromUser[3] = {0};
frankvnk 0:a8e46e27d041 57 char * ftcPrefixptr;
frankvnk 0:a8e46e27d041 58
frankvnk 0:a8e46e27d041 59 char aucCC3000_prefix[] = {'T', 'T', 'T'}; // Smart Config Prefix
frankvnk 0:a8e46e27d041 60
frankvnk 0:a8e46e27d041 61 tNetappIpconfigRetArgs ipinfo;
frankvnk 0:a8e46e27d041 62
frankvnk 0:a8e46e27d041 63 char cc3000state = CC3000_UNINIT;
frankvnk 0:a8e46e27d041 64 extern unsigned char ConnectUsingSmartConfig;
frankvnk 0:a8e46e27d041 65 extern volatile unsigned long ulCC3000Connected;
frankvnk 0:a8e46e27d041 66 extern volatile unsigned long SendmDNSAdvertisment;
frankvnk 2:13ced2cb5933 67 //extern int server_running;
frankvnk 1:32d1ef95eceb 68 extern char DevServname[];
frankvnk 0:a8e46e27d041 69 volatile unsigned long ulSmartConfigFinished, ulCC3000DHCP, OkToDoShutDown, ulCC3000DHCP_configured;
frankvnk 0:a8e46e27d041 70 volatile unsigned char ucStopSmartConfig;
frankvnk 0:a8e46e27d041 71 unsigned char pucCC3000_Rx_Buffer[CC3000_APP_BUFFER_SIZE + CC3000_RX_BUFFER_OVERHEAD_SIZE];
frankvnk 0:a8e46e27d041 72
frankvnk 0:a8e46e27d041 73 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
frankvnk 0:a8e46e27d041 74 const unsigned char smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36};
frankvnk 0:a8e46e27d041 75 #endif
frankvnk 0:a8e46e27d041 76
frankvnk 0:a8e46e27d041 77
frankvnk 0:a8e46e27d041 78 void initLEDs(void)
frankvnk 0:a8e46e27d041 79 {
frankvnk 0:a8e46e27d041 80 RED_OFF;
frankvnk 0:a8e46e27d041 81 GREEN_OFF;
frankvnk 0:a8e46e27d041 82 BLUE_OFF;
frankvnk 0:a8e46e27d041 83 LED_D1_OFF;
frankvnk 0:a8e46e27d041 84 LED_D2_OFF;
frankvnk 0:a8e46e27d041 85 LED_D3_OFF;
frankvnk 0:a8e46e27d041 86 }
frankvnk 0:a8e46e27d041 87
frankvnk 0:a8e46e27d041 88
frankvnk 0:a8e46e27d041 89 int ConnectUsingSSID(char * ssidName)
frankvnk 0:a8e46e27d041 90 {
frankvnk 0:a8e46e27d041 91 unsetCC3000MachineState(CC3000_ASSOC);
frankvnk 0:a8e46e27d041 92 // Disable Profiles and Fast Connect
frankvnk 0:a8e46e27d041 93 wlan_ioctl_set_connection_policy(0, 0, 0);
frankvnk 0:a8e46e27d041 94 wlan_disconnect();
frankvnk 0:a8e46e27d041 95 wait_ms(3);
frankvnk 0:a8e46e27d041 96 // This triggers the CC3000 to connect to specific AP with certain parameters
frankvnk 0:a8e46e27d041 97 //sends a request to connect (does not necessarily connect - callback checks that for me)
frankvnk 0:a8e46e27d041 98 // wlan_connect(SECURITY, SSID, strlen(SSID), NULL, PASSPHRASE, strlen(PASSPHRASE));
frankvnk 0:a8e46e27d041 99 #ifndef CC3000_TINY_DRIVER
frankvnk 0:a8e46e27d041 100 wlan_connect(0, ssidName, strlen(ssidName), NULL, NULL, 0);
frankvnk 0:a8e46e27d041 101 #else
frankvnk 0:a8e46e27d041 102 wlan_connect(ssidName, strlen(ssidName));
frankvnk 0:a8e46e27d041 103 #endif
frankvnk 0:a8e46e27d041 104 // We don't wait for connection. This is handled somewhere else (in the main
frankvnk 0:a8e46e27d041 105 // loop for example).
frankvnk 0:a8e46e27d041 106 return 0;
frankvnk 0:a8e46e27d041 107 }
frankvnk 0:a8e46e27d041 108
frankvnk 0:a8e46e27d041 109
frankvnk 0:a8e46e27d041 110 void CC3000_UsynchCallback(long lEventType, char * data, unsigned char length)
frankvnk 0:a8e46e27d041 111 {
frankvnk 0:a8e46e27d041 112 if (lEventType == HCI_EVNT_WLAN_ASYNC_SIMPLE_CONFIG_DONE)
frankvnk 0:a8e46e27d041 113 {
frankvnk 0:a8e46e27d041 114 ulSmartConfigFinished = 1;
frankvnk 0:a8e46e27d041 115 ucStopSmartConfig = 1;
frankvnk 0:a8e46e27d041 116 }
frankvnk 0:a8e46e27d041 117 if (lEventType == HCI_EVNT_WLAN_UNSOL_CONNECT)
frankvnk 0:a8e46e27d041 118 {
frankvnk 0:a8e46e27d041 119 ulCC3000Connected = 1;
frankvnk 0:a8e46e27d041 120 }
frankvnk 0:a8e46e27d041 121 if (lEventType == HCI_EVNT_WLAN_UNSOL_DISCONNECT)
frankvnk 0:a8e46e27d041 122 {
frankvnk 0:a8e46e27d041 123 ulCC3000Connected = 0;
frankvnk 0:a8e46e27d041 124 ulCC3000DHCP = 0;
frankvnk 0:a8e46e27d041 125 ulCC3000DHCP_configured = 0;
frankvnk 0:a8e46e27d041 126 }
frankvnk 0:a8e46e27d041 127 if (lEventType == HCI_EVNT_WLAN_UNSOL_DHCP)
frankvnk 0:a8e46e27d041 128 {
frankvnk 0:a8e46e27d041 129 // Notes:
frankvnk 0:a8e46e27d041 130 // 1) IP config parameters are received swapped
frankvnk 0:a8e46e27d041 131 // 2) IP config parameters are valid only if status is OK, i.e. ulCC3000DHCP becomes 1
frankvnk 0:a8e46e27d041 132 // only if status is OK, the flag is set to 1 and the addresses are valid
frankvnk 0:a8e46e27d041 133 if ( *(data + NETAPP_IPCONFIG_MAC_OFFSET) == 0)
frankvnk 0:a8e46e27d041 134 {
frankvnk 0:a8e46e27d041 135 sprintf( (char*)pucCC3000_Rx_Buffer,"IP:%d.%d.%d.%d\f\r", data[3],data[2], data[1], data[0] );
frankvnk 0:a8e46e27d041 136 ulCC3000DHCP = 1;
frankvnk 0:a8e46e27d041 137 }
frankvnk 0:a8e46e27d041 138 else
frankvnk 0:a8e46e27d041 139 {
frankvnk 0:a8e46e27d041 140 ulCC3000DHCP = 0;
frankvnk 0:a8e46e27d041 141 }
frankvnk 0:a8e46e27d041 142 }
frankvnk 0:a8e46e27d041 143 if (lEventType == HCI_EVENT_CC3000_CAN_SHUT_DOWN)
frankvnk 0:a8e46e27d041 144 {
frankvnk 0:a8e46e27d041 145 OkToDoShutDown = 1;
frankvnk 0:a8e46e27d041 146 }
frankvnk 0:a8e46e27d041 147 }
frankvnk 0:a8e46e27d041 148
frankvnk 0:a8e46e27d041 149
frankvnk 0:a8e46e27d041 150 int initDriver(void)
frankvnk 0:a8e46e27d041 151 {
frankvnk 1:32d1ef95eceb 152 wlan_start(0);
frankvnk 0:a8e46e27d041 153 #if IP_ALLOC_METHOD == USE_DHCP
frankvnk 0:a8e46e27d041 154
frankvnk 0:a8e46e27d041 155 // DHCP is used by default
frankvnk 0:a8e46e27d041 156 // Subnet mask is assumed to be 255.255.255.0
frankvnk 0:a8e46e27d041 157 pucSubnetMask[0] = 0;
frankvnk 0:a8e46e27d041 158 pucSubnetMask[1] = 0;
frankvnk 0:a8e46e27d041 159 pucSubnetMask[2] = 0;
frankvnk 0:a8e46e27d041 160 pucSubnetMask[3] = 0;
frankvnk 0:a8e46e27d041 161
frankvnk 0:a8e46e27d041 162 // CC3000's IP
frankvnk 0:a8e46e27d041 163 pucIP_Addr[0] = 0;
frankvnk 0:a8e46e27d041 164 pucIP_Addr[1] = 0;
frankvnk 0:a8e46e27d041 165 pucIP_Addr[2] = 0;
frankvnk 0:a8e46e27d041 166 pucIP_Addr[3] = 0;
frankvnk 0:a8e46e27d041 167
frankvnk 0:a8e46e27d041 168 // Default Gateway/Router IP
frankvnk 0:a8e46e27d041 169 // 192.168.1.1
frankvnk 0:a8e46e27d041 170 pucIP_DefaultGWAddr[0] = 0;
frankvnk 0:a8e46e27d041 171 pucIP_DefaultGWAddr[1] = 0;
frankvnk 0:a8e46e27d041 172 pucIP_DefaultGWAddr[2] = 0;
frankvnk 0:a8e46e27d041 173 pucIP_DefaultGWAddr[3] = 0;
frankvnk 0:a8e46e27d041 174
frankvnk 0:a8e46e27d041 175 // We assume the router is also a DNS server
frankvnk 0:a8e46e27d041 176 pucDNS[0] = 0;
frankvnk 0:a8e46e27d041 177 pucDNS[1] = 0;
frankvnk 0:a8e46e27d041 178 pucDNS[2] = 0;
frankvnk 0:a8e46e27d041 179 pucDNS[3] = 0;
frankvnk 0:a8e46e27d041 180
frankvnk 0:a8e46e27d041 181 // Force DHCP
frankvnk 0:a8e46e27d041 182 netapp_dhcp((unsigned long *)pucIP_Addr,
frankvnk 0:a8e46e27d041 183 (unsigned long *)pucSubnetMask,
frankvnk 0:a8e46e27d041 184 (unsigned long *)pucIP_DefaultGWAddr,
frankvnk 0:a8e46e27d041 185 (unsigned long *)pucDNS);
frankvnk 0:a8e46e27d041 186
frankvnk 0:a8e46e27d041 187 // reset the CC3000
frankvnk 0:a8e46e27d041 188 wlan_stop();
frankvnk 0:a8e46e27d041 189 wait(1);
frankvnk 0:a8e46e27d041 190 wlan_start(0);
frankvnk 0:a8e46e27d041 191
frankvnk 0:a8e46e27d041 192 #elif IP_ALLOC_METHOD == USE_STATIC_IP
frankvnk 0:a8e46e27d041 193
frankvnk 0:a8e46e27d041 194 // Subnet mask is assumed to be 255.255.255.0
frankvnk 0:a8e46e27d041 195 pucSubnetMask[0] = 0xFF;
frankvnk 0:a8e46e27d041 196 pucSubnetMask[1] = 0xFF;
frankvnk 0:a8e46e27d041 197 pucSubnetMask[2] = 0xFF;
frankvnk 0:a8e46e27d041 198 pucSubnetMask[3] = 0x0;
frankvnk 0:a8e46e27d041 199
frankvnk 0:a8e46e27d041 200 // CC3000's IP
frankvnk 0:a8e46e27d041 201 pucIP_Addr[0] = STATIC_IP_OCT1;
frankvnk 0:a8e46e27d041 202 pucIP_Addr[1] = STATIC_IP_OCT2;
frankvnk 0:a8e46e27d041 203 pucIP_Addr[2] = STATIC_IP_OCT3;
frankvnk 0:a8e46e27d041 204 pucIP_Addr[3] = STATIC_IP_OCT4;
frankvnk 0:a8e46e27d041 205
frankvnk 0:a8e46e27d041 206 // Default Gateway/Router IP
frankvnk 0:a8e46e27d041 207 // 192.168.1.1
frankvnk 0:a8e46e27d041 208 pucIP_DefaultGWAddr[0] = STATIC_IP_OCT1;
frankvnk 0:a8e46e27d041 209 pucIP_DefaultGWAddr[1] = STATIC_IP_OCT2;
frankvnk 0:a8e46e27d041 210 pucIP_DefaultGWAddr[2] = STATIC_IP_OCT3;
frankvnk 1:32d1ef95eceb 211 pucIP_DefaultGWAddr[3] = STATIC_GW_OCT4;
frankvnk 0:a8e46e27d041 212
frankvnk 0:a8e46e27d041 213 // We assume the router is also a DNS server
frankvnk 0:a8e46e27d041 214 pucDNS[0] = STATIC_IP_OCT1;
frankvnk 0:a8e46e27d041 215 pucDNS[1] = STATIC_IP_OCT2;
frankvnk 0:a8e46e27d041 216 pucDNS[2] = STATIC_IP_OCT3;
frankvnk 1:32d1ef95eceb 217 pucDNS[3] = STATIC_GW_OCT4;
frankvnk 0:a8e46e27d041 218
frankvnk 0:a8e46e27d041 219 netapp_dhcp((unsigned long *)pucIP_Addr,
frankvnk 0:a8e46e27d041 220 (unsigned long *)pucSubnetMask,
frankvnk 0:a8e46e27d041 221 (unsigned long *)pucIP_DefaultGWAddr,
frankvnk 0:a8e46e27d041 222 (unsigned long *)pucDNS);
frankvnk 0:a8e46e27d041 223
frankvnk 0:a8e46e27d041 224 // reset the CC3000 to apply Static Setting
frankvnk 0:a8e46e27d041 225 wlan_stop();
frankvnk 0:a8e46e27d041 226 wait(1);
frankvnk 0:a8e46e27d041 227 wlan_start(0);
frankvnk 0:a8e46e27d041 228
frankvnk 0:a8e46e27d041 229 #else
frankvnk 0:a8e46e27d041 230 #error No IP Configuration Method Selected. One must be configured.
frankvnk 0:a8e46e27d041 231 #endif
frankvnk 0:a8e46e27d041 232
frankvnk 0:a8e46e27d041 233 // Mask out all non-required events from CC3000
frankvnk 0:a8e46e27d041 234 wlan_set_event_mask(HCI_EVNT_WLAN_KEEPALIVE|
frankvnk 0:a8e46e27d041 235 HCI_EVNT_WLAN_UNSOL_INIT|
frankvnk 0:a8e46e27d041 236 HCI_EVNT_WLAN_ASYNC_PING_REPORT);
frankvnk 0:a8e46e27d041 237
frankvnk 0:a8e46e27d041 238 // CC3000 has been initialized
frankvnk 0:a8e46e27d041 239 setCC3000MachineState(CC3000_INIT);
frankvnk 0:a8e46e27d041 240 return(0);
frankvnk 0:a8e46e27d041 241 }
frankvnk 0:a8e46e27d041 242
frankvnk 0:a8e46e27d041 243
frankvnk 0:a8e46e27d041 244 char highestCC3000State()
frankvnk 0:a8e46e27d041 245 {
frankvnk 0:a8e46e27d041 246 // We start at the highest state and go down, checking if the state
frankvnk 0:a8e46e27d041 247 // is set.
frankvnk 0:a8e46e27d041 248 char mask = 0x80;
frankvnk 0:a8e46e27d041 249 while(!(cc3000state & mask))
frankvnk 0:a8e46e27d041 250 {
frankvnk 0:a8e46e27d041 251 mask = mask >> 1;
frankvnk 0:a8e46e27d041 252 }
frankvnk 0:a8e46e27d041 253 return mask;
frankvnk 0:a8e46e27d041 254 }
frankvnk 0:a8e46e27d041 255
frankvnk 0:a8e46e27d041 256
frankvnk 0:a8e46e27d041 257 char currentCC3000State(void)
frankvnk 0:a8e46e27d041 258 {
frankvnk 0:a8e46e27d041 259 return cc3000state;
frankvnk 0:a8e46e27d041 260 }
frankvnk 0:a8e46e27d041 261
frankvnk 0:a8e46e27d041 262
frankvnk 0:a8e46e27d041 263 void setCC3000MachineState(char stat)
frankvnk 0:a8e46e27d041 264 {
frankvnk 0:a8e46e27d041 265 cc3000state |= stat;
frankvnk 0:a8e46e27d041 266 }
frankvnk 0:a8e46e27d041 267
frankvnk 0:a8e46e27d041 268
frankvnk 0:a8e46e27d041 269 void unsetCC3000MachineState(char stat)
frankvnk 0:a8e46e27d041 270 {
frankvnk 0:a8e46e27d041 271 char bitmask = stat;
frankvnk 0:a8e46e27d041 272 cc3000state &= ~bitmask;
frankvnk 0:a8e46e27d041 273
frankvnk 0:a8e46e27d041 274 // Set all upper bits to 0 as well since state machine cannot have
frankvnk 0:a8e46e27d041 275 // those states.
frankvnk 0:a8e46e27d041 276 while(bitmask < 0x80)
frankvnk 0:a8e46e27d041 277 {
frankvnk 0:a8e46e27d041 278 cc3000state &= ~bitmask;
frankvnk 0:a8e46e27d041 279 bitmask = bitmask << 1;
frankvnk 0:a8e46e27d041 280 }
frankvnk 0:a8e46e27d041 281 }
frankvnk 0:a8e46e27d041 282
frankvnk 0:a8e46e27d041 283
frankvnk 0:a8e46e27d041 284 void resetCC3000StateMachine()
frankvnk 0:a8e46e27d041 285 {
frankvnk 0:a8e46e27d041 286 cc3000state = CC3000_UNINIT;
frankvnk 0:a8e46e27d041 287 }
frankvnk 0:a8e46e27d041 288
frankvnk 0:a8e46e27d041 289
frankvnk 0:a8e46e27d041 290 #ifndef CC3000_TINY_DRIVER
frankvnk 0:a8e46e27d041 291 tNetappIpconfigRetArgs * getCC3000Info()
frankvnk 0:a8e46e27d041 292 {
frankvnk 0:a8e46e27d041 293 if(!(currentCC3000State() & CC3000_SERVER_INIT))
frankvnk 0:a8e46e27d041 294 {
frankvnk 0:a8e46e27d041 295 // If we're not blocked by accept or others, obtain the latest
frankvnk 0:a8e46e27d041 296 netapp_ipconfig(&ipinfo);
frankvnk 0:a8e46e27d041 297 }
frankvnk 0:a8e46e27d041 298 return (&ipinfo);
frankvnk 0:a8e46e27d041 299 }
frankvnk 0:a8e46e27d041 300 #endif
frankvnk 0:a8e46e27d041 301
frankvnk 0:a8e46e27d041 302
frankvnk 0:a8e46e27d041 303 void StartSmartConfig(void)
frankvnk 0:a8e46e27d041 304 {
frankvnk 2:13ced2cb5933 305 // server_running = 1;
frankvnk 0:a8e46e27d041 306 RED_OFF;
frankvnk 0:a8e46e27d041 307 GREEN_OFF;
frankvnk 0:a8e46e27d041 308 BLUE_ON;
frankvnk 0:a8e46e27d041 309
frankvnk 0:a8e46e27d041 310 // Reset all the previous configuration
frankvnk 0:a8e46e27d041 311 wlan_ioctl_set_connection_policy(0, 0, 0);
frankvnk 0:a8e46e27d041 312 wlan_ioctl_del_profile(255);
frankvnk 0:a8e46e27d041 313
frankvnk 0:a8e46e27d041 314 //Wait until CC3000 is disconected
frankvnk 0:a8e46e27d041 315 while (ulCC3000Connected == 1)
frankvnk 0:a8e46e27d041 316 {
frankvnk 0:a8e46e27d041 317 wait_us(5);
frankvnk 0:a8e46e27d041 318 hci_unsolicited_event_handler();
frankvnk 0:a8e46e27d041 319 }
frankvnk 0:a8e46e27d041 320
frankvnk 0:a8e46e27d041 321 // Trigger the Smart Config process
frankvnk 0:a8e46e27d041 322 // Start blinking RED/GREEN during Smart Configuration process
frankvnk 0:a8e46e27d041 323 wlan_smart_config_set_prefix(aucCC3000_prefix);
frankvnk 0:a8e46e27d041 324 // Start the Smart Config process with AES disabled
frankvnk 0:a8e46e27d041 325 wlan_smart_config_start(0);
frankvnk 0:a8e46e27d041 326 BLUE_OFF;
frankvnk 0:a8e46e27d041 327 RED_ON;
frankvnk 0:a8e46e27d041 328 // Wait for Smart config finished
frankvnk 0:a8e46e27d041 329 while (ulSmartConfigFinished == 0)
frankvnk 0:a8e46e27d041 330 {
frankvnk 0:a8e46e27d041 331 wait_ms(250);
frankvnk 0:a8e46e27d041 332 RED_ON;
frankvnk 0:a8e46e27d041 333 GREEN_OFF;
frankvnk 0:a8e46e27d041 334 wait_ms(250);
frankvnk 0:a8e46e27d041 335 GREEN_ON;
frankvnk 0:a8e46e27d041 336 RED_OFF;
frankvnk 0:a8e46e27d041 337 }
frankvnk 0:a8e46e27d041 338 BLUE_ON;
frankvnk 0:a8e46e27d041 339 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
frankvnk 0:a8e46e27d041 340 // create new entry for AES encryption key
frankvnk 0:a8e46e27d041 341 nvmem_create_entry(NVMEM_AES128_KEY_FILEID,16);
frankvnk 0:a8e46e27d041 342 // write AES key to NVMEM
frankvnk 0:a8e46e27d041 343 aes_write_key((unsigned char *)(&smartconfigkey[0]));
frankvnk 0:a8e46e27d041 344 // Decrypt configuration information and add profile
frankvnk 0:a8e46e27d041 345 wlan_smart_config_process();
frankvnk 0:a8e46e27d041 346 #endif
frankvnk 0:a8e46e27d041 347 // wlan_smart_config_process();
frankvnk 0:a8e46e27d041 348
frankvnk 0:a8e46e27d041 349 // Configure to connect automatically to the AP retrieved in the
frankvnk 0:a8e46e27d041 350 // Smart config process
frankvnk 0:a8e46e27d041 351 wlan_ioctl_set_connection_policy(0, 1, 1);
frankvnk 0:a8e46e27d041 352
frankvnk 0:a8e46e27d041 353 // reset the CC3000
frankvnk 0:a8e46e27d041 354 wlan_stop();
frankvnk 0:a8e46e27d041 355 wait(2);
frankvnk 0:a8e46e27d041 356 wlan_start(0);
frankvnk 0:a8e46e27d041 357 wait(2);
frankvnk 0:a8e46e27d041 358 ConnectUsingSmartConfig = 1;
frankvnk 0:a8e46e27d041 359
frankvnk 0:a8e46e27d041 360 // Mask out all non-required events
frankvnk 0:a8e46e27d041 361 wlan_set_event_mask(HCI_EVNT_WLAN_KEEPALIVE|HCI_EVNT_WLAN_UNSOL_INIT|HCI_EVNT_WLAN_ASYNC_PING_REPORT);
frankvnk 0:a8e46e27d041 362 RED_OFF;
frankvnk 0:a8e46e27d041 363 BLUE_OFF;
frankvnk 0:a8e46e27d041 364 GREEN_OFF;
frankvnk 0:a8e46e27d041 365 }
frankvnk 0:a8e46e27d041 366
frankvnk 1:32d1ef95eceb 367
frankvnk 2:13ced2cb5933 368