0
votes

I'm trying to open a UDP socket between arduino Galielo Gen 2 and python client . I want to send the value captured by the temperature sensor from the arduino to the client and receive back a response from the client .

Arduino Code :

#include <Ethernet.h> //Load Ethernet Library
#include <EthernetUdp.h> //Load UDP Library
#include <SPI.h> //Load the SPI Library

byte mac[] = { 0x98, 0x4F, 0xEE, 0x01, 0xF1, 0xBE }; //Assign a mac address
IPAddress ip( 192,168,1,207);
//IPAddress gateway(192,168,1, 1);
//IPAddress subnet(255, 255, 255, 0);
unsigned int localPort = 5454; 
char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; 
String datReq;  
int packetSize; 
EthernetUDP Udp; 

void setup() {
Serial.begin(9600); 
Ethernet.begin(mac, ip);
Udp.begin(localPort); 
delay(2000);
}

void loop() {

   int sensor = analogRead (A0); 
   float voltage = ((sensor*5.0)/1023.0);
   float temp = voltage *100;
   Serial.println(temp);  
  packetSize = Udp.parsePacket();
  if(packetSize>0)
  { 
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remote = Udp.remoteIP();
    for (int i =0; i < 4; i++)
    {
      Serial.print(remote[i], DEC);
      if (i < 3)
      {
        Serial.print(".");
      }
    }
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

  Udp.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); 
  Serial.println("Contents:");
  Serial.println(packetBuffer);
  String datReq(packetBuffer); 
  Udp.beginPacket(Udp.remoteIP(), 5454 ); 
  Udp.print(temp);
  Udp.endPacket(); 
  }
  delay(50);
}

python code :

from socket import *
import time

address = ( '192.168.1.207', 5454) 
client_socket = socket(AF_INET, SOCK_DGRAM) 
client_socket.settimeout(5)

while(1):

    data = "Temperature" 
    client_socket.sendto(data, address)
    rec_data, addr = client_socket.recvfrom(2048)
    print rec_data 

After trying the code this is the result on arduino :

Received packet of size 11 From 255.255.255.255, port 0 Contents: Temperature

On python I got this message : Traceback (most recent call last): File "C:/Users/enwan/Desktop/te/temp.py", line 12, in rec_data, addr = client_socket.recvfrom(2048) timeout: timed out

Any help ?

2

2 Answers

1
votes

You have not initialised the address of the computer that is running the python code.

IPAddress remote = Udp.remoteIP();

This is being initialised to address 255.255.255.255, which is not a valid IP address. It does not seem to be getting the remote IP.

Additionally, the remote port isnt being retrieved in the following line, and is being set to a default value of 0:

Udp.remotePort()

Thus the arduino is trying to send data to the ip address 255.255.255.255 at port 0. As a result, there is a timeout on the python code as the arduino is not addressing the PC correctly.

You will need to address your python PC directly, ie. Set:

IPAddress remoteip(192,168,1,X);     // whatever your PC ip address is
Udp.beginPacket(remoteip, 5454 ); 
Udp.print(temp);
Udp.endPacket(); 

There is probably a way with the UDP library to set the ip and port according to the packet you received on the arduino, but you will have to read into how to get that information.

0
votes

You never called bind() in your Python script to bind your UDP socket to a port, so the OS doesn't know that you want your UDP socket to receive any packets, and thus never passes you any packets.

Here's what you need to have:

client_socket = socket(AF_INET, SOCK_DGRAM) 
client_socket.bind(("", portNum))  # where portNum is the port number your Arduino is sending to
[...]
rec_data, addr = client_socket.recvfrom(2048)