package com.homesnap.engine.connector.knxnetip;
/*
* #%L
* HomeSnapEngine
* %%
* Copyright (C) 2011 - 2016 A. de Giuli
* %%
* This file is part of HomeSnap done by Arnaud de Giuli (arnaud.degiuli(at)free.fr)
* helped by Olivier Driesbach (olivier.driesbach(at)gmail.com).
*
* HomeSnap is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* HomeSnap is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with HomeSnap. If not, see <http://www.gnu.org/licenses/>.
* #L%
*/
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.UnknownHostException;
import java.util.HashSet;
import java.util.Set;
import tuwien.auto.calimero.CloseEvent;
import tuwien.auto.calimero.DataUnitBuilder;
import tuwien.auto.calimero.FrameEvent;
import tuwien.auto.calimero.cemi.CEMI;
import tuwien.auto.calimero.exception.KNXException;
import tuwien.auto.calimero.knxnetip.KNXnetIPConnection;
import tuwien.auto.calimero.link.KNXNetworkMonitor;
import tuwien.auto.calimero.link.KNXNetworkMonitorIP;
import tuwien.auto.calimero.link.event.LinkListener;
import tuwien.auto.calimero.link.event.MonitorFrameEvent;
import tuwien.auto.calimero.link.medium.RawFrame;
import tuwien.auto.calimero.link.medium.RawFrameBase;
import tuwien.auto.calimero.link.medium.TPSettings;
import com.homesnap.engine.connector.CommandListener;
import com.homesnap.engine.connector.ConnectionListener;
import com.homesnap.engine.connector.Monitor;
import com.homesnap.engine.connector.UnknownControllerListener;
import com.homesnap.engine.connector.knxnetip.network.NetworkConfig;
import com.homesnap.engine.controller.Controller;
/**
*
* @author DRIESBACH Olivier
* @version 1.0
* @since 1.0
*/
public class KNXMonitor implements Monitor, LinkListener {
/** */
private String ipAddress;
/** */
private KNXNetworkMonitor monitor;
/** */
private Set<Controller> controllers = new HashSet<Controller>();
/**
*
* @param ipAddress
* @param port
*/
KNXMonitor(String ipAddress) {
this.ipAddress = ipAddress;
}
@Override
public synchronized boolean connect() {
if (!isConnected()) {
KNXnetIPConnectionSettings knxConnectionSettings = KNXDiscoverer.getInstance().findKNXNetIPAddresses()
.get(NetworkConfig.getInstance().getInetAdress(ipAddress));
// if (knxConnectionSettings == null) {
// throw new RuntimeException("No KNXnetIP device found on the local network !");
// }
try {
knxConnectionSettings = new KNXnetIPConnectionSettings(InetAddress.getByName("192.168.0.50"), InetAddress.getByName(ipAddress), KNXnetIPConnection.IP_PORT, TPSettings.TP1);
InetSocketAddress localSocket = new InetSocketAddress(knxConnectionSettings.getLocalAddress(), 0);
InetSocketAddress remoteSocket = new InetSocketAddress(knxConnectionSettings.getRemoteAddress(), knxConnectionSettings.getPort());
monitor = new KNXNetworkMonitorIP(localSocket, remoteSocket, false, knxConnectionSettings.getSettings());
System.out.println("Monitor connected !");
} catch (KNXException e) {
System.out.println("Monitor not connected !");
e.printStackTrace();
} catch (UnknownHostException e) {
System.out.println("Monitor not connected !");
e.printStackTrace();
}
}
return isConnected();
}
@Override
public boolean isConnected() {
return (monitor != null) && monitor.isOpen();
}
@Override
public synchronized void disconnect() {
if (isConnected()) {
monitor.close();
}
}
@Override
public void addControllerToMonitor(Controller controller) {
synchronized (controllers) {
controllers.add(controller);
}
}
@Override
public void removeControllerToMonitor(Controller controller) {
synchronized (controllers) {
controllers.remove(controller);
}
}
@Override
public void addConnectionListener(ConnectionListener connectionListener) {
// TODO Auto-generated method stub
}
@Override
public void removeConnectionListener(ConnectionListener connectionListener) {
// TODO Auto-generated method stub
}
@Override
public void addControllerStatusListener(CommandListener commandListener) {
// TODO Auto-generated method stub
}
@Override
public void removeControllerStatusListener(CommandListener commandListener) {
// TODO Auto-generated method stub
}
@Override
public void addUnknownControllerListener(UnknownControllerListener unknownControllerListener) {
// TODO Auto-generated method stub
}
@Override
public void removeUnknownControllerListener(UnknownControllerListener unknownControllerListener) {
// TODO Auto-generated method stub
}
@Override
public void indication(FrameEvent event) {
CEMI frame = event.getFrame();
if (frame instanceof MonitorFrameEvent) {
System.out.println("Event received : "+ frame.toString());
RawFrame rawFrame = ((MonitorFrameEvent) frame).getRawFrame();
if (rawFrame != null) {
System.out.println("Raw : "+ rawFrame.toString());
if (rawFrame instanceof RawFrameBase) {
RawFrameBase base = (RawFrameBase) rawFrame;
System.out.println("Base : "+ DataUnitBuilder.decode(base.getTPDU(), base.getDestination()));
}
}
synchronized (controllers) {
for (Controller controller : controllers) {
// if (who.equals(controller.getWho()) && where.equals(controller.getWhere())) {
// known = true;
// controller.changeState(what);
// }
}
}
} else {
System.out.println("Unknow event frame received : "+ frame.toString());
}
}
@Override
public void linkClosed(CloseEvent event) {
System.out.println("KNXMonitor received closing event : "+ event.getReason());
}
}