简体   繁体   English

无法使用以太网上的UDP套接字将数据包从arduino发送到python客户端

[英]can't send packets from arduino to python client using UDP socket over ethernet

I'm trying to open a UDP socket between arduino Galielo Gen 2 and python client . 我正在尝试在arduino Galielo Gen 2和python client之间打开UDP套接字。 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发送到客户端,并从客户端接收回响应。

Arduino Code : 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);
}

python code : python代码

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 : 尝试代码后,这是在arduino上的结果:

Received packet of size 11 From 255.255.255.255, port 0 Contents: Temperature 从端口255.255.255.255接收的大小为11的数据包内容:温度

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 在python上,我得到了以下消息:追溯(最近一次调用):文件“ C:/Users/enwan/Desktop/te/temp.py”,第12行,在rec_data中,addr = client_socket.recvfrom(2048)超时:已超时出

Any help ? 有什么帮助吗?

You have not initialised the address of the computer that is running the python code. 您尚未初始化运行python代码的计算机的地址。

IPAddress remote = Udp.remoteIP();

This is being initialised to address 255.255.255.255, which is not a valid IP address. 它正在初始化为地址255.255.255.255,这不是有效的IP地址。 It does not seem to be getting the remote IP. 它似乎没有获得远程IP。

Additionally, the remote port isnt being retrieved in the following line, and is being set to a default value of 0: 此外,在下一行中不会检索远程端口,并且将其设置为默认值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. 因此,arduino尝试将数据发送到端口0的ip地址255.255.255.255。结果,由于arduino无法正确寻址PC,因此python代码超时。

You will need to address your python PC directly, ie. 您将需要直接寻址python PC,即。 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. UDP库可能有一种方法可以根据您在arduino上收到的数据包来设置ip和端口,但是您必须阅读如何获取该信息。

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. 您从未在Python脚本中调用bind()将UDP套接字绑定到端口,因此操作系统不知道您希望UDP套接字接收任何数据包,因此从不传递任何数据包。

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM