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:
Thu Oct 03 21:26:22 2013 +0200
Revision:
5:12ea15b9c2f4
Parent:
4:b5875efcf0e5
Child:
6:6eaae34586b8
Initial version for new host driver

- not fully working

Who changed what in which revision?

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