From e659ceeadef9d3e2ee78c71ac145532d2fc88ea9 Mon Sep 17 00:00:00 2001 From: Jacob Laursen Date: Mon, 25 Apr 2022 17:47:23 +0200 Subject: [PATCH] [wemo] Optimize port detection (#12651) Signed-off-by: Jacob Laursen --- .../handler/WemoBaseThingHandler.java | 32 ++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/bundles/org.openhab.binding.wemo/src/main/java/org/openhab/binding/wemo/internal/handler/WemoBaseThingHandler.java b/bundles/org.openhab.binding.wemo/src/main/java/org/openhab/binding/wemo/internal/handler/WemoBaseThingHandler.java index 1ce737d04..d1a45e762 100644 --- a/bundles/org.openhab.binding.wemo/src/main/java/org/openhab/binding/wemo/internal/handler/WemoBaseThingHandler.java +++ b/bundles/org.openhab.binding.wemo/src/main/java/org/openhab/binding/wemo/internal/handler/WemoBaseThingHandler.java @@ -14,11 +14,16 @@ package org.openhab.binding.wemo.internal.handler; import java.net.URL; import java.time.Instant; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.IntStream; +import java.util.stream.Stream; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -48,6 +53,8 @@ public abstract class WemoBaseThingHandler extends BaseThingHandler implements U private static final int SUBSCRIPTION_RENEWAL_INITIAL_DELAY_SECONDS = 15; private static final int SUBSCRIPTION_RENEWAL_INTERVAL_SECONDS = 60; + private static final int PORT_RANGE_START = 49151; + private static final int PORT_RANGE_END = 49157; private final Logger logger = LoggerFactory.getLogger(WemoBaseThingHandler.class); private final UpnpIOService service; @@ -76,9 +83,9 @@ public abstract class WemoBaseThingHandler extends BaseThingHandler implements U @Override public void dispose() { + cancelSubscriptionRenewalJob(); removeSubscriptions(); logger.debug("Unregistering UPnP participant for {}", getThing().getUID()); - cancelSubscriptionRenewalJob(); service.unregisterParticipant(this); } @@ -223,10 +230,16 @@ public abstract class WemoBaseThingHandler extends BaseThingHandler implements U } private int scanForPort(String host) { - int portCheckStart = 49151; - int portCheckStop = 49157; + Integer portFromService = getPortFromService(); + List portsToCheck = new ArrayList(PORT_RANGE_END - PORT_RANGE_START + 1); + Stream portRange = IntStream.rangeClosed(PORT_RANGE_START, PORT_RANGE_END).boxed(); + if (portFromService != null) { + portsToCheck.add(portFromService); + portRange = portRange.filter(p -> p.intValue() != portFromService); + } + portsToCheck.addAll(portRange.collect(Collectors.toList())); int port = 0; - for (int portCheck = portCheckStart; portCheck < portCheckStop; portCheck++) { + for (Integer portCheck : portsToCheck) { String urlProbe = "http://" + host + ":" + portCheck; logger.trace("Probing {} to find port", urlProbe); if (!wemoHttpCaller.probeURL(urlProbe)) { @@ -246,4 +259,15 @@ public abstract class WemoBaseThingHandler extends BaseThingHandler implements U } return null; } + + private @Nullable Integer getPortFromService() { + URL descriptorURL = service.getDescriptorURL(this); + if (descriptorURL != null) { + int port = descriptorURL.getPort(); + if (port != -1) { + return port; + } + } + return null; + } }