Announcement

Collapse
No announcement yet.

UDP Send and Receive

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • UDP Send and Receive

    Hello,

    I tried connecting 4Duino to WiFi using this Code from Arduino examples, but it didnt work. I guess it is because of the Code being made for someone using the WiFi shield for Arduino. Is there a way to make it work on 4Duino?


    Code:
    /*
      WiFi UDP Send and Receive String
    
     This sketch wait an UDP packet on localPort using a WiFi shield.
     When a packet is received an Acknowledge packet is sent to the client on port remotePort
    
     Circuit:
     * WiFi shield attached
    
     created 30 December 2012
     by dlf (Metodo2 srl)
    
     */
    
    
    #include <SPI.h>
    #include <WiFi.h>
    #include <WiFiUdp.h>
    
    int status = WL_IDLE_STATUS;
    char ssid[] = "yourNetwork"; //  your network SSID (name)
    char pass[] = "secretPassword";    // your network password (use for WPA, or use as key for WEP)
    int keyIndex = 0;            // your network key Index number (needed only for WEP)
    
    unsigned int localPort = 2390;      // local port to listen on
    
    char packetBuffer[255]; //buffer to hold incoming packet
    char  ReplyBuffer[] = "acknowledged";       // a string to send back
    
    WiFiUDP Udp;
    
    void setup() {
      //Initialize serial and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB port only
      }
    
      // check for the presence of the shield:
      if (WiFi.status() == WL_NO_SHIELD) {
        Serial.println("WiFi shield not present");
        // don't continue:
        while (true);
      }
    
      String fv = WiFi.firmwareVersion();
      if (fv != "1.1.0") {
        Serial.println("Please upgrade the firmware");
      }
    
      // attempt to connect to Wifi network:
      while (status != WL_CONNECTED) {
        Serial.print("Attempting to connect to SSID: ");
        Serial.println(ssid);
        // Connect to WPA/WPA2 network. Change this line if using open or WEP network:
        status = WiFi.begin(ssid);
    
        // wait 10 seconds for connection:
        delay(10000);
      }
      Serial.println("Connected to wifi");
      printWifiStatus();
    
      Serial.println("\nStarting connection to server...");
      // if you get a connection, report back via serial:
      Udp.begin(localPort);
    }
    
    void loop() {
    
      // if there's data available, read a packet
      int packetSize = Udp.parsePacket();
      if (packetSize) {
        Serial.print("Received packet of size ");
        Serial.println(packetSize);
        Serial.print("From ");
        IPAddress remoteIp = Udp.remoteIP();
        Serial.print(remoteIp);
        Serial.print(", port ");
        Serial.println(Udp.remotePort());
    
        // read the packet into packetBufffer
        int len = Udp.read(packetBuffer, 255);
        if (len > 0) {
          packetBuffer[len] = 0;
        }
        Serial.println("Contents:");
        Serial.println(packetBuffer);
    
        // send a reply, to the IP address and port that sent us the packet we received
        Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
        Udp.write(ReplyBuffer);
        Udp.endPacket();
      }
    }
    
    
    void printWifiStatus() {
      // print the SSID of the network you're attached to:
      Serial.print("SSID: ");
      Serial.println(WiFi.SSID());
    
      // print your WiFi shield's IP address:
      IPAddress ip = WiFi.localIP();
      Serial.print("IP Address: ");
      Serial.println(ip);
    
      // print the received signal strength:
      long rssi = WiFi.RSSI();
      Serial.print("signal strength (RSSI):");
      Serial.print(rssi);
      Serial.println(" dBm");
    }

    This second Code is from the Website of 4Systems and works perfectly, but ist there a way to read one specific Byte of the packetBuffer without using another Loop for it?

    https://www.4duino.com/ntp-clock/


    So, like i said, my priority is to be able to use the first Code in 4Duino.
    If it is not possible, than i would like to use the second one, which works already, but being able to read a specific Byte of the paketbuffer, without having to write a Loop for it.


    In other words, this is the part that i think intersting, avoiding Loops.

    Code:
    Udp.read(packetBuffer, NTP_PACKET_SIZE);
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
    unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
    And not this one:

    Code:
    while (ESPserial.available() > 0)
      {
        byte ch = ESPserial.read();
        if (i <= NTP_PACKET_SIZE)
        {
          packetBuffer[i] = ch;
        }
        if (ch < 0x10) Serial.print('0');
        Serial.print(ch, HEX);
        Serial.print(' ');
        if ( (((i + 1) % 15) == 0) )
        {
          Serial.println();
        }
        delay(5);
        i++;
    ..........................
    unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
      unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);

    Thanks.



  • #2
    Hi,

    The first bit of code won't work for you as it is based on a WiFi shield which is connected differently than the 4Duino. The 4Duino is connected via serial and uses the ESP8266 AT command set .

    In the second bit of code, the loop is there to fill the packetBuffer with the received udp data. the Upd.read in the first bit of code will have a loop in it to read from udp to the buffer. You could create a function to do just what Udp.read does.

    Code:
    void Udp_read(byte *packetBuffer, NTP_PACKET_SIZE){
    int i = 0;
    while (ESPserial.available() > 0)
      {
        byte ch = ESPserial.read();
        if (i <= NTP_PACKET_SIZE)
        {
          packetBuffer[i] = ch;
        }
        i++;
      }
    }
    I hope this helps

    Best regards

    Paul


    Comment

    Working...
    X