Go Down

Topic: Convert UDP packet script to TCP packet (Read 1 time) previous topic - next topic

Malibux



... when i send a tcp packet to the arduino i cant get it to do anything..


This is because you need to establish a tcp connection before sending any packet.
Look at the EthernetServer class, there are useful examples of how you can have the Arduino wait for a connection request, get the client data, send a reply, close the connection.


I have now tryed to get it to work but i cant get the functions from the UDP transferred to the TCP script.
so can anybody help me with that?
The function should be like this:
When i send a certain packet/data( ex. on) the LED shall switch on and when i send another packet the LED shall turn off?

thank you in advance

zoomkat

simple tcp/ip based web server control code.

Code: [Select]
//zoomkat 4-1-12
//simple button GET for servo and pin 5
//for use with IDE 1.0
//open serial monitor to see what the arduino receives
//use the \ slash to escape the " in the html, or use ' instead of "
//address will look like http://192.168.1.102:84 when submited
//for use with W5100 based ethernet shields

#include <SPI.h>
#include <Ethernet.h>
#include <Servo.h>
Servo myservo;  // create servo object to control a servo

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //physical mac address
byte ip[] = { 192, 168, 1, 102 }; // ip in lan
byte gateway[] = { 192, 168, 1, 1 }; // internet access via router
byte subnet[] = { 255, 255, 255, 0 }; //subnet mask
EthernetServer server(84); //server port

String readString;

//////////////////////

void setup(){

  pinMode(5, OUTPUT); //pin selected to control
  //start Ethernet
  Ethernet.begin(mac, ip, gateway, gateway, subnet);
  server.begin();

  myservo.write(90); //set initial servo position if desired
  myservo.attach(7);  //the pin for the servo control
  //enable serial data print
  Serial.begin(9600);
  Serial.println("server servo/pin 5 test 1.0"); // so I can keep track of what is loaded
}

void loop(){
  // Create a client connection
  EthernetClient client = server.available();
  if (client) {
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();

        //read char by char HTTP request
        if (readString.length() < 100) {

          //store characters to string
          readString += c;
          //Serial.print(c);
        }

        //if HTTP request has ended
        if (c == '\n') {

          ///////////////
          Serial.println(readString); //print to serial monitor for debuging

          client.println("HTTP/1.1 200 OK"); //send new page
          client.println("Content-Type: text/html");
          client.println();

          client.println("<HTML>");
          client.println("<HEAD>");
          client.println("<TITLE>Arduino GET test page</TITLE>");
          client.println("</HEAD>");
          client.println("<BODY>");

          client.println("<H1>Zoomkat's simple Arduino button</H1>");
         
          client.println("<a href=\"/?on\">ON</a>");
          client.println("<a href=\"/?off\">OFF</a>");

          client.println("</BODY>");
          client.println("</HTML>");

          delay(1);
          //stopping client
          client.stop();

          ///////////////////// control arduino pin
          if(readString.indexOf("on") >0)//checks for on
          {
            myservo.write(40);
            digitalWrite(5, HIGH);    // set pin 5 high
            Serial.println("Led On");
          }
          if(readString.indexOf("off") >0)//checks for off
          {
            myservo.write(140);
            digitalWrite(5, LOW);    // set pin 5 low
            Serial.println("Led Off");
          }
          //clearing string for next read
          readString="";

        }
      }
    }
  }
}

Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   8)

spatula

If you just need to read a single byte and do something depending on its value the basic sequence is this:

Code: [Select]

loop()
{
 EthernetClient client = server.available();
 if (client) {
   while (client.connected()) {
     if (client.available()) {
       char ch = client.read();
// examine ch
       switch(ch)
       {
       case '0':  // for example
// switch LED off
         break;
// add other cases
       }
// send the response and close the connection
       client.println("OK");
       delay(1);
       client.stop();
     }
   }
 }
}


You'll notice this is the same sequence of zoomkat's example. If you want to send and read commands as strings, zoomkat's is the solution you are looking for.

Malibux


If you just need to read a single byte and do something depending on its value the basic sequence is this:

Code: [Select]

loop()
{
 EthernetClient client = server.available();
 if (client) {
   while (client.connected()) {
     if (client.available()) {
       char ch = client.read();
// examine ch
       switch(ch)
       {
       case '0':  // for example
// switch LED off
         break;
// add other cases
       }
// send the response and close the connection
       client.println("OK");
       delay(1);
       client.stop();
     }
   }
 }
}


You'll notice this is the same sequence of zoomkat's example. If you want to send and read commands as strings, zoomkat's is the solution you are looking for.


Thank you very much. that was just what I needed :)

Go Up