package com.aberdyne.droidnavi.client;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;
import java.util.concurrent.ExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import android.os.AsyncTask;
import pctelelog.Packet;
import pctelelog.TeleLogServer;
import pctelelog.events.AbstractEvent;
import pctelelog.events.HeartBeatEvent;
public class MulticastSender extends AsyncTask<AbstractEvent, Void, Boolean>{
private static final Logger logger = LoggerFactory.getLogger(MulticastSender.class);
private static final int PORT = TeleLogServer.MULTI_LIST_PORT;
@Override
protected Boolean doInBackground(AbstractEvent...event) {
boolean result = dispatchEvent(event[0]);
return Boolean.valueOf(result);
}
public static boolean checkMulticastAvailability() {
return MulticastSender.sendEvent(new HeartBeatEvent());
}
public static boolean sendEvent(AbstractEvent event) {
try {
return new MulticastSender().execute(event).get().booleanValue();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
} catch (ExecutionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
private static boolean dispatchEvent(AbstractEvent event) {
try {
MulticastSocket socket = new MulticastSocket(PORT);
InetAddress sessAddr = InetAddress.getByName("224.1.1.1");
socket.setTimeToLive(5);
Packet[] packets = Packet.createPackets(event);
for(Packet packet : packets) {
byte[] data = packet.serialize();
// Build Packet
DatagramPacket d_pack = new DatagramPacket(data, data.length,
sessAddr, PORT);
// Broadcast
socket.send(d_pack);
try {
Thread.sleep(10);
} catch(InterruptedException e){}
}
// Cleanup
socket.close();
}
catch(IOException e) {
logger.error("Failed to send event");
return false;
}
return true;
}
}