Не может отправлять пакеты из arduino на клиент Python, используя сокет UDP через Ethernet
Я пытаюсь открыть UDP-сокет между Arduino Galielo Gen 2 и клиентом Python. Я хочу отправить значение, полученное датчиком температуры от Arduino, клиенту и получить ответ от клиента.
Код 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:
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 из
Любая помощь?
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, но вам придется прочитать, как получить эту информацию.
Вы никогда не вызывали 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)