From 504cfff4cf44fda1c307d025931372cf17447b35 Mon Sep 17 00:00:00 2001 From: Leo Siepel Date: Thu, 12 Sep 2024 14:04:32 +0200 Subject: [PATCH 1/2] Remove apache Signed-off-by: Leo Siepel --- .../discovery/EnvisalinkBridgeDiscovery.java | 97 +++---------------- 1 file changed, 16 insertions(+), 81 deletions(-) diff --git a/bundles/org.openhab.binding.dscalarm/src/main/java/org/openhab/binding/dscalarm/internal/discovery/EnvisalinkBridgeDiscovery.java b/bundles/org.openhab.binding.dscalarm/src/main/java/org/openhab/binding/dscalarm/internal/discovery/EnvisalinkBridgeDiscovery.java index 1bb9490c6972a..2170aef5aef66 100644 --- a/bundles/org.openhab.binding.dscalarm/src/main/java/org/openhab/binding/dscalarm/internal/discovery/EnvisalinkBridgeDiscovery.java +++ b/bundles/org.openhab.binding.dscalarm/src/main/java/org/openhab/binding/dscalarm/internal/discovery/EnvisalinkBridgeDiscovery.java @@ -15,15 +15,17 @@ import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; +import java.net.Inet4Address; import java.net.InetAddress; import java.net.InetSocketAddress; -import java.net.NetworkInterface; import java.net.Socket; import java.net.SocketException; import java.net.SocketTimeoutException; +import java.net.UnknownHostException; +import java.util.List; -import org.apache.commons.net.util.SubnetUtils; -import org.apache.commons.net.util.SubnetUtils.SubnetInfo; +import org.openhab.core.net.CidrAddress; +import org.openhab.core.net.NetUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -57,43 +59,27 @@ public EnvisalinkBridgeDiscovery(DSCAlarmBridgeDiscovery dscAlarmBridgeDiscovery public synchronized void discoverBridge() { logger.debug("Starting Envisalink Bridge Discovery."); - SubnetUtils subnetUtils = null; - SubnetInfo subnetInfo = null; - long lowIP = 0; - long highIP = 0; - + CidrAddress localCidrAddress; try { InetAddress localHost = InetAddress.getLocalHost(); - NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost); - subnetUtils = new SubnetUtils(localHost.getHostAddress() + "/" - + networkInterface.getInterfaceAddresses().get(0).getNetworkPrefixLength()); - subnetInfo = subnetUtils.getInfo(); - lowIP = convertIPToNumber(subnetInfo.getLowAddress()); - highIP = convertIPToNumber(subnetInfo.getHighAddress()); - } catch (IllegalArgumentException e) { - logger.warn("discoverBridge(): Illegal Argument Exception - {}", e.toString()); - return; - } catch (Exception e) { - logger.warn("discoverBridge(): Error - Unable to get Subnet Information! {}", e.toString()); + localCidrAddress = NetUtil.getAllInterfaceAddresses().stream() + .filter(f -> f.getAddress() instanceof Inet4Address && f.getAddress().equals(localHost)).findFirst() + .orElse(null); + } catch (UnknownHostException e) { + logger.warn("discoverBridge(): UnknownHostException - {}", e.toString()); return; } - logger.debug(" Local IP Address: {} - {}", subnetInfo.getAddress(), - convertIPToNumber(subnetInfo.getAddress())); - logger.debug(" Subnet: {} - {}", subnetInfo.getNetworkAddress(), - convertIPToNumber(subnetInfo.getNetworkAddress())); - logger.debug(" Network Prefix: {}", subnetInfo.getCidrSignature().split("/")[1]); - logger.debug(" Network Mask: {}", subnetInfo.getNetmask()); - logger.debug(" Low IP: {}", convertNumberToIP(lowIP)); - logger.debug(" High IP: {}", convertNumberToIP(highIP)); + List addressesToScan = NetUtil.getAddressesRangeByCidrAddress(localCidrAddress, 16); - for (long ip = lowIP; ip <= highIP; ip++) { + logger.debug("Performing discovery on {} ip addresses", addressesToScan.size()); + for (InetAddress inetAddress : addressesToScan) { try (Socket socket = new Socket()) { - ipAddress = convertNumberToIP(ip); socket.setReuseAddress(true); socket.setReceiveBufferSize(32); - socket.connect(new InetSocketAddress(ipAddress, ENVISALINK_BRIDGE_PORT), CONNECTION_TIMEOUT); + socket.connect(new InetSocketAddress(inetAddress.getHostAddress(), ENVISALINK_BRIDGE_PORT), + CONNECTION_TIMEOUT); if (socket.isConnected()) { String message = ""; socket.setSoTimeout(SO_TIMEOUT); @@ -128,55 +114,4 @@ public synchronized void discoverBridge() { } } } - - /** - * Convert an IP address to a number. - * - * @param ipAddress - * @return - */ - private long convertIPToNumber(String ipAddress) { - String[] octets = ipAddress.split("\\."); - - if (octets.length != 4) { - throw new IllegalArgumentException("Invalid IP address: " + ipAddress); - } - - long ip = 0; - - for (int i = 3; i >= 0; i--) { - long octet = Long.parseLong(octets[3 - i]); - - if (octet != (octet & 0xff)) { - throw new IllegalArgumentException("Invalid IP address: " + ipAddress); - } - - ip |= octet << (i * 8); - } - - return ip; - } - - /** - * Convert a number to an IP address. - * - * @param ip - * @return - */ - private String convertNumberToIP(long ip) { - StringBuilder ipAddress = new StringBuilder(15); - - for (int i = 0; i < 4; i++) { - - ipAddress.insert(0, Long.toString(ip & 0xff)); - - if (i < 3) { - ipAddress.insert(0, '.'); - } - - ip = ip >> 8; - } - - return ipAddress.toString(); - } } From e5bce9ecc550d4551958ab31457303987e85bc6f Mon Sep 17 00:00:00 2001 From: Leo Siepel Date: Tue, 8 Oct 2024 09:47:11 +0200 Subject: [PATCH 2/2] Fix null check Signed-off-by: Leo Siepel --- .../internal/discovery/EnvisalinkBridgeDiscovery.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/bundles/org.openhab.binding.dscalarm/src/main/java/org/openhab/binding/dscalarm/internal/discovery/EnvisalinkBridgeDiscovery.java b/bundles/org.openhab.binding.dscalarm/src/main/java/org/openhab/binding/dscalarm/internal/discovery/EnvisalinkBridgeDiscovery.java index 2170aef5aef66..343ef4278e226 100644 --- a/bundles/org.openhab.binding.dscalarm/src/main/java/org/openhab/binding/dscalarm/internal/discovery/EnvisalinkBridgeDiscovery.java +++ b/bundles/org.openhab.binding.dscalarm/src/main/java/org/openhab/binding/dscalarm/internal/discovery/EnvisalinkBridgeDiscovery.java @@ -70,7 +70,9 @@ public synchronized void discoverBridge() { return; } - List addressesToScan = NetUtil.getAddressesRangeByCidrAddress(localCidrAddress, 16); + List addressesToScan = localCidrAddress != null + ? NetUtil.getAddressesRangeByCidrAddress(localCidrAddress, 16) + : List.of(); logger.debug("Performing discovery on {} ip addresses", addressesToScan.size()); for (InetAddress inetAddress : addressesToScan) {