/** @param args */
  public static void main(final String[] args) {
    // System.out is the standard output stream of our environment (here, most likely terminal)
    System.out.println(
        "This example shows how to establish a KNX connection " + "to a KNXnet/IP server.");

    try {
      // KNXNetworkLink is the base interface of a Calimero link to a KNX network.
      // For all the Calimero interfaces you don't know yet, check the Calimero API
      // documentation.
      final KNXNetworkLink knxLink;

      // We have to provide our own local and remote endpoints to the network link
      // using an InetSocketAddress, which we create first. This approach is of advantage if
      // our computer is multi-homed, i.e., has several network interface cards, the default
      // configuration of local host (via InetAddress.getLocalHost) is not correct or not
      // desired, or if the KNXnet/IP server (i.e., remote endpoint) uses a non-default port.
      final InetSocketAddress localEP = new InetSocketAddress(InetAddress.getByName(localHost), 0);
      // now the remote port
      final InetSocketAddress remoteEP = new InetSocketAddress(remoteHost, knxServerPort);

      System.out.println("Try connecting to " + remoteHost + " on port " + knxServerPort + "...");

      // Here, we create the IP-based link, which tries to establish a connection to the
      // remote endpoint in its constructor.
      // This constructor also allows to specify the service mode of the link, i.e.,
      // KNX tunneling or routing according to the standard, and whether to use NAT-aware
      // (Network Address Translation) addressing. The last parameter tells our
      // link that the KNX network is based on twisted-pair medium, with TP1 currently being
      // the most commonly used one for KNX networks.
      knxLink =
          new KNXNetworkLinkIP(
              KNXNetworkLinkIP.TUNNELING, localEP, remoteEP, false, TPSettings.TP1);

      System.out.println("Connection to " + remoteHost + " successfully established");

      // We always make sure to close the connection after we used it
      knxLink.close();

      System.out.println("Connection got closed");
    } catch (final KNXException e) {

      // All checked Calimero-specific exceptions are subtypes of KNXException
      System.out.println("Error connecting to " + remoteHost + ": " + e.getMessage());
    } catch (final InterruptedException e) {

      // Longer tasks that might block, like connection procedures, are interruptible, e.g.,
      // by using Ctrl+C from the terminal; in such case, an instance of InterruptedException
      // is thrown.
      // If a task got interrupted, Calimero will clean up its internal state and resources.
      // Any deviation of this behavior (e.g., if not feasible) will be noted in the
      // Calimero API documentation.
      System.out.println("Connecting to " + remoteHost + " was interrupted, quit");
    } catch (final UnknownHostException e) {
      System.out.println("Host resolution for local endpoint " + localHost + " failed");
    }
  }
 /**
  * Creates a new property adapter for remote property access.
  *
  * @param link KNX network link used for communication with the KNX network
  * @param remote KNX individual address to access its interface objects
  * @param l property adapter listener to get notified about adapter events, use <code>null</code>
  *     for no listener
  * @param connOriented <code>true</code> to use connection oriented mode for access, <code>false
  *     </code> to use connectionless mode
  * @throws KNXLinkClosedException if the network link is closed
  */
 public RemotePropertyServiceAdapter(
     final KNXNetworkLink link,
     final IndividualAddress remote,
     final PropertyAdapterListener l,
     final boolean connOriented)
     throws KNXLinkClosedException {
   mc = new ManagementClientImpl(link);
   dst = mc.createDestination(remote, connOriented);
   pal = l;
   nll = pal != null ? new NLListener() : null;
   if (nll != null) link.addLinkListener(nll);
   key = null;
 }
 /* (non-Javadoc)
  * @see tuwien.auto.calimero.mgmt.PropertyAdapter#close()
  */
 public void close() {
   final KNXNetworkLink lnk = mc.detach();
   if (lnk != null && nll != null) lnk.removeLinkListener(nll);
 }