Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Peek() Function #3

Open
bitsetter opened this issue Dec 10, 2013 · 1 comment
Open

Peek() Function #3

bitsetter opened this issue Dec 10, 2013 · 1 comment

Comments

@bitsetter
Copy link

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 -----------------------------------

/*

  • Simple remote relay control with Arduino & the CC3000 chip
  • Part of the code is based on the work done by Adafruit on the CC3000 chip
  • Writtent by Marco Schwartz for Open Home Automation
    */

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_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 = 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"));

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++;

// 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 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)
{
#ifdef CC3000_TINY_DRIVER
Serial.println(F("CC3000 is configure in 'Tiny' mode"));
#else
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"));
#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--;

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();
}

@cmagagna
Copy link
Owner

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 -----------------------------------

/*

  • Simple remote relay control with Arduino & the CC3000 chip
  • Part of the code is based on the work done by Adafruit on the CC3000 chip
  • Writtent by Marco Schwartz for Open Home Automation */

#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 = 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)
{
#ifdef CC3000_TINY_DRIVER
Serial.println(F("CC3000 is configure in 'Tiny' mode"));
#else
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"));
#endif
}

/***/
/!
@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;

#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 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 #3 .

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants