|
/*************************************************** |
|
This is an example for the Adafruit CC3000 Wifi Breakout & Shield |
|
|
|
Designed specifically to work with the Adafruit WiFi products: |
|
----> https://www.adafruit.com/products/1469 |
|
|
|
Adafruit invests time and resources providing this open source code, |
|
please support Adafruit and open-source hardware by purchasing |
|
products from Adafruit! |
|
|
|
Written by Limor Fried & Kevin Townsend for Adafruit Industries. |
|
BSD license, all text above must be included in any redistribution |
|
****************************************************/ |
|
|
|
/* |
|
This example does a test of the TCP client capability: |
|
* Initialization |
|
* Optional: SSID scan |
|
* AP connection |
|
* DHCP printout |
|
* DNS lookup |
|
* Optional: Ping |
|
* Connect to website and print out webpage contents |
|
* Disconnect |
|
SmartConfig is still beta and kind of works but is not fully vetted! |
|
It might not work on all networks! |
|
*/ |
|
#include <Adafruit_CC3000.h> |
|
#include <ccspi.h> |
|
#include <SPI.h> |
|
#include <string.h> |
|
#include "utility/debug.h" |
|
|
|
// These are the interrupt and control pins |
|
#define ADAFRUIT_CC3000_IRQ 3 // MUST be an interrupt pin! |
|
// These can be any two pins |
|
#define ADAFRUIT_CC3000_VBAT 5 |
|
#define ADAFRUIT_CC3000_CS 10 |
|
// Use hardware SPI for the remaining pins |
|
// On an UNO, SCK = 13, MISO = 12, and MOSI = 11 |
|
Adafruit_CC3000 cc3000 = Adafruit_CC3000(ADAFRUIT_CC3000_CS, ADAFRUIT_CC3000_IRQ, ADAFRUIT_CC3000_VBAT, |
|
SPI_CLOCK_DIVIDER); // you can change this clock speed |
|
|
|
#define WLAN_SSID "myNetwork" // cannot be longer than 32 characters! |
|
#define WLAN_PASS "myPassword" |
|
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2 |
|
#define WLAN_SECURITY WLAN_SEC_WPA2 |
|
|
|
#define IDLE_TIMEOUT_MS 3000 // Amount of time to wait (in milliseconds) with no data |
|
// received before closing the connection. If you know the server |
|
// you're accessing is quick to respond, you can reduce this value. |
|
|
|
// What page to grab! |
|
#define WEBSITE "192.168.1.100" |
|
#define WEBPAGE "/" |
|
|
|
|
|
/**************************************************************************/ |
|
/*! |
|
@brief Sets up the HW and the CC3000 module (called automatically |
|
on startup) |
|
*/ |
|
/**************************************************************************/ |
|
|
|
uint32_t ip; |
|
|
|
void setup(void) |
|
{ |
|
Serial.begin(115200); |
|
Serial.println(F("Hello, CC3000!\n")); |
|
|
|
Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC); |
|
|
|
/* Initialise the module */ |
|
Serial.println(F("\nInitializing...")); |
|
if (!cc3000.begin()) |
|
{ |
|
Serial.println(F("Couldn't begin()! Check your wiring?")); |
|
while(1); |
|
} |
|
|
|
// Optional SSID scan |
|
// listSSIDResults(); |
|
|
|
Serial.print(F("\nAttempting to connect to ")); Serial.println(WLAN_SSID); |
|
if (!cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY)) { |
|
Serial.println(F("Failed!")); |
|
while(1); |
|
} |
|
|
|
Serial.println(F("Connected!")); |
|
|
|
/* Wait for DHCP to complete */ |
|
Serial.println(F("Request DHCP")); |
|
while (!cc3000.checkDHCP()) |
|
{ |
|
delay(100); // ToDo: Insert a DHCP timeout! |
|
} |
|
|
|
/* Display the IP address DNS, Gateway, etc. */ |
|
while (! displayConnectionDetails()) { |
|
delay(1000); |
|
} |
|
|
|
ip = 0; |
|
// Try looking up the website's IP address |
|
Serial.print(WEBSITE); Serial.print(F(" -> ")); |
|
while (ip == 0) { |
|
if (! cc3000.getHostByName(WEBSITE, &ip)) { |
|
Serial.println(F("Couldn't resolve!")); |
|
} |
|
delay(500); |
|
} |
|
|
|
cc3000.printIPdotsRev(ip); |
|
Serial.println(); |
|
|
|
// Optional: Do a ping test on the website |
|
/* |
|
Serial.print(F("\n\rPinging ")); cc3000.printIPdotsRev(ip); Serial.print("..."); |
|
replies = cc3000.ping(ip, 5); |
|
Serial.print(replies); Serial.println(F(" replies")); |
|
*/ |
|
|
|
for (int attempt = 1; attempt <= 4; attempt++) { |
|
Serial.print(F("Attempt #")); Serial.println(attempt); |
|
|
|
/* Try connecting to the website. |
|
Note: HTTP/1.1 protocol is used to keep the server from closing the connection before all data is read. |
|
*/ |
|
Adafruit_CC3000_Client www = cc3000.connectTCP(ip, 8080); |
|
if (www.connected()) { |
|
www.fastrprint(F("GET ")); |
|
www.fastrprint(WEBPAGE); |
|
www.fastrprint(F(" HTTP/1.1\r\n")); |
|
www.fastrprint(F("Host: ")); www.fastrprint(WEBSITE); www.fastrprint(F("\r\n")); |
|
www.fastrprint(F("\r\n")); |
|
www.println(); |
|
} else { |
|
Serial.println(F("Connection failed")); |
|
return; |
|
} |
|
|
|
Serial.println(F("-------------------------------------")); |
|
|
|
/* Read data until either the connection is closed, or the idle timeout is reached. */ |
|
unsigned long lastRead = millis(); |
|
boolean done = false; |
|
while (!done && www.connected() && (millis() - lastRead < IDLE_TIMEOUT_MS)) { |
|
while (www.available()) { |
|
char c = www.read(); |
|
Serial.print(c); |
|
lastRead = millis(); |
|
if (c == '!') { |
|
done = true; |
|
break; |
|
} |
|
} |
|
} |
|
www.close(); |
|
Serial.println(F("-------------------------------------")); |
|
|
|
} |
|
|
|
/* You need to make sure to clean up after yourself or the CC3000 can freak out */ |
|
/* the next time your try to connect ... */ |
|
Serial.println(F("\n\nDisconnecting")); |
|
cc3000.disconnect(); |
|
|
|
} |
|
|
|
void loop(void) |
|
{ |
|
delay(1000); |
|
} |
|
|
|
/**************************************************************************/ |
|
/*! |
|
@brief Begins an SSID scan and prints out all the visible networks |
|
*/ |
|
/**************************************************************************/ |
|
|
|
void listSSIDResults(void) |
|
{ |
|
uint8_t valid, rssi, sec, index; |
|
char ssidname[33]; |
|
|
|
index = cc3000.startSSIDscan(); |
|
|
|
Serial.print(F("Networks found: ")); Serial.println(index); |
|
Serial.println(F("================================================")); |
|
|
|
while (index) { |
|
index--; |
|
|
|
valid = cc3000.getNextSSID(&rssi, &sec, ssidname); |
|
|
|
Serial.print(F("SSID Name : ")); Serial.print(ssidname); |
|
Serial.println(); |
|
Serial.print(F("RSSI : ")); |
|
Serial.println(rssi); |
|
Serial.print(F("Security Mode: ")); |
|
Serial.println(sec); |
|
Serial.println(); |
|
} |
|
Serial.println(F("================================================")); |
|
|
|
cc3000.stopSSIDscan(); |
|
} |
|
|
|
/**************************************************************************/ |
|
/*! |
|
@brief Tries to read the IP address and other connection details |
|
*/ |
|
/**************************************************************************/ |
|
bool displayConnectionDetails(void) |
|
{ |
|
uint32_t ipAddress, netmask, gateway, dhcpserv, dnsserv; |
|
|
|
if(!cc3000.getIPAddress(&ipAddress, &netmask, &gateway, &dhcpserv, &dnsserv)) |
|
{ |
|
Serial.println(F("Unable to retrieve the IP Address!\r\n")); |
|
return false; |
|
} |
|
else |
|
{ |
|
Serial.print(F("\nIP Addr: ")); cc3000.printIPdotsRev(ipAddress); |
|
Serial.print(F("\nNetmask: ")); cc3000.printIPdotsRev(netmask); |
|
Serial.print(F("\nGateway: ")); cc3000.printIPdotsRev(gateway); |
|
Serial.print(F("\nDHCPsrv: ")); cc3000.printIPdotsRev(dhcpserv); |
|
Serial.print(F("\nDNSserv: ")); cc3000.printIPdotsRev(dnsserv); |
|
Serial.println(); |
|
return true; |
|
} |
|
} |