Open bitsetter opened 10 years ago
Hi BitSetter,
I haven’t been working on this library for a while; Adafruit released their port of the Arduino CC3000 library (https://github.com/adafruit/Adafruit_CC3000_Library) and it’s a better version than mine. I think this is the library you’re using?
They don’t have a peek() function directly, but Adafruit’s library is a port of the Texas Instruments code (like mine is) and TI’s code has the ability to make recv() be non-blocking so it will return immediately if there’s no data. Maybe that’s something you can use?
Regards,
Chris
From: bitsetter [mailto:notifications@github.com] Sent: Tuesday, December 10, 2013 1:52 PM To: cmagagna/ArduinoCC3000 Subject: [ArduinoCC3000] Peek() Function (#3)
Hi Chris, Awesome work! Really appreciate what you have done! Is there a way to add a peek() function into the client code? This seems to be necessary to make the email code I have found work. The email sketch is shown below if you are curious. See eRecv() Thanks again,
BitSetter. ------------------------------------ Email Sketch -----------------------------------
/*
// These are the interrupt and control pins
// These can be any two pins
// 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_DIV2); // you can change this clock speed but DI
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
const unsigned long dhcpTimeout = 60L * 1000L, // Max time to wait for address from DHCP connectTimeout = 15L * 1000L, // Max time to wait for server connection responseTimeout = 15L * 1000L; // Max time to wait for data from server
const int relay_pin = 8; // Relay pin
char relayBuffer[1]; // Relay buffer
Adafruit_CC3000_Client client;
uint32_t t;
void setup() {
Serial.begin(115200); Serial.println(F("Hello, CC3000!\n"));
displayDriverMode(); Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
/* Initialise the module */ Serial.println(F("\nInitialising the CC3000 ...")); if (!cc3000.begin()) { Serial.println(F("Unable to initialise the CC3000! Check your wiring?")); while(1); }
/* Optional: Update the Mac Address to a known value */
uint8_t macAddress[6] = { 0x08, 0x00, 0x28, 0x01, 0x79, 0xB7 }; if (!cc3000.setMacAddress(macAddress)) { Serial.println(F("Failed trying to update the MAC address")); while(1); }
uint16_t firmware = checkFirmwareVersion(); if ((firmware != 0x113) && (firmware != 0x118)) { Serial.println(F("Wrong firmware version!")); for(;;); }
displayMACAddress();
/* Optional: Get the SSID list (not available in 'tiny' mode) */
listSSIDResults();
/* Delete any old connection data on the module */ Serial.println(F("\nDeleting old connection profiles")); if (!cc3000.deleteProfiles()) { Serial.println(F("Failed!")); while(1); }
/* Attempt to connect to an access point / char ssid = WLAN_SSID; / Max 32 chars / Serial.print(F("\nAttempting to connect to ")); Serial.println(ssid);
/* NOTE: Secure connections are not available in 'Tiny' mode! */ 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); }
}
void loop() { byte inChar;
inChar = Serial.read();
if(inChar == 'e') { if(sendEmail()) Serial.println(F("Email sent")); else Serial.println(F("Email failed")); } }
byte sendEmail() { byte thisByte = 0; byte respCode; unsigned long ip, startTime, t = 0L; // client = cc3000.connectTCP(server, 25); // if(client.connected()) { // Serial.println(F("connected")); // } else { // Serial.println(F("connection failed")); // return 0; // }
if(cc3000.getHostByName("smtp.frontier.net", &ip)) {
Serial.println(F("\r\nAttempting connection...")); startTime = millis(); do { client = cc3000.connectTCP(ip, 123); } while((!client.connected()) && ((millis() - startTime) < connectTimeout));
}else{ return 0; }
if(!eRcv()) return 0; Serial.println(F("Sending helo"));
// change to your public ip client.println(F("helo 1.2.3.4"));
if(!eRcv()) return 0; Serial.println(F("Sending From"));
// change to your email address (sender) client.println(F("MAIL From: bitsetter@gmail.com mailto:bitsetter@gmail.com "));
if(!eRcv()) return 0;
// change to recipient address Serial.println(F("Sending To")); client.println(F("RCPT To: paul.nichol@maximintegrated.com mailto:paul.nichol@maximintegrated.com "));
if(!eRcv()) return 0;
Serial.println(F("Sending DATA")); client.println(F("DATA"));
if(!eRcv()) return 0;
Serial.println(F("Sending email"));
// change to recipient address client.println(F("To: You paul.nichol@maximintegrated.com mailto:paul.nichol@maximintegrated.com "));
// change to your address client.println(F("From: Me bitsetter@gmail.com mailto:bitsetter@gmail.com "));
client.println(F("Subject: Arduino email test\r\n"));
client.println(F("This is from my Arduino!"));
client.println(F("."));
if(!eRcv()) return 0;
Serial.println(F("Sending QUIT")); client.println(F("QUIT"));
if(!eRcv()) return 0;
client.close();
Serial.println(F("disconnected"));
return 1; }
byte eRcv() { byte respCode; byte thisByte; int loopCount = 0;
//wait until data arrives while(!client.available()) { delay(1); loopCount++;
// if nothing received for 10 seconds, timeout if(loopCount > 10000) { client.close(); Serial.println(F("\r\nTimeout")); return 0; }
}
respCode = client.peek();
//read until buffer empty: while(client.available()) {
thisByte = client.read();
Serial.write(thisByte); }
if(respCode >= '4') { efail(); return 0;
}
return 1; }
void efail() { byte thisByte = 0; int loopCount = 0;
client.println(F("QUIT"));
while(!client.available()) { delay(1); loopCount++;
// if nothing received for 10 seconds, timeout if(loopCount > 10000) { client.stop(); Serial.println(F("\r\nTimeout")); return; }
}
while(client.available()) {
thisByte = client.read();
Serial.write(thisByte); }
client.stop();
Serial.println(F("disconnected")); }
/*****/ /! @brief https://github.com/brief Displays the driver mode (tiny of normal), and the buffer size if tiny mode is not being used
@note The buffer size and driver mode are defined in cc3000_common.h
/ /*****/ void displayDriverMode(void) {
Serial.println(F("CC3000 is configure in 'Tiny' mode"));
Serial.print(F("RX Buffer : ")); Serial.print(CC3000_RX_BUFFER_SIZE); Serial.println(F(" bytes")); Serial.print(F("TX Buffer : ")); Serial.print(CC3000_TX_BUFFER_SIZE); Serial.println(F(" bytes"));
}
/***_/ /! @brief https://github.com/brief Tries to read the CC3000's internal firmware patch ID */ /_**/ uint16_t checkFirmwareVersion(void) { uint8_t major, minor; uint16_t version;
if(!cc3000.getFirmwareVersion(&major, &minor)) { Serial.println(F("Unable to retrieve the firmware version!\r\n")); version = 0; } else { Serial.print(F("Firmware V. : ")); Serial.print(major); Serial.print(F(".")); Serial.println(minor); version = major; version <<= 8; version |= minor; }
return version; }
/***_/ /! @brief https://github.com/brief Tries to read the 6-byte MAC address of the CC3000 module */ /_**/ void displayMACAddress(void) { uint8_t macAddress[6];
if(!cc3000.getMacAddress(macAddress)) { Serial.println(F("Unable to retrieve MAC Address!\r\n")); } else { Serial.print(F("MAC Address : ")); cc3000.printHex((byte*)&macAddress, 6); } }
/***_/ /! @brief https://github.com/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; } }
/***_/ /! @brief https://github.com/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(); }
— Reply to this email directly or view it on GitHub https://github.com/cmagagna/ArduinoCC3000/issues/3 .
Hi Chris, Awesome work! Really appreciate what you have done! Is there a way to add a peek() function into the client code? This seems to be necessary to make the email code I have found work. The email sketch is shown below if you are curious. See eRecv() Thanks again,
BitSetter. ------------------------------------ Email Sketch -----------------------------------
/*
include
include
include
include
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_DIV2); // you can change this clock speed but DI
define WLAN_SSID "" // cannot be longer than 32 characters!
define WLAN_PASS ""
// Security can be WLAN_SEC_UNSEC, WLAN_SEC_WEP, WLAN_SEC_WPA or WLAN_SEC_WPA2
define WLAN_SECURITY WLAN_SEC_WPA2
const unsigned long dhcpTimeout = 60L * 1000L, // Max time to wait for address from DHCP connectTimeout = 15L * 1000L, // Max time to wait for server connection responseTimeout = 15L * 1000L; // Max time to wait for data from server
const int relay_pin = 8; // Relay pin
char relayBuffer[1]; // Relay buffer
Adafruit_CC3000_Client client;
uint32_t t;
void setup() {
Serial.begin(115200); Serial.println(F("Hello, CC3000!\n"));
displayDriverMode(); Serial.print("Free RAM: "); Serial.println(getFreeRam(), DEC);
/* Initialise the module */ Serial.println(F("\nInitialising the CC3000 ...")); if (!cc3000.begin()) { Serial.println(F("Unable to initialise the CC3000! Check your wiring?")); while(1); }
/* Optional: Update the Mac Address to a known value */
uint8_t macAddress[6] = { 0x08, 0x00, 0x28, 0x01, 0x79, 0xB7 }; if (!cc3000.setMacAddress(macAddress)) { Serial.println(F("Failed trying to update the MAC address")); while(1); }
uint16_t firmware = checkFirmwareVersion(); if ((firmware != 0x113) && (firmware != 0x118)) { Serial.println(F("Wrong firmware version!")); for(;;); }
displayMACAddress();
/* Optional: Get the SSID list (not available in 'tiny' mode) */
ifndef CC3000_TINY_DRIVER
listSSIDResults();
endif
/* Delete any old connection data on the module */ Serial.println(F("\nDeleting old connection profiles")); if (!cc3000.deleteProfiles()) { Serial.println(F("Failed!")); while(1); }
/* Attempt to connect to an access point _/ char ssid = WLANSSID; / Max 32 chars / Serial.print(F("\nAttempting to connect to ")); Serial.println(ssid);
/* NOTE: Secure connections are not available in 'Tiny' mode! */ 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); }
}
void loop() { byte inChar;
inChar = Serial.read();
if(inChar == 'e') { if(sendEmail()) Serial.println(F("Email sent")); else Serial.println(F("Email failed")); } }
byte sendEmail() { byte thisByte = 0; byte respCode; unsigned long ip, startTime, t = 0L; // client = cc3000.connectTCP(server, 25); // if(client.connected()) { // Serial.println(F("connected")); // } else { // Serial.println(F("connection failed")); // return 0; // }
if(cc3000.getHostByName("smtp.frontier.net", &ip)) {
}else{ return 0; }
if(!eRcv()) return 0; Serial.println(F("Sending helo"));
// change to your public ip client.println(F("helo 1.2.3.4"));
if(!eRcv()) return 0; Serial.println(F("Sending From"));
// change to your email address (sender) client.println(F("MAIL From: bitsetter@gmail.com"));
if(!eRcv()) return 0;
// change to recipient address Serial.println(F("Sending To")); client.println(F("RCPT To: paul.nichol@maximintegrated.com"));
if(!eRcv()) return 0;
Serial.println(F("Sending DATA")); client.println(F("DATA"));
if(!eRcv()) return 0;
Serial.println(F("Sending email"));
// change to recipient address client.println(F("To: You paul.nichol@maximintegrated.com"));
// change to your address client.println(F("From: Me bitsetter@gmail.com"));
client.println(F("Subject: Arduino email test\r\n"));
client.println(F("This is from my Arduino!"));
client.println(F("."));
if(!eRcv()) return 0;
Serial.println(F("Sending QUIT")); client.println(F("QUIT"));
if(!eRcv()) return 0;
client.close();
Serial.println(F("disconnected"));
return 1; }
byte eRcv() { byte respCode; byte thisByte; int loopCount = 0;
//wait until data arrives while(!client.available()) { delay(1); loopCount++;
}
respCode = client.peek();
//read until buffer empty: while(client.available()) {
thisByte = client.read();
Serial.write(thisByte); }
if(respCode >= '4') { efail(); return 0;
}
return 1; }
void efail() { byte thisByte = 0; int loopCount = 0;
client.println(F("QUIT"));
while(!client.available()) { delay(1); loopCount++;
}
while(client.available()) {
thisByte = client.read();
Serial.write(thisByte); }
client.stop();
Serial.println(F("disconnected")); }
/*****/ /! @brief Displays the driver mode (tiny of normal), and the buffer size if tiny mode is not being used
/ /*****/ void displayDriverMode(void) {
ifdef CC3000_TINY_DRIVER
else
endif
}
// /! @brief Tries to read the CC3000's internal firmware patch ID / /**/ uint16_t checkFirmwareVersion(void) { uint8_t major, minor; uint16_t version;
ifndef CC3000_TINY_DRIVER
if(!cc3000.getFirmwareVersion(&major, &minor)) { Serial.println(F("Unable to retrieve the firmware version!\r\n")); version = 0; } else { Serial.print(F("Firmware V. : ")); Serial.print(major); Serial.print(F(".")); Serial.println(minor); version = major; version <<= 8; version |= minor; }
endif
return version; }
// /! @brief Tries to read the 6-byte MAC address of the CC3000 module / /**/ void displayMACAddress(void) { uint8_t macAddress[6];
if(!cc3000.getMacAddress(macAddress)) { Serial.println(F("Unable to retrieve MAC Address!\r\n")); } else { Serial.print(F("MAC Address : ")); cc3000.printHex((byte*)&macAddress, 6); } }
// /! @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; } }
// /! @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--;
} Serial.println(F("================================================"));
cc3000.stopSSIDscan(); }