I'm not happy at all...
I wanted to make the ethernet arduino work as a web server, data logger, and more.
But unfortunately it can't search some strings... ![]()
If you get your SRAM use under control with the F() function, you should be able to add those strstr() commands without causing a fail. It is the little bit of extra SRAM they use that is causing the SRAM overflow and the crash.
You are right! It was a memory problem. I managed to get some bytes free and now I am good to go...Thats a same that arduino still uses atmega328p. I love it but we need more memory for our projects...!!!
May I suggest a Mega2560/Ethernet shield? ![]()
It took a bunch of big arrays to run it out of SRAM.
Does it work well enough with the SD card simulationly with the ethernet ?
I have read that ethernet arduino stucks sometimes and needs a reset when changing from ethernet to SD... Is this true?
And you use a regular arduino shield or another especially for your MEGA board?
I use the w5100 and SD card together a lot. That is how I get my files into my SD card. I use a FTP program to transfer them to and from a FTP server. That program may be a bit too memory heavy to use on an Uno or Arduino Ethernet tho. That is why I have a Mega.
http://playground.arduino.cc/Code/FTP
That sketch uses two sockets on the w5100 (one command and one data) and the SD together. Smooth!! ![]()
Is there a way to use this example with TCP packets?
Because I want to login a user of a specific IP.
I dont think UDP packets can be sent through html... I didn;t find anything on google..
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0x00, 0x00, 0xAA, 0xBB, 0xCC, 0xDD };
IPAddress ip(192, 168, 10, 110);
unsigned int localPort = 8870; // local port to listen on
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetUDP Udp;
void setup() {
// start the Ethernet and UDP:
Ethernet.begin(mac,ip);
Udp.begin(localPort);
}
void loop() {
int packetSize = Udp.parsePacket();
Serial.print("1 ");
if(packetSize)
{
Serial.print("Received packet of size ");
Serial.println(packetSize);
Serial.print("From IP : ");
IPAddress remote = Udp.remoteIP();
//print out the remote connection's IP address
Serial.print(remote);
Serial.print(" on port : ");
//print out the remote connection's port
Serial.println(Udp.remotePort());
}
}
How can I copy the "clientIP" value to another array? because I need to compare them afterwards..
I managed to receive the remote IP address but I don't know how to save it.
I declared "char loggedip[];"
and then I try to copy it like that... loggedip[0]=clientIP; but I get other values.
I read that IPAddress value is a unit32_t byte and when I try to strcpy it says I cannot convert it to char.
Can anyone help?
Here is how to use it.
IPAddress clientIP = Ethernet.localIP();
Serial.println(clientIP);
Serial.print(clientIP[0]);
Serial.print(".");
Serial.print(clientIP[1]);
Serial.print(".");
Serial.print(clientIP[2]);
Serial.print(".");
Serial.println(clientIP[3]);
What I do: Serial.println(clientIP);
All I need is to store the IP to an array and then compare it again with the "clientIP" value
I dont care about the format as I can see it using serial.print
Something like that: "loggedip[]= clientIP[];"
How can I copy the "clientIP" value to another array? because I need to compare them afterwards..
I managed to receive the remote IP address but I don't know how to save it.
Start with showing this code.
If you get the IP address as a string, that is not the same type as an IPAddress.
If you have the IP address as 4 bytes, you can simply declare two IPAddress variables, using the same 4 bytes.
If you want to copy the 4 byte array, use a for loop, and copy each element of the array.
Thinking on going to something like this board!
But unfortunately it doesn't support 5V.. ![]()
http://grobotronics.com/arduino-due-el.html#.UMSDu4N9Dh4
As for the IP serial print code here it is below...
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0x00, 0x00, 0xAA, 0xBB, 0xCC, 0xDD };
IPAddress ip(192, 168, 10, 110);
// local port to listen on
// An EthernetUDP instance to let us send and receive packets over UDP
EthernetServer server(8070);
void setup() {
Serial.begin(9600);
// start the Ethernet and UDP:
Ethernet.begin(mac,ip);
server.begin();
}
void loop() {
EthernetClient client = server.available();
Serial.println("Waiting for client... ");
if(client) {
Serial.println("Client request!!!! ");
while (client.connected()) {
while(client.available()) {
char c = client.read();
if (c == '\n' ) {
client.stop();
}
Serial.print("Received packet ... ");
Serial.print("From IP : ");
IPAddress clientIP = client.remoteIP();
//print out the remote connection's IP address
Serial.println(clientIP);
}
}
}
}
I've made some changes to the Ethernet.cpp/.h & EthernetClient.cpp/.h files so the " IPAddress clientIP = client.remoteIP();" works.. The changes where made according to SurferTim's link I found from arduino forum.
This is how. Change testIP to another ip. It will not match.
#include <SPI.h>
#include <Ethernet.h>
IPAddress clientIP(192,168,2,2);
IPAddress testIP(192,168,2,2);
void setup() {
Serial.begin(9600);
if(clientIP == testIP) Serial.println("match");
else Serial.println("no match");
if(clientIP[0] == testIP[0] && clientIP[1] == testIP[1] && clientIP[2] == testIP[2]) {
Serial.println("Same subnet");
}
else Serial.println("different subnets");
}
void loop() {
}
Here is a firewall-type code using the array of IPAddress types. See reply #1.
http://arduino.cc/forum/index.php/topic,135082.0.html
edit: Here is the way I have this planned. One ip changes, the subnet views, and all others are rejected.
if(clientIP == testIP) {
Serial.println("match");
// get input from the GET, process, and send page with form inputs here
}
else if(clientIP[0] == testIP[0] && clientIP[1] == testIP[1] && clientIP[2] == testIP[2]) {
Serial.println("Same subnet");
// do not get input. send page with data, but no form
}
else {
Serial.println("different subnets");
// send 401 Unauthorized page
}
I just bought my Arduino Mega 2560 today and an ethrnet shield. But unfortunately when I tried to compile the same sketch on the mega says:
c:/program files/arduino-1.0.2/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr6/crtm2560.o: In function `__vector_default':
(.vectors+0x8): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_2' defined in .text section in c:/program files/arduino-1.0.2/hardware/tools/avr/bin/../lib/gcc/avr/4.3.2/../../../../avr/lib/avr6/crtm2560.o
What same sketch? Didn't I compile that for you to check memory? It did ok here. All my tests are on a Mega2560/ethernet shield with a uSD card and IDE v1.0.2. However, I use Ubuntu 11.10 and 12.04, not Windows.