venerdì 9 gennaio 2015

Arduino UDP Broadcast (SismoArduino)

Questa e' una piccola modifica al sistema di invio dati di SismoArduino
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

-------------------------------------------