/** * Copyright (c) 2010-2016 by the respective copyright holders. * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html */ package org.openhab.binding.openenergymonitor.protocol; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; import java.nio.ByteBuffer; import java.util.Arrays; import org.openhab.binding.openenergymonitor.internal.OpenEnergyMonitorException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Connector for UDP communication. * * @author Pauli Anttila * @since 1.4.0 */ public class OpenEnergyMonitorUDPConnector extends OpenEnergyMonitorConnector { private static final Logger logger = LoggerFactory.getLogger(OpenEnergyMonitorUDPConnector.class); static final int MAX_PACKET_SIZE = 255; int port = 9997; DatagramSocket socket = null; public OpenEnergyMonitorUDPConnector(int port) { if (port > 0) { this.port = port; } } @Override public void connect() throws OpenEnergyMonitorException { if (socket == null) { try { socket = new DatagramSocket(port); logger.debug("Open Energy Monitor UDP message listener started"); } catch (SocketException e) { throw new OpenEnergyMonitorException(e); } } } @Override public void disconnect() throws OpenEnergyMonitorException { if (socket != null) { socket.close(); socket = null; } } @Override public byte[] receiveDatagram() throws OpenEnergyMonitorException { try { if (socket == null) { socket = new DatagramSocket(port); } // Create a packet DatagramPacket packet = new DatagramPacket(new byte[MAX_PACKET_SIZE], MAX_PACKET_SIZE); // Receive a packet (blocking) socket.receive(packet); String[] bytes = new String(Arrays.copyOfRange(packet.getData(), 0, packet.getLength() - 1)).split(" "); ByteBuffer bytebuf = ByteBuffer.allocate(bytes.length); for (int i = 0; i < bytes.length; i++) { if (bytes[i].isEmpty() == false) { byte b = (byte) Integer.parseInt(bytes[i]); bytebuf.put(b); } } return bytebuf.array(); } catch (SocketException e) { throw new OpenEnergyMonitorException(e); } catch (IOException e) { throw new OpenEnergyMonitorException(e); } catch (NumberFormatException e) { throw new OpenEnergyMonitorException(e); } } }