cc3000 simple socket demo (not using EthernetInterface) !
Dependencies: NVIC_set_all_priorities cc3000_hostdriver_mbedsocket mbed
Info
Simple Socket demo application for the wireless CC3000 module.
Warning
The on-board Firmware must be updated to mbed enable the wireless module.
Goto the Component page to get the FirmwareUpdate tool (scroll down to the FirmwareUpdate topic).
Setup
Note
It is recommended to run an initial test WITHOUT security settings.
Changing network parameters in main.h
- Setup a wireless router with a non-secure wireless connection using the wireless settings stored in
main.h
or setSSID
to your wireless router SSID. For now, do not changeUSE_SMART_CONFIG
andAP_KEY
,
only changeAP_SECURITY
to NONE.
// use smart config #define USE_SMART_CONFIG 0 // Default SSID Settings #define AP_KEY "test" #define AP_SECURITY NONE #define SSID "test"
- By default, DHCP is used to obtain the IP address.
When you want to use a fixed IP address, setIP_ALLOC_METHOD USE_STATIC_IP
and enter your preferred values forSTATIC_IP_OCT_x
(device IP address) andSTATIC_GW_OCT4
(4th number of your gateway IP address) .
See the next chapter on how to useUSE_SMART_CONFIG
.
Setting up the Python script
- Download Python 2.7 from http://www.python.org/download/
Install it on a computer connected to the router you previously set up (wireless or wired).
- Download this Python script to the Python2.7 folder (credit : Jim Carver from Avnet).
- Compile the
CC3000_Simple_Socket_demo
code and save it to your board.
Running the application for the first time
- Open a terminal program (eg: TeraTerm) and connect to your board (serial speed : 115200 baud).
- Press the reset button on your board.
- Following startup screen will appear :
Note
The version info can be different.
the dots in the MAC address will show your CC3000's real MAC address.
cc3000 simple socket demo. MAC address + cc3000 info MAC address ..:..:..:..:..:.. FTC 0 PP_version 3.4 SERV_PACK 1.11 DRV_VER 7.14.24 FW_VER 7.12.14 User's AP setup: SSID: "test", Password: "test", Security: 3 <0> Normal run. SmartConfig will start if no valid connection exists. <1> Connect using fixed SSID without AP_KEY: test <2> Connect using fixed SSID with AP_KEY: test <8> Erase all stored profiles. <9> SmartConfig.
- For the initial test, select option
<1>
(Connect using fixed SSID without AP_KEY: ...). - If all goes well, the following screen is shown (the IP address can be different):
Attempting SSID Connection. DHCP request Waiting for dhcp to be set. Waiting for dhcp to be set. DHCP assigned IP Address = 192.168.1.100
- On the computer where you installed Python2.7:
- Make sure the connection between your computer and the wireless 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 controller board will send following info to the serial port:
Connection from: 192.168.1.101
When we press Enter
in the DOS window, the controller board will send following info to the serial port:
Connection from: 192.168.0.10 Received: Hello Wi-Go Sending the message to the server.
And the DOS window will show:
recv from : data: Hello Python
Using option <2>
- In your wireless router, change the non-secure wireless connection to WEP, WPA or WPA2 and enter a security key.
- In
main.h
, updateAP_SECURITY
andAP_KEY
with the values you set in your wireless router.
Valid values forAP_SECURITY
are :NONE
,WEP
,WPA
andWPA2
- Recompile the code and save it to your board. Reconnect the terminal program and press reset on your board.
- When the selection menu appears, choose option
<2>
.
The communication sequence for option <2> is identical as described for option <1> but now a secure connection is used.
Using the application's options <0>, <8> and <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 wireless settings stored inmain.h
.
Option<0>
will only start SmartConfig if no valid connection exists (First Time Config),
but if the CC3000 was previously configured using SmartConfig, it will automatically connect using the stored wireless network profile.
- Option
<8>
: As there are only 7 profile slots available, this option can be used to erase all stored profiles.
- Option
<9>
allows the user to switch to another wireless connection.
This connection is stored in one of the 7 profiles. More info on profile priorities is available here.
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 : Open the Smart Config and Home Automation link 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
main.cpp@0:ce33c63eefe5, 2013-09-08 (annotated)
- Committer:
- Kojto
- Date:
- Sun Sep 08 18:31:33 2013 +0000
- Revision:
- 0:ce33c63eefe5
- Child:
- 1:99076f2d9408
initial version of new simple socket
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Kojto | 0:ce33c63eefe5 | 1 | #include "mbed.h" |
Kojto | 0:ce33c63eefe5 | 2 | #include "KL25Z_irq_prio.h" |
Kojto | 0:ce33c63eefe5 | 3 | #include "cc3000.h" |
Kojto | 0:ce33c63eefe5 | 4 | #include "doTCPIP.h" |
Kojto | 0:ce33c63eefe5 | 5 | #include "main.h" |
Kojto | 0:ce33c63eefe5 | 6 | |
Kojto | 0:ce33c63eefe5 | 7 | using namespace mbed_cc3000; |
Kojto | 0:ce33c63eefe5 | 8 | |
Kojto | 0:ce33c63eefe5 | 9 | // Serial USB port |
Kojto | 0:ce33c63eefe5 | 10 | Serial pc(USBTX, USBRX); |
Kojto | 0:ce33c63eefe5 | 11 | // Wi-Go battery charger control |
Kojto | 0:ce33c63eefe5 | 12 | DigitalOut PWR_EN1(PTB2); |
Kojto | 0:ce33c63eefe5 | 13 | DigitalOut PWR_EN2(PTB3); |
Kojto | 0:ce33c63eefe5 | 14 | // Wi-go LED |
Kojto | 0:ce33c63eefe5 | 15 | DigitalOut ledr (LED_RED); |
Kojto | 0:ce33c63eefe5 | 16 | DigitalOut ledg (LED_GREEN); |
Kojto | 0:ce33c63eefe5 | 17 | DigitalOut ledb (LED_BLUE); |
Kojto | 0:ce33c63eefe5 | 18 | DigitalOut led1 (PTB8); |
Kojto | 0:ce33c63eefe5 | 19 | DigitalOut led2 (PTB9); |
Kojto | 0:ce33c63eefe5 | 20 | DigitalOut led3 (PTB10); |
Kojto | 0:ce33c63eefe5 | 21 | // Wi-go cc3000 |
Kojto | 0:ce33c63eefe5 | 22 | cc3000 wigo(PTA16, PTA13, PTD0, SPI(PTD2, PTD3, PTC5), PORTA_IRQn); |
Kojto | 0:ce33c63eefe5 | 23 | |
Kojto | 0:ce33c63eefe5 | 24 | /* TODO REMOVE -> new function with all priorities as well */ |
Kojto | 0:ce33c63eefe5 | 25 | #define WLAN_ISF_PCR PORTA->PCR[16] |
Kojto | 0:ce33c63eefe5 | 26 | #define WLAN_ISF_ISFR PORTA->ISFR |
Kojto | 0:ce33c63eefe5 | 27 | #define WLAN_ISF_MASK (1<<16) |
Kojto | 0:ce33c63eefe5 | 28 | |
Kojto | 0:ce33c63eefe5 | 29 | void initLEDs(void) |
Kojto | 0:ce33c63eefe5 | 30 | { |
Kojto | 0:ce33c63eefe5 | 31 | RED_OFF; |
Kojto | 0:ce33c63eefe5 | 32 | GREEN_OFF; |
Kojto | 0:ce33c63eefe5 | 33 | BLUE_OFF; |
Kojto | 0:ce33c63eefe5 | 34 | LED_D1_OFF; |
Kojto | 0:ce33c63eefe5 | 35 | LED_D2_OFF; |
Kojto | 0:ce33c63eefe5 | 36 | LED_D3_OFF; |
Kojto | 0:ce33c63eefe5 | 37 | } |
Kojto | 0:ce33c63eefe5 | 38 | |
Kojto | 0:ce33c63eefe5 | 39 | void print_cc3000_info() { |
Kojto | 0:ce33c63eefe5 | 40 | wigo.get_user_file_info((uint8_t *)&userFS, sizeof(userFS)); |
Kojto | 0:ce33c63eefe5 | 41 | wigo.get_mac_address(myMAC); |
Kojto | 0:ce33c63eefe5 | 42 | printf("\n\nWi-Go MAC address %02x:%02x:%02x:%02x:%02x:%02x\n\n", myMAC[0], myMAC[1], myMAC[2], myMAC[3], myMAC[4], myMAC[5]); |
Kojto | 0:ce33c63eefe5 | 43 | |
Kojto | 0:ce33c63eefe5 | 44 | printf("FTC %i\n",userFS.FTC); |
Kojto | 0:ce33c63eefe5 | 45 | printf("PP_version %i.%i\n",userFS.PP_version[0], userFS.PP_version[1]); |
Kojto | 0:ce33c63eefe5 | 46 | printf("SERV_PACK %i.%i\n",userFS.SERV_PACK[0], userFS.SERV_PACK[1]); |
Kojto | 0:ce33c63eefe5 | 47 | printf("DRV_VER %i.%i.%i\n",userFS.DRV_VER[0], userFS.DRV_VER[1], userFS.DRV_VER[2]); |
Kojto | 0:ce33c63eefe5 | 48 | printf("FW_VER %i.%i.%i\n",userFS.FW_VER[0], userFS.FW_VER[1], userFS.FW_VER[2]); |
Kojto | 0:ce33c63eefe5 | 49 | } |
Kojto | 0:ce33c63eefe5 | 50 | |
Kojto | 0:ce33c63eefe5 | 51 | int32_t set_static_dhcp(void) |
Kojto | 0:ce33c63eefe5 | 52 | { |
Kojto | 0:ce33c63eefe5 | 53 | uint8_t pucIP_Addr[4]; |
Kojto | 0:ce33c63eefe5 | 54 | uint8_t pucIP_DefaultGWAddr[4]; |
Kojto | 0:ce33c63eefe5 | 55 | uint8_t pucSubnetMask[4]; |
Kojto | 0:ce33c63eefe5 | 56 | uint8_t pucDNS[4]; |
Kojto | 0:ce33c63eefe5 | 57 | |
Kojto | 0:ce33c63eefe5 | 58 | // Subnet mask is assumed to be 255.255.255.0 |
Kojto | 0:ce33c63eefe5 | 59 | pucSubnetMask[0] = 0xFF; |
Kojto | 0:ce33c63eefe5 | 60 | pucSubnetMask[1] = 0xFF; |
Kojto | 0:ce33c63eefe5 | 61 | pucSubnetMask[2] = 0xFF; |
Kojto | 0:ce33c63eefe5 | 62 | pucSubnetMask[3] = 0x0; |
Kojto | 0:ce33c63eefe5 | 63 | |
Kojto | 0:ce33c63eefe5 | 64 | // CC3000's IP |
Kojto | 0:ce33c63eefe5 | 65 | pucIP_Addr[0] = STATIC_IP_OCT1; |
Kojto | 0:ce33c63eefe5 | 66 | pucIP_Addr[1] = STATIC_IP_OCT2; |
Kojto | 0:ce33c63eefe5 | 67 | pucIP_Addr[2] = STATIC_IP_OCT3; |
Kojto | 0:ce33c63eefe5 | 68 | pucIP_Addr[3] = STATIC_IP_OCT4; |
Kojto | 0:ce33c63eefe5 | 69 | |
Kojto | 0:ce33c63eefe5 | 70 | // Default Gateway/Router IP |
Kojto | 0:ce33c63eefe5 | 71 | // 192.168.1.1 |
Kojto | 0:ce33c63eefe5 | 72 | pucIP_DefaultGWAddr[0] = STATIC_IP_OCT1; |
Kojto | 0:ce33c63eefe5 | 73 | pucIP_DefaultGWAddr[1] = STATIC_IP_OCT2; |
Kojto | 0:ce33c63eefe5 | 74 | pucIP_DefaultGWAddr[2] = STATIC_IP_OCT3; |
Kojto | 0:ce33c63eefe5 | 75 | pucIP_DefaultGWAddr[3] = STATIC_GW_OCT4; |
Kojto | 0:ce33c63eefe5 | 76 | |
Kojto | 0:ce33c63eefe5 | 77 | // We assume the router is also a DNS server |
Kojto | 0:ce33c63eefe5 | 78 | pucDNS[0] = STATIC_IP_OCT1; |
Kojto | 0:ce33c63eefe5 | 79 | pucDNS[1] = STATIC_IP_OCT2; |
Kojto | 0:ce33c63eefe5 | 80 | pucDNS[2] = STATIC_IP_OCT3; |
Kojto | 0:ce33c63eefe5 | 81 | pucDNS[3] = STATIC_GW_OCT4; |
Kojto | 0:ce33c63eefe5 | 82 | |
Kojto | 0:ce33c63eefe5 | 83 | wigo._netapp.dhcp((uint32_t *)pucIP_Addr, |
Kojto | 0:ce33c63eefe5 | 84 | (uint32_t *)pucSubnetMask, |
Kojto | 0:ce33c63eefe5 | 85 | (uint32_t *)pucIP_DefaultGWAddr, |
Kojto | 0:ce33c63eefe5 | 86 | (uint32_t *)pucDNS); |
Kojto | 0:ce33c63eefe5 | 87 | |
Kojto | 0:ce33c63eefe5 | 88 | // reset the CC3000 to apply Static Setting |
Kojto | 0:ce33c63eefe5 | 89 | wigo._wlan.stop(); |
Kojto | 0:ce33c63eefe5 | 90 | wait(1); |
Kojto | 0:ce33c63eefe5 | 91 | wigo._wlan.start(0); |
Kojto | 0:ce33c63eefe5 | 92 | |
Kojto | 0:ce33c63eefe5 | 93 | // Mask out all non-required events from CC3000 |
Kojto | 0:ce33c63eefe5 | 94 | wigo._wlan.set_event_mask(HCI_EVNT_WLAN_KEEPALIVE| |
Kojto | 0:ce33c63eefe5 | 95 | HCI_EVNT_WLAN_UNSOL_INIT| |
Kojto | 0:ce33c63eefe5 | 96 | HCI_EVNT_WLAN_ASYNC_PING_REPORT); |
Kojto | 0:ce33c63eefe5 | 97 | return(0); |
Kojto | 0:ce33c63eefe5 | 98 | } |
Kojto | 0:ce33c63eefe5 | 99 | |
Kojto | 0:ce33c63eefe5 | 100 | void connect_to_ssid(uint8_t *ssid, uint8_t *key, uint8_t sec_mode) { |
Kojto | 0:ce33c63eefe5 | 101 | printf("Connecting to SSID: %s. Timeout is 10s.\n",ssid); |
Kojto | 0:ce33c63eefe5 | 102 | if (wigo.connect_to_AP(ssid, key, sec_mode) == true) { |
Kojto | 0:ce33c63eefe5 | 103 | printf("Connected\n"); |
Kojto | 0:ce33c63eefe5 | 104 | } else { |
Kojto | 0:ce33c63eefe5 | 105 | printf("Connection timed-out (error).\n"); |
Kojto | 0:ce33c63eefe5 | 106 | } |
Kojto | 0:ce33c63eefe5 | 107 | } |
Kojto | 0:ce33c63eefe5 | 108 | |
Kojto | 0:ce33c63eefe5 | 109 | void connect_to_ssid(uint8_t *ssid) { |
Kojto | 0:ce33c63eefe5 | 110 | wigo.connect_open(ssid); |
Kojto | 0:ce33c63eefe5 | 111 | } |
Kojto | 0:ce33c63eefe5 | 112 | |
Kojto | 0:ce33c63eefe5 | 113 | int main() { |
Kojto | 0:ce33c63eefe5 | 114 | // set current to 500mA since we're turning on the Wi-Fi |
Kojto | 0:ce33c63eefe5 | 115 | PWR_EN1 = 0; |
Kojto | 0:ce33c63eefe5 | 116 | PWR_EN2 = 1; |
Kojto | 0:ce33c63eefe5 | 117 | |
Kojto | 0:ce33c63eefe5 | 118 | pc.baud (115200); |
Kojto | 0:ce33c63eefe5 | 119 | |
Kojto | 0:ce33c63eefe5 | 120 | NVIC_SetAllPriority(3); // Set ALL interrupt priorities to level 3 |
Kojto | 0:ce33c63eefe5 | 121 | NVIC_SetPriority(SPI0_IRQn, 0x0); // Wi-Fi SPI interrupt must be higher priority than SysTick |
Kojto | 0:ce33c63eefe5 | 122 | NVIC_SetPriority(PORTA_IRQn, 0x1); |
Kojto | 0:ce33c63eefe5 | 123 | NVIC_SetPriority(SysTick_IRQn, 0x2); // SysTick set to lower priority than Wi-Fi SPI bus interrupt |
Kojto | 0:ce33c63eefe5 | 124 | |
Kojto | 0:ce33c63eefe5 | 125 | // Clear pending interrupt |
Kojto | 0:ce33c63eefe5 | 126 | WLAN_ISF_PCR |= PORT_PCR_ISF_MASK; |
Kojto | 0:ce33c63eefe5 | 127 | WLAN_ISF_ISFR |= WLAN_ISF_MASK; |
Kojto | 0:ce33c63eefe5 | 128 | |
Kojto | 0:ce33c63eefe5 | 129 | GREEN_ON; |
Kojto | 0:ce33c63eefe5 | 130 | wigo.start(0); |
Kojto | 0:ce33c63eefe5 | 131 | printf("CC3000 Python demo.\n"); |
Kojto | 0:ce33c63eefe5 | 132 | print_cc3000_info(); |
Kojto | 0:ce33c63eefe5 | 133 | |
Kojto | 0:ce33c63eefe5 | 134 | printf("\n<0> Normal run. SmartConfig will\n start if no valid connection exists.\n"); |
Kojto | 0:ce33c63eefe5 | 135 | printf("<1> Connect using fixed SSID : %s\n", SSID); |
Kojto | 0:ce33c63eefe5 | 136 | printf("<2> SmartConfig.\n"); |
Kojto | 0:ce33c63eefe5 | 137 | |
Kojto | 0:ce33c63eefe5 | 138 | signed char c = getchar(); |
Kojto | 0:ce33c63eefe5 | 139 | switch (c) |
Kojto | 0:ce33c63eefe5 | 140 | { |
Kojto | 0:ce33c63eefe5 | 141 | case '0': |
Kojto | 0:ce33c63eefe5 | 142 | if(!userFS.FTC) |
Kojto | 0:ce33c63eefe5 | 143 | { |
Kojto | 0:ce33c63eefe5 | 144 | do_FTC(); |
Kojto | 0:ce33c63eefe5 | 145 | wigo._wlan.stop(); |
Kojto | 0:ce33c63eefe5 | 146 | } |
Kojto | 0:ce33c63eefe5 | 147 | break; |
Kojto | 0:ce33c63eefe5 | 148 | case '1': |
Kojto | 0:ce33c63eefe5 | 149 | printf("Attempting SSID Connection\n"); |
Kojto | 0:ce33c63eefe5 | 150 | #ifndef CC3000_TINY_DRIVER |
Kojto | 0:ce33c63eefe5 | 151 | #ifdef AP_KEY |
Kojto | 0:ce33c63eefe5 | 152 | connect_to_ssid((uint8_t *)SSID,(uint8_t *)AP_KEY,AP_SECURITY); /* TODO rewrite to const vraiables - NOT MACROS */ |
Kojto | 0:ce33c63eefe5 | 153 | #else |
Kojto | 0:ce33c63eefe5 | 154 | connect_to_ssid(SSID); |
Kojto | 0:ce33c63eefe5 | 155 | #endif |
Kojto | 0:ce33c63eefe5 | 156 | #else |
Kojto | 0:ce33c63eefe5 | 157 | connect_to_ssid(SSID); |
Kojto | 0:ce33c63eefe5 | 158 | #endif |
Kojto | 0:ce33c63eefe5 | 159 | break; |
Kojto | 0:ce33c63eefe5 | 160 | case '2': |
Kojto | 0:ce33c63eefe5 | 161 | //server_running = 1; |
Kojto | 0:ce33c63eefe5 | 162 | //runSmartConfig = 1; |
Kojto | 0:ce33c63eefe5 | 163 | start_smart_config(); |
Kojto | 0:ce33c63eefe5 | 164 | init_tcp(); |
Kojto | 0:ce33c63eefe5 | 165 | //server_running = 1; |
Kojto | 0:ce33c63eefe5 | 166 | RED_OFF; |
Kojto | 0:ce33c63eefe5 | 167 | GREEN_OFF; |
Kojto | 0:ce33c63eefe5 | 168 | BLUE_OFF; |
Kojto | 0:ce33c63eefe5 | 169 | printf("Press the reset button on your board and select 1...\n"); |
Kojto | 0:ce33c63eefe5 | 170 | while(1) |
Kojto | 0:ce33c63eefe5 | 171 | { |
Kojto | 0:ce33c63eefe5 | 172 | GREEN_ON; |
Kojto | 0:ce33c63eefe5 | 173 | wait_ms(500); |
Kojto | 0:ce33c63eefe5 | 174 | GREEN_OFF; |
Kojto | 0:ce33c63eefe5 | 175 | wait_ms(500); |
Kojto | 0:ce33c63eefe5 | 176 | } |
Kojto | 0:ce33c63eefe5 | 177 | default: |
Kojto | 0:ce33c63eefe5 | 178 | printf("Wrong selection.\n"); |
Kojto | 0:ce33c63eefe5 | 179 | printf("Reset the board and try again.\n"); |
Kojto | 0:ce33c63eefe5 | 180 | break; |
Kojto | 0:ce33c63eefe5 | 181 | } |
Kojto | 0:ce33c63eefe5 | 182 | //server_running = 0; |
Kojto | 0:ce33c63eefe5 | 183 | SmartConfigProfilestored = SMART_CONFIG_SET; |
Kojto | 0:ce33c63eefe5 | 184 | RED_OFF; |
Kojto | 0:ce33c63eefe5 | 185 | GREEN_OFF; |
Kojto | 0:ce33c63eefe5 | 186 | BLUE_OFF; |
Kojto | 0:ce33c63eefe5 | 187 | |
Kojto | 0:ce33c63eefe5 | 188 | //dynamic dhcp is set by default |
Kojto | 0:ce33c63eefe5 | 189 | #if IP_ALLOC_METHOD == USE_STATIC_IP |
Kojto | 0:ce33c63eefe5 | 190 | set_static_dhcp(); |
Kojto | 0:ce33c63eefe5 | 191 | #endif |
Kojto | 0:ce33c63eefe5 | 192 | |
Kojto | 0:ce33c63eefe5 | 193 | run_tcp_server(); // Run TCP/IP Connection to host |
Kojto | 0:ce33c63eefe5 | 194 | } |