не могу отправлять пакеты с arduino на клиент python, используя сокет UDP через Ethernet

Я пытаюсь открыть сокет UDP между arduino Galielo Gen 2 и клиентом python. Я хочу отправить клиенту значение, полученное датчиком температуры от Arduino, и получить ответ от клиента.

Код Ардуино:

#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);
}

код питона:

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 

После попытки кода это результат на arduino:

Получен пакет размером 11 От 255.255.255.255, порт 0 Содержимое: Температура

На python я получил это сообщение: Traceback (последний последний вызов): файл «C:/Users/enwan/Desktop/te/temp.py», строка 12, в rec_data, addr = client_socket.recvfrom (2048) timeout: timed вне

Любая помощь ?


person enwan    schedule 07.03.2016    source источник


Ответы (2)


Вы не инициализировали адрес компьютера, на котором выполняется код Python.

IPAddress remote = Udp.remoteIP();

Он инициализируется для адреса 255.255.255.255, который не является допустимым IP-адресом. Кажется, он не получает удаленный IP.

Кроме того, удаленный порт не извлекается в следующей строке, и для него устанавливается значение по умолчанию, равное 0:

Udp.remotePort()

Таким образом, arduino пытается отправить данные на IP-адрес 255.255.255.255 через порт 0. В результате в коде python есть тайм-аут, поскольку arduino неправильно обращается к ПК.

Вам нужно будет напрямую обратиться к вашему ПК с Python, т.е. Задавать:

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

Вероятно, есть способ с библиотекой UDP установить IP и порт в соответствии с пакетом, который вы получили на Arduino, но вам придется прочитать, как получить эту информацию.

person aleksk    schedule 08.03.2016

Вы никогда не вызывали bind() в своем скрипте Python для привязки вашего UDP-сокета к порту, поэтому ОС не знает, что вы хотите, чтобы ваш UDP-сокет получал какие-либо пакеты, и поэтому никогда не передает вам никаких пакетов.

Вот что вам нужно иметь:

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)
person Jeremy Friesner    schedule 22.07.2017