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