/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package com.wordpress.salaboy.sensor.udp; import com.wordpress.salaboy.sensor.SensorDataParser; import com.wordpress.salaboy.sensor.SensorMessageProducer; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import java.util.logging.Level; import java.util.logging.Logger; /** * * @author esteban */ public class UDPSensorServer implements Runnable { private final static int DEFAULT_BUFFER_SIZE = 75; private boolean keepRunning; private DatagramSocket socket; private int bufferSize; private SensorDataParser sensorDataParser; private SensorMessageProducer sensorMessageProducer; private final Object PARSER_LOCK = new Object(); private final Object PRODUCER_LOCK = new Object(); public UDPSensorServer(SensorDataParser sensorDataParser, SensorMessageProducer sensorMessageProducer) { this.sensorDataParser = sensorDataParser; this.sensorMessageProducer = sensorMessageProducer; } public void startService(String address, int port) throws SocketException, UnknownHostException { this.startService(address, port, DEFAULT_BUFFER_SIZE); } public void startService(String address, int port, int bufferSize) throws SocketException, UnknownHostException { System.out.println("Starting UDP Sensor Server"); this.bufferSize = bufferSize; System.out.println("Starting UDP Server on " + port + " port"); if (address != null){ socket = new DatagramSocket(port, InetAddress.getByName(address)); } else{ socket = new DatagramSocket(port); } keepRunning = true; new Thread(this).start(); } public void stopService() { System.out.println("Stopping UDP Sensor Server"); keepRunning = false; socket.close(); } @Override public void run() { System.out.println("UDP Sensor Server ready to get data"); while (keepRunning) { DatagramPacket datagramPacket = new DatagramPacket(new byte[bufferSize], bufferSize); try { socket.receive(datagramPacket); try { String data = new String(datagramPacket.getData()); Logger.getLogger(UDPSensorServer.class.getName()).log(Level.FINEST, "UDP Data Received= {0}", data); double message = 0D; boolean validData = false; synchronized(PARSER_LOCK){ validData = sensorDataParser.isValidData(data); Logger.getLogger(UDPSensorServer.class.getName()).log(Level.FINEST, "\tis valid? {0}", validData); if (validData){ message = sensorDataParser.parseData(data); } Logger.getLogger(UDPSensorServer.class.getName()).log(Level.FINEST, "\tvalue? {0}", message); } synchronized(PRODUCER_LOCK){ if (validData){ sensorMessageProducer.informMessage(message); } } } catch (Exception ex) { Logger.getLogger(UDPSensorServer.class.getName()).log(Level.SEVERE, null, ex); } } catch (IOException ex) { Logger.getLogger(UDPSensorServer.class.getName()).log(Level.SEVERE, null, ex); } } System.out.println("UDP Sensor Server stopped"); } public boolean isRunning(){ return this.keepRunning; } public void setSensorDataParser(SensorDataParser sensorDataParser) { synchronized (PARSER_LOCK){ this.sensorDataParser = sensorDataParser; } } public SensorDataParser getSensorDataParser() { synchronized (PARSER_LOCK){ return sensorDataParser; } } public SensorMessageProducer getSensorMessageProducer() { synchronized(PRODUCER_LOCK){ return sensorMessageProducer; } } public void setSensorMessageProducer(SensorMessageProducer sensorMessageProducer) { synchronized(PRODUCER_LOCK){ this.sensorMessageProducer = sensorMessageProducer; } } }