cmagagna / ArduinoCC3000

Arduino library for the TI CC3000 WiFi module
65 stars 11 forks source link

Peek() Function #3

Open bitsetter opened 10 years ago

bitsetter commented 10 years ago

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

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

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

/*

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 https://github.com/cmagagna/ArduinoCC3000/issues/3 .