In alcuni casi puo' essere comodo non conoscere a priori l'indirizzo del server a cui inviare i dati ed essere comunque in grado di configurare la scheda Arduino
La soluzione e' quella di inviare i pacchetti UDP in modalita' broadcast. In questo modo tutte le macchine della rete ricevono il pacchetto; cio' genera ovviamente un traffico inutile sulla rete ma e' piu' o meno quello che fanno i computer Windows e nessuno si e' mai lamentato piu' di tanto per cui non mi farei problemi
Fonte Wikipedia |
Lo sketch di invio deve solo modificare l'indirizzo del server con l'IP di broadcast che e' 255.255.255.255 (la versione 192.168.1.255 non funziona!!)
-------------------------------------------
#include <SPI.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
//Arduino
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,1,2);
unsigned int localPort = 8888;
//Server
byte remoteIP[4] = {255,255,255,255};
int remotePort = 5005;
String dati;
char charBuf[1024];
EthernetUDP Udp;
void setup() {
Serial.begin(115200);
Ethernet.begin(mac,ip);
Udp.begin(localPort);
}
void loop() {
int x = analogRead(A5);
delay(2);
int y = analogRead(A4);
delay(2);
int z = analogRead(A3);
dati = String(x)+","+String(y)+","+String(z);
Serial.println(dati);
dati.toCharArray(charBuf, 1024);
Udp.beginPacket(remoteIP, remotePort);
Udp.write(charBuf);
Udp.endPacket();
delay(2);
}
-------------------------------------------
il programma in Python che funziona da server deve essere invece riscritto per non ignorare i pacchetti broadcast
-------------------------------------------
import socket,select
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1)
sock.bind(('',5005))
while True:
msg,add = sock.recvfrom(1024)
print msg
import socket,select
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST,1)
sock.bind(('',5005))
while True:
msg,add = sock.recvfrom(1024)
print msg
-------------------------------------------
Nessun commento:
Posta un commento