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 set SSID to your wireless router SSID. For now, do not change USE_SMART_CONFIG and AP_KEY,
    only change AP_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, set IP_ALLOC_METHOD USE_STATIC_IP and enter your preferred values for STATIC_IP_OCT_x (device IP address) and STATIC_GW_OCT4 (4th number of your gateway IP address) .
    See the next chapter on how to use USE_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, update AP_SECURITY and AP_KEY with the values you set in your wireless router.
    Valid values for AP_SECURITY are : NONE, WEP, WPA and WPA2
  • 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 in main.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:

Committer:
Kojto
Date:
Tue Jun 03 08:31:20 2014 +0000
Revision:
15:af967b9898f8
Parent:
14:5f84f9ae168e
update mbed lib to r84

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 6:6eaae34586b8 1 /* mbed Microcontroller Library
Kojto 6:6eaae34586b8 2 * Copyright (c) 2006-2013 ARM Limited
Kojto 6:6eaae34586b8 3 *
Kojto 6:6eaae34586b8 4 * Licensed under the Apache License, Version 2.0 (the "License");
Kojto 6:6eaae34586b8 5 * you may not use this file except in compliance with the License.
Kojto 6:6eaae34586b8 6 * You may obtain a copy of the License at
Kojto 6:6eaae34586b8 7 *
Kojto 6:6eaae34586b8 8 * http://www.apache.org/licenses/LICENSE-2.0
Kojto 6:6eaae34586b8 9 *
Kojto 6:6eaae34586b8 10 * Unless required by applicable law or agreed to in writing, software
Kojto 6:6eaae34586b8 11 * distributed under the License is distributed on an "AS IS" BASIS,
Kojto 6:6eaae34586b8 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Kojto 6:6eaae34586b8 13 * See the License for the specific language governing permissions and
Kojto 6:6eaae34586b8 14 * limitations under the License.
Kojto 6:6eaae34586b8 15 */
Kojto 6:6eaae34586b8 16 #include "mbed.h"
Kojto 6:6eaae34586b8 17 #include "cc3000.h"
Kojto 6:6eaae34586b8 18 #include "main.h"
Kojto 6:6eaae34586b8 19 #include "TCPSocketConnection.h"
Kojto 6:6eaae34586b8 20 #include "TCPSocketServer.h"
Kojto 6:6eaae34586b8 21
Kojto 8:be68e827aa53 22 #define STRINGIFY(x) #x
Kojto 8:be68e827aa53 23 #define TO_STRING(x) STRINGIFY(x)
Kojto 8:be68e827aa53 24
Kojto 6:6eaae34586b8 25 using namespace mbed_cc3000;
Kojto 6:6eaae34586b8 26
Kojto 6:6eaae34586b8 27 tUserFS user_info;
Kojto 6:6eaae34586b8 28
Kojto 6:6eaae34586b8 29 /* cc3000 module declaration specific for user's board. Check also init() */
Kojto 6:6eaae34586b8 30 #if (MY_BOARD == WIGO)
Kojto 14:5f84f9ae168e 31 cc3000 wifi(PTA16, PTA13, PTD0, SPI(PTD2, PTD3, PTC5));
Kojto 6:6eaae34586b8 32 Serial pc(USBTX, USBRX);
Kojto 6:6eaae34586b8 33 #elif (MY_BOARD == WIFI_DIPCORTEX)
Kojto 14:5f84f9ae168e 34 cc3000 wifi(p28, p27, p30, SPI(p21, p14, p37));
Kojto 6:6eaae34586b8 35 Serial pc(UART_TX, UART_RX);
Kojto 14:5f84f9ae168e 36 #elif (MY_BOARD == MBED_BOARD_EXAMPLE)
Kojto 14:5f84f9ae168e 37 cc3000 wifi(p9, p10, p8, SPI(p5, p6, p7));
Kojto 14:5f84f9ae168e 38 Serial pc(USBTX, USBRX);
Kojto 6:6eaae34586b8 39 #else
Kojto 6:6eaae34586b8 40
Kojto 6:6eaae34586b8 41 #endif
Kojto 6:6eaae34586b8 42
Kojto 6:6eaae34586b8 43 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
Kojto 6:6eaae34586b8 44 const uint8_t smartconfigkey[] = {0x73,0x6d,0x61,0x72,0x74,0x63,0x6f,0x6e,0x66,0x69,0x67,0x41,0x45,0x53,0x31,0x36};
Kojto 6:6eaae34586b8 45 #else
Kojto 6:6eaae34586b8 46 const uint8_t smartconfigkey = 0;
Kojto 6:6eaae34586b8 47 #endif
Kojto 6:6eaae34586b8 48
Kojto 6:6eaae34586b8 49 /**
Kojto 6:6eaae34586b8 50 * \brief Print cc3000 information
Kojto 6:6eaae34586b8 51 * \param none
Kojto 6:6eaae34586b8 52 * \return none
Kojto 6:6eaae34586b8 53 */
Kojto 6:6eaae34586b8 54 void print_cc3000_info() {
Kojto 6:6eaae34586b8 55 uint8_t myMAC[8];
Kojto 6:6eaae34586b8 56
Kojto 6:6eaae34586b8 57 printf("MAC address + cc3000 info \r\n");
Kojto 6:6eaae34586b8 58 wifi.get_user_file_info((uint8_t *)&user_info, sizeof(user_info));
Kojto 6:6eaae34586b8 59 wifi.get_mac_address(myMAC);
Kojto 6:6eaae34586b8 60 printf(" MAC address %02x:%02x:%02x:%02x:%02x:%02x \r\n \r\n", myMAC[0], myMAC[1], myMAC[2], myMAC[3], myMAC[4], myMAC[5]);
Kojto 6:6eaae34586b8 61
Kojto 6:6eaae34586b8 62 printf(" FTC %i \r\n",user_info.FTC);
Kojto 6:6eaae34586b8 63 printf(" PP_version %i.%i \r\n",user_info.PP_version[0], user_info.PP_version[1]);
Kojto 6:6eaae34586b8 64 printf(" SERV_PACK %i.%i \r\n",user_info.SERV_PACK[0], user_info.SERV_PACK[1]);
Kojto 6:6eaae34586b8 65 printf(" DRV_VER %i.%i.%i \r\n",user_info.DRV_VER[0], user_info.DRV_VER[1], user_info.DRV_VER[2]);
Kojto 6:6eaae34586b8 66 printf(" FW_VER %i.%i.%i \r\n",user_info.FW_VER[0], user_info.FW_VER[1], user_info.FW_VER[2]);
Kojto 6:6eaae34586b8 67 }
Kojto 6:6eaae34586b8 68
Kojto 6:6eaae34586b8 69 /**
Kojto 6:6eaae34586b8 70 * \brief Connect to SSID with a timeout
Kojto 6:6eaae34586b8 71 * \param ssid Name of SSID
Kojto 6:6eaae34586b8 72 * \param key Password
Kojto 6:6eaae34586b8 73 * \param sec_mode Security mode
Kojto 6:6eaae34586b8 74 * \return none
Kojto 6:6eaae34586b8 75 */
Kojto 6:6eaae34586b8 76 void connect_to_ssid(char *ssid, char *key, unsigned char sec_mode) {
Kojto 7:afaa17c11965 77 printf("Connecting to SSID: %s. Timeout is 10s. \r\n",ssid);
Kojto 6:6eaae34586b8 78 if (wifi.connect_to_AP((uint8_t *)ssid, (uint8_t *)key, sec_mode) == true) {
Kojto 7:afaa17c11965 79 printf(" Connected. \r\n");
Kojto 6:6eaae34586b8 80 } else {
Kojto 7:afaa17c11965 81 printf(" Connection timed-out (error). Please restart. \r\n");
Kojto 6:6eaae34586b8 82 while(1);
Kojto 6:6eaae34586b8 83 }
Kojto 6:6eaae34586b8 84 }
Kojto 6:6eaae34586b8 85
Kojto 6:6eaae34586b8 86 /**
Kojto 6:6eaae34586b8 87 * \brief Connect to SSID without security
Kojto 6:6eaae34586b8 88 * \param ssid Name of SSID
Kojto 6:6eaae34586b8 89 * \return none
Kojto 6:6eaae34586b8 90 */
Kojto 6:6eaae34586b8 91 void connect_to_ssid(char *ssid) {
Kojto 6:6eaae34586b8 92 wifi.connect_open((uint8_t *)ssid);
Kojto 6:6eaae34586b8 93 }
Kojto 6:6eaae34586b8 94
Kojto 6:6eaae34586b8 95 /**
Kojto 6:6eaae34586b8 96 * \brief First time configuration
Kojto 6:6eaae34586b8 97 * \param none
Kojto 6:6eaae34586b8 98 * \return none
Kojto 6:6eaae34586b8 99 */
Kojto 6:6eaae34586b8 100 void do_FTC(void) {
Kojto 6:6eaae34586b8 101 printf("Running First Time Configuration \r\n");
Kojto 6:6eaae34586b8 102 wifi.start_smart_config(smartconfigkey);
Kojto 6:6eaae34586b8 103 while (wifi.is_dhcp_configured() == false) {
Kojto 6:6eaae34586b8 104 wait_ms(500);
Kojto 6:6eaae34586b8 105 printf("Waiting for dhcp to be set. \r\n");
Kojto 6:6eaae34586b8 106 }
Kojto 6:6eaae34586b8 107 user_info.FTC = 1;
Kojto 6:6eaae34586b8 108 wifi.set_user_file_info((uint8_t *)&user_info, sizeof(user_info));
Kojto 6:6eaae34586b8 109 wifi._wlan.stop();
Kojto 7:afaa17c11965 110 printf("FTC finished. \r\n");
Kojto 6:6eaae34586b8 111 }
Kojto 6:6eaae34586b8 112
Kojto 8:be68e827aa53 113 /**
Kojto 7:afaa17c11965 114 * \brief Start smart config
Kojto 7:afaa17c11965 115 * \param none
Kojto 6:6eaae34586b8 116 * \return none
Kojto 6:6eaae34586b8 117 */
Kojto 6:6eaae34586b8 118 void start_smart_config() {
Kojto 6:6eaae34586b8 119 wifi.start_smart_config(smartconfigkey);
Kojto 6:6eaae34586b8 120 }
Kojto 6:6eaae34586b8 121
Kojto 8:be68e827aa53 122 /**
Kojto 7:afaa17c11965 123 * \brief Simple socket demo
Kojto 7:afaa17c11965 124 * \param none
Kojto 6:6eaae34586b8 125 * \return int
Kojto 6:6eaae34586b8 126 */
Kojto 6:6eaae34586b8 127 int main() {
Kojto 6:6eaae34586b8 128 init(); /* board dependent init */
Kojto 6:6eaae34586b8 129 pc.baud(115200);
Kojto 6:6eaae34586b8 130
Kojto 6:6eaae34586b8 131 wifi.start(0);
Kojto 7:afaa17c11965 132 printf("cc3000 simple socket demo. \r\n");
Kojto 6:6eaae34586b8 133 print_cc3000_info();
Kojto 6:6eaae34586b8 134
Kojto 8:be68e827aa53 135 printf("User's AP setup: SSID: %s, Password: %s, Security: %s \r\n", TO_STRING(SSID), TO_STRING(AP_KEY), TO_STRING(AP_SECURITY));
Kojto 8:be68e827aa53 136
Kojto 6:6eaae34586b8 137 printf("\n<0> Normal run. SmartConfig will \r\n start if no valid connection exists. \r\n");
Kojto 8:be68e827aa53 138 printf("<1> Connect using fixed SSID without AP_KEY: %s \r\n", SSID);
Kojto 8:be68e827aa53 139 printf("<2> Connect using fixed SSID with AP_KEY: %s \r\n", SSID);
frankvnk 11:991f6c2444e9 140 printf("<8> Erase all stored profiles.\r\n");
Kojto 8:be68e827aa53 141 printf("<9> SmartConfig. \r\n");
Kojto 6:6eaae34586b8 142
Kojto 6:6eaae34586b8 143 signed char c = getchar();
Kojto 6:6eaae34586b8 144 switch (c)
Kojto 6:6eaae34586b8 145 {
Kojto 6:6eaae34586b8 146 case '0':
Kojto 10:09a1dd3fbd3d 147 if (!user_info.FTC) {
Kojto 6:6eaae34586b8 148 do_FTC();
Kojto 6:6eaae34586b8 149 wifi._wlan.stop();
Kojto 10:09a1dd3fbd3d 150 } else {
Kojto 10:09a1dd3fbd3d 151 wifi._wlan.ioctl_set_connection_policy(0, 1, 1);
Kojto 6:6eaae34586b8 152 }
Kojto 6:6eaae34586b8 153 break;
Kojto 6:6eaae34586b8 154 case '1':
Kojto 6:6eaae34586b8 155 printf("Attempting SSID Connection. \r\n");
Kojto 8:be68e827aa53 156
Kojto 8:be68e827aa53 157 wifi._wlan.ioctl_set_connection_policy(0, 0, 0);
Kojto 8:be68e827aa53 158 connect_to_ssid(SSID);
Kojto 8:be68e827aa53 159 break;
Kojto 8:be68e827aa53 160 case '2':
Kojto 8:be68e827aa53 161 printf("Attempting SSID Connection. \r\n");
Kojto 8:be68e827aa53 162
Kojto 8:be68e827aa53 163 wifi._wlan.ioctl_set_connection_policy(0, 0, 0);
Kojto 6:6eaae34586b8 164 #ifndef CC3000_TINY_DRIVER
Kojto 8:be68e827aa53 165 connect_to_ssid(SSID, AP_KEY, AP_SECURITY);
Kojto 6:6eaae34586b8 166 #else
Kojto 6:6eaae34586b8 167 connect_to_ssid(SSID);
Kojto 6:6eaae34586b8 168 #endif
Kojto 6:6eaae34586b8 169 break;
frankvnk 11:991f6c2444e9 170 case '8':
frankvnk 11:991f6c2444e9 171 printf("Erasing all wireless profiles. \r\n");
frankvnk 11:991f6c2444e9 172 wifi.delete_profiles();
frankvnk 11:991f6c2444e9 173 wifi.stop();
frankvnk 11:991f6c2444e9 174 printf("Done - press the reset button on your board... \r\n");
frankvnk 11:991f6c2444e9 175 while(1);
frankvnk 11:991f6c2444e9 176
Kojto 8:be68e827aa53 177 case '9':
Kojto 6:6eaae34586b8 178 printf("Starting Smart Config configuration. \r\n");
frankvnk 13:4f08ef840b16 179 if (!user_info.FTC) {
frankvnk 13:4f08ef840b16 180 printf("First Time Configuration was not run. \r\nSwitching to First Time Configuration. \r\n");
frankvnk 13:4f08ef840b16 181 do_FTC();
frankvnk 13:4f08ef840b16 182 wifi._wlan.stop();
frankvnk 13:4f08ef840b16 183 } else {
frankvnk 13:4f08ef840b16 184 start_smart_config();
frankvnk 13:4f08ef840b16 185 }
Kojto 6:6eaae34586b8 186 while (wifi.is_dhcp_configured() == false)
Kojto 6:6eaae34586b8 187 {
Kojto 6:6eaae34586b8 188 wait_ms(500);
Kojto 6:6eaae34586b8 189 printf("Waiting for dhcp to be set. \r\n");
Kojto 6:6eaae34586b8 190 }
Kojto 6:6eaae34586b8 191 printf("Press the reset button on your board and select 0... \r\n");
Kojto 6:6eaae34586b8 192 while(1);
Kojto 6:6eaae34586b8 193 default:
Kojto 6:6eaae34586b8 194 printf("Wrong selection. \r\n");
Kojto 6:6eaae34586b8 195 printf("Reset the board and try again. \r\n");
Kojto 6:6eaae34586b8 196 break;
Kojto 6:6eaae34586b8 197 }
Kojto 6:6eaae34586b8 198
Kojto 6:6eaae34586b8 199 printf("DHCP request \r\n");
Kojto 6:6eaae34586b8 200 while (wifi.is_dhcp_configured() == false) {
Kojto 6:6eaae34586b8 201 wait_ms(500);
Kojto 6:6eaae34586b8 202 printf(" Waiting for dhcp to be set. \r\n");
Kojto 6:6eaae34586b8 203 }
Kojto 6:6eaae34586b8 204
Kojto 6:6eaae34586b8 205 tNetappIpconfigRetArgs ipinfo2;
Kojto 6:6eaae34586b8 206 wifi.get_ip_config(&ipinfo2); // data is returned in the ipinfo2 structure
Kojto 6:6eaae34586b8 207 printf("DHCP assigned IP Address = %d.%d.%d.%d \r\n", ipinfo2.aucIP[3], ipinfo2.aucIP[2], ipinfo2.aucIP[1], ipinfo2.aucIP[0]);
Kojto 6:6eaae34586b8 208
Kojto 6:6eaae34586b8 209 char python_msg[] = "Hello Python\n";
Kojto 6:6eaae34586b8 210 TCPSocketServer server;
Kojto 6:6eaae34586b8 211 TCPSocketConnection client;
Kojto 6:6eaae34586b8 212
Kojto 6:6eaae34586b8 213 server.bind(15000);
Kojto 6:6eaae34586b8 214 server.listen();
Kojto 6:6eaae34586b8 215
Kojto 6:6eaae34586b8 216 while (1) {
Kojto 6:6eaae34586b8 217 int32_t status = server.accept(client);
Kojto 6:6eaae34586b8 218 if (status >= 0) {
Kojto 6:6eaae34586b8 219 client.set_blocking(false, 1500); // Timeout after (1.5)s
Kojto 6:6eaae34586b8 220 printf("Connection from: %s \r\n", client.get_address());
Kojto 6:6eaae34586b8 221 char buffer[256];
Kojto 6:6eaae34586b8 222 int stat = client.receive(buffer, sizeof(buffer));
Kojto 6:6eaae34586b8 223 if (stat >=0) {
Kojto 6:6eaae34586b8 224 printf("Received: %s \r\n",buffer);
Kojto 6:6eaae34586b8 225 printf("Sending the message to the server. \r\n");
Kojto 6:6eaae34586b8 226 client.send_all(python_msg, sizeof(python_msg));
Kojto 6:6eaae34586b8 227 client.close();
Kojto 6:6eaae34586b8 228 }
Kojto 6:6eaae34586b8 229 }
Kojto 6:6eaae34586b8 230 }
Kojto 6:6eaae34586b8 231 }