示例#1
0
 private void writeToKNX(String itemName, Type value) {
   Iterable<Datapoint> datapoints = getDatapoints(itemName, value.getClass());
   if (datapoints != null) {
     ProcessCommunicator pc = KNXConnection.getCommunicator();
     if (pc != null) {
       for (Datapoint datapoint : datapoints) {
         try {
           pc.write(datapoint, toDPTValue(value, datapoint.getDPT()));
           logger.debug("Wrote value '{}' to datapoint '{}'", value, datapoint);
         } catch (KNXException e) {
           logger.warn(
               "Value '{}' could not be sent to the KNX bus using datapoint '{}' - retrying one time: {}",
               new Object[] {value, datapoint, e.getMessage()});
           try {
             // do a second try, maybe the reconnection was successful
             pc = KNXConnection.getCommunicator();
             pc.write(datapoint, toDPTValue(value, datapoint.getDPT()));
             logger.debug("Wrote value '{}' to datapoint '{}' on second try", value, datapoint);
           } catch (KNXException e1) {
             logger.error(
                 "Value '{}' could not be sent to the KNX bus using datapoint '{}' - giving up after second try: {}",
                 new Object[] {value, datapoint, e1.getMessage()});
           }
         }
       }
     }
   }
 }
  /** @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");
    }
  }