package com.serotonin.bacnet4j.npdu; import com.serotonin.bacnet4j.apdu.APDU; import com.serotonin.bacnet4j.enums.MaxApduLength; import com.serotonin.bacnet4j.exception.BACnetException; import com.serotonin.bacnet4j.transport.Transport; import com.serotonin.bacnet4j.type.constructed.Address; import com.serotonin.bacnet4j.type.primitive.OctetString; import org.free.bacnet4j.util.ByteQueue; abstract public class Network { private final int localNetworkNumber; private Transport transport; public Network() { this(0); } public Network(int localNetworkNumber) { this.localNetworkNumber = localNetworkNumber; } public int getLocalNetworkNumber() { return localNetworkNumber; } public void setTransport(Transport transport) { this.transport = transport; } public Transport getTransport() { return transport; } abstract public NetworkIdentifier getNetworkIdentifier(); abstract public MaxApduLength getMaxApduLength(); public void initialize(Transport transport) throws Exception { this.transport = transport; } abstract public void terminate(); abstract public Address getLocalBroadcastAddress(); abstract public Address[] getAllLocalAddresses(); abstract public void sendAPDU(Address recipient, OctetString linkService, APDU apdu, boolean broadcast) throws BACnetException; abstract public void checkSendThread(); protected void writeNpci(ByteQueue queue, Address recipient, OctetString link, APDU apdu) { NPCI npci; if (recipient.isGlobal()) npci = new NPCI((Address) null); else if (isLocal(recipient)) { if (link != null) throw new RuntimeException("Invalid arguments: link service address provided for a local recipient"); npci = new NPCI(null, null, apdu.expectsReply()); } else { if (link == null) throw new RuntimeException( "Invalid arguments: link service address not provided for a remote recipient"); npci = new NPCI(recipient, null, apdu.expectsReply()); } npci.write(queue); } protected boolean isLocal(Address recipient) { int nn = recipient.getNetworkNumber().intValue(); return nn == Address.LOCAL_NETWORK || nn == localNetworkNumber; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + localNetworkNumber; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Network other = (Network) obj; if (localNetworkNumber != other.localNetworkNumber) return false; return true; } }