Skip to content

Peek() Function #3

@bitsetter

Description

@bitsetter

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions