potatotron
Well-known member
Just curious... will the CC3000 be compatible with IPv5?
whoops I mean IPv6?
Unfortunately no.
http://e2e.ti.com/support/low_power_rf/f/851/t/160075.aspx
Just curious... will the CC3000 be compatible with IPv5?
whoops I mean IPv6?
I'm now confident that the board, firmware, library, and Teensy 3 are all playing nice now so I can finally start working on a web server. More details soon....
Hey Guys,
i can't get the serial monitor to work with a teensy 3, i downloaded the last version of the lib, or tried to change some lines as mentioned on a previous page but nothing ...
its working perfectly with an UNO board .
@jimmayhugh would you mind sharing your UDPapp example ?
thank you!
class Adafruit_CC3000_Server : public Print {
public:
Adafruit_CC3000_Server(uint16_t s);
Adafruit_CC3000_Server(void);
bool connected(void);
size_t write(uint8_t c);
size_t fastrprint(const char *str);
size_t fastrprintln(const char *str);
size_t fastrprint(const __FlashStringHelper *ifsh);
size_t fastrprintln(const __FlashStringHelper *ifsh);
int16_t write(const void *buf, uint16_t len, uint32_t flags = 0);
int16_t read(void *buf, uint16_t len, uint32_t flags = 0);
uint8_t read(void);
int32_t close(void);
uint8_t available(void);
uint8_t _rx_buf[RXBUFFERSIZE], _rx_buf_idx;
char _tx_buf[TXBUFFERSIZE];
int16_t bufsiz;
private:
int16_t _socket;
};
Adafruit_CC3000_Server Adafruit_CC3000::connectAndBindUDP(uint32_t destIP, uint16_t destPort)
{
sockaddr socketAddress;
uint32_t udp_socket;
// Create the socket(s)
// socket = SOCK_STREAM, SOCK_DGRAM, or SOCK_RAW
// protocol = IPPROTO_TCP, IPPROTO_UDP or IPPROTO_RAW
//if (CC3KPrinter != 0) CC3KPrinter->print(F("Creating socket... "));
udp_socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (-1 == udp_socket)
{
CC3KPrinter->println(F("Failed to open socket"));
return Adafruit_CC3000_Server();
}
//if (CC3KPrinter != 0) { CC3KPrinter->print(F("DONE (socket ")); CC3KPrinter->print(udp_socket); CC3KPrinter->println(F(")")); }
// Try to open the socket
memset(&socketAddress, 0x00, sizeof(socketAddress));
socketAddress.sa_family = AF_INET;
socketAddress.sa_data[0] = (destPort & 0xFF00) >> 8; // Set the Port Number
socketAddress.sa_data[1] = (destPort & 0x00FF);
socketAddress.sa_data[2] = destIP >> 24;
socketAddress.sa_data[3] = destIP >> 16;
socketAddress.sa_data[4] = destIP >> 8;
socketAddress.sa_data[5] = destIP;
if (CC3KPrinter != 0) {
CC3KPrinter->print(F("Connect to "));
printIPdotsRev(destIP);
CC3KPrinter->print(':');
CC3KPrinter->print(destPort);
CC3KPrinter->print(F(", Socket: "));
CC3KPrinter->println(udp_socket);
}
//printHex((byte *)&socketAddress, sizeof(socketAddress));
if (-1 == bind(udp_socket, &socketAddress, sizeof(socketAddress)))
{
if (CC3KPrinter != 0) CC3KPrinter->println(F("Connection error"));
closesocket(udp_socket);
return Adafruit_CC3000_Server();
}
return Adafruit_CC3000_Server(udp_socket);
}
/**********************************************************************/
Adafruit_CC3000_Server::Adafruit_CC3000_Server(void) {
_socket = -1;
}
Adafruit_CC3000_Server::Adafruit_CC3000_Server(uint16_t s) {
_socket = s;
bufsiz = 0;
_rx_buf_idx = 0;
}
bool Adafruit_CC3000_Server::connected(void) {
if (_socket < 0) {
// if (CC3KPrinter != 0) CC3KPrinter->println("connected() - _socket < 0");
return false;
}
if (! available() && closed_sockets[_socket] == true) {
// if (CC3KPrinter != 0) CC3KPrinter->println("No more data, and closed!");
closesocket(_socket);
closed_sockets[_socket] = false;
_socket = -1;
return false;
}
else return true;
}
int16_t Adafruit_CC3000_Server::write(const void *buf, uint16_t len, uint32_t flags)
{
return send(_socket, buf, len, flags);
}
size_t Adafruit_CC3000_Server::write(uint8_t c)
{
int32_t r;
r = send(_socket, &c, 1, 0);
if ( r < 0 ) return 0;
return r;
}
size_t Adafruit_CC3000_Server::fastrprint(const __FlashStringHelper *ifsh)
{
uint8_t idx = 0;
const char PROGMEM *p = (const char PROGMEM *)ifsh;
size_t n = 0;
while (1) {
unsigned char c = pgm_read_byte(p++);
if (c == 0) break;
_tx_buf[idx] = c;
idx++;
if (idx >= TXBUFFERSIZE) {
// lets send it!
n += send(_socket, _tx_buf, TXBUFFERSIZE, 0);
idx = 0;
}
}
// reached the end before filling the buffer completely
n += send(_socket, _tx_buf, idx, 0);
return n;
}
size_t Adafruit_CC3000_Server::fastrprintln(const __FlashStringHelper *ifsh)
{
size_t r = 0;
r = fastrprint(ifsh);
r+= fastrprint("\n\r");
return r;
}
size_t Adafruit_CC3000_Server::fastrprintln(const char *str)
{
size_t r = 0;
if ((r = write(str, strlen(str), 0)) <= 0) return 0;
if ((r += write("\n\r", 2, 0)) <= 0) return 0; // meme fix
return r;
}
size_t Adafruit_CC3000_Server::fastrprint(const char *str)
{
return write(str, strlen(str), 0);
}
int16_t Adafruit_CC3000_Server::read(void *buf, uint16_t len, uint32_t flags)
{
return recv(_socket, buf, len, flags);
}
int32_t Adafruit_CC3000_Server::close(void) {
int32_t x = closesocket(_socket);
_socket = -1;
return x;
}
uint8_t Adafruit_CC3000_Server::read(void)
{
while ((bufsiz <= 0) || (bufsiz == _rx_buf_idx)) {
cc3k_int_poll();
// buffer in some more data
bufsiz = recv(_socket, _rx_buf, sizeof(_rx_buf), 0);
if (bufsiz == -57) {
close();
return 0;
}
//if (CC3KPrinter != 0) { CC3KPrinter->println("Read "); CC3KPrinter->print(bufsiz); CC3KPrinter->println(" bytes"); }
_rx_buf_idx = 0;
}
uint8_t ret = _rx_buf[_rx_buf_idx];
_rx_buf_idx++;
//if (CC3KPrinter != 0) { CC3KPrinter->print("("); CC3KPrinter->write(ret); CC3KPrinter->print(")"); }
return ret;
}
uint8_t Adafruit_CC3000_Server::available(void) {
// not open!
if (_socket < 0) {
// if (CC3KPrinter != 0) CC3KPrinter->println("available() - _socket < 0");
return 0;
}
if ((bufsiz > 0) // we have some data in the internal buffer
&& (_rx_buf_idx < bufsiz)) { // we havent already spit it all out
// if (CC3KPrinter != 0) CC3KPrinter->println("available() - data in buffer");
return (bufsiz - _rx_buf_idx);
}
// do a select() call on this socket
timeval timeout;
fd_set fd_read;
memset(&fd_read, 0, sizeof(fd_read));
FD_SET(_socket, &fd_read);
timeout.tv_sec = 0;
timeout.tv_usec = 5000; // 5 millisec
int16_t s = select(_socket+1, &fd_read, NULL, NULL, &timeout);
//if (CC3KPrinter != 0) } CC3KPrinter->print(F("Select: ")); CC3KPrinter->println(s); }
if (s == 1) {
return 1; // some data is available to read
}else{
// if (CC3KPrinter != 0) CC3KPrinter->println("available() - no data is available");
return 0; // no data is available
}
}
Adafruit_CC3000_Server server;
// Local server IP, port, and repository (change with your settings !)
unsigned int localPort = 2652; // local port to listen on
setup()
{
if(setDebug & udpDebug)
{
Serial.println(F("Initializing CC3000 nic"));
}
// Initialise the CC3000 module
if (!cc3000.begin())
{
while(1);
}
// Per http://e2e.ti.com/support/low_power_rf/f/851/t/292664.aspx
// aucInactivity needs to be set to 0 (never timeout) or the socket will close after
// 60 seconds of no activity
unsigned long aucDHCP = 14400;
unsigned long aucARP = 3600;
unsigned long aucKeepalive = 30;
unsigned long aucInactivity = 0;
if(aucInactivity == 0)
{
Serial.println(F("Setting netapp to not timeout..."));
}else{
Serial.print(F("Setting netapp to timeout in "));
Serial.print(aucInactivity);
Serial.println(F(" Seconds"));
}
long iRet = netapp_timeout_values(&aucDHCP, &aucARP, &aucKeepalive, &aucInactivity);
if (iRet!=0)
{
Serial.print(F("Could not set netapp option, iRet = "));
Serial.println(iRet);
Serial.println(F(", aborting..."));
while(1);
}else{
Serial.print(F("set netapp option, iRet = "));
Serial.println(iRet);
}
displayMACAddress();
// Connect to WiFi network
cc3000.connectToAP(WLAN_SSID, WLAN_PASS, WLAN_SECURITY);
Serial.println("Connected to WiFi network!");
// Check DHCP
Serial.print(F("Requesting address from DHCP server..."));
for(t=millis(); !cc3000.checkDHCP() && ((millis() - t) < dhcpTimeout); delay(1000));
if(cc3000.checkDHCP()) {
Serial.println(F("OK"));
displayConnectionDetails();
} else {
Serial.println(F("failed"));
return;
}
timer = millis();
timer2 = millis();
for(int q = 0; q < UDP_TX_PACKET_MAX_SIZE; q++) // clear the buffer udp buffers
{
ReplyBuffer[q] = 0x00;
PacketBuffer[q] = 0x00;
}
unsigned long startTime;
Serial.println(F("Attempting connection..."));
startTime = millis();
do
{
server = cc3000.connectAndBindUDP(0x0, localPort);
} while((!server.connected()) &&
((millis() - startTime) < connectTimeout));
if(server.connected())
{
Serial.println(F("connected!"));
server.println("@");
}else{
Serial.println(F("NOT connected!"));
while(1);
}
}
loop()
{
while(server.available())
{
char c = server.read();
if(c != 0x00)
{
PacketBuffer[rpBufferCnt] = c;
if(PacketBuffer[rpBufferCnt] == '\n')
{
if(setDebug & udpDebug)
{
Serial.print(PacketBuffer);
}
break;
}else{
rpBufferCnt++;
}
}
}
if(PacketBuffer[0] != 0x00)
{
udpProcess();
}
}
Any particular reason that the is5100() and is5200() functions are private?
Actually what I'm looking at is the defined size of UDP_TX_PACKET_MAX_SIZE in EthernetUDP.h, which is set at 24 bytes. I'm aware of the restriction in the CC3K, and have a work-around for that.
size_t EthernetUDP::write(uint8_t byte)
{
return write(&byte, 1);
}
size_t EthernetUDP::write(const uint8_t *buffer, size_t size)
{
uint16_t bytes_written = bufferData(_sock, _offset, buffer, size);
_offset += bytes_written;
return bytes_written;
}