Skip to content

Commit

Permalink
[wemo] Optimize port detection (openhab#12651)
Browse files Browse the repository at this point in the history
Signed-off-by: Jacob Laursen <jacob-github@vindvejr.dk>
  • Loading branch information
jlaur authored and andan67 committed Nov 5, 2022
1 parent 05ca999 commit 64eca30
Showing 1 changed file with 28 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,16 @@

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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -76,9 +83,9 @@ public void initialize() {

@Override
public void dispose() {
cancelSubscriptionRenewalJob();
removeSubscriptions();
logger.debug("Unregistering UPnP participant for {}", getThing().getUID());
cancelSubscriptionRenewalJob();
service.unregisterParticipant(this);
}

Expand Down Expand Up @@ -223,10 +230,16 @@ private void initializeHost() {
}

private int scanForPort(String host) {
int portCheckStart = 49151;
int portCheckStop = 49157;
Integer portFromService = getPortFromService();
List<Integer> portsToCheck = new ArrayList<Integer>(PORT_RANGE_END - PORT_RANGE_START + 1);
Stream<Integer> 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)) {
Expand All @@ -246,4 +259,15 @@ private int scanForPort(String host) {
}
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;
}
}

0 comments on commit 64eca30

Please sign in to comment.