diff --git a/pom.xml b/pom.xml
index 23e5c63..8710515 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
com.bwssystems.HABridge
ha-bridge
- 5.3.0
+ 5.3.0a
jar
HA Bridge
@@ -111,7 +111,7 @@
org.eclipse.paho
org.eclipse.paho.client.mqttv3
- 1.2.0
+ 1.2.1
junit
@@ -196,7 +196,7 @@
maven-surefire-plugin
3.0.0-M3
- true
+ false
diff --git a/src/main/java/com/bwssystems/HABridge/hue/ColorDecode.java b/src/main/java/com/bwssystems/HABridge/hue/ColorDecode.java
index 4fee010..4cca226 100644
--- a/src/main/java/com/bwssystems/HABridge/hue/ColorDecode.java
+++ b/src/main/java/com/bwssystems/HABridge/hue/ColorDecode.java
@@ -21,6 +21,11 @@ public class ColorDecode {
private static final String COLOR_BX = "${color.bx}";
private static final String COLOR_RGBX = "${color.rgbx}";
private static final String COLOR_HSL = "${color.hsl}";
+ private static final String COLOR_H = "${color.h}";
+ private static final String COLOR_S = "${color.s}";
+ private static final String COLOR_L = "${color.l}";
+ private static final String COLOR_XY = "${color.xy}";
+ private static final String COLOR_BRI = "${colorbri}";
private static final Pattern COLOR_MILIGHT = Pattern.compile("\\$\\{color.milight\\:([01234])\\}");
public static List convertHSLtoRGB(HueSatBri hsl) {
@@ -35,46 +40,43 @@ public class ColorDecode {
double g = 0.0;
double b = 0.0;
- if(hsl.getBri() > 0)
+ if (hsl.getBri() > 0)
decimalBrightness = (float) (hsl.getBri() / 255.0);
- if(hsl.getHue() > 0) {
- h = ((float)hsl.getHue() / (float)65535.0);
- h2 = h + (float)0.5;
- if(h2 > 1.0) {
- h2 = h2 - (float)1.0;
+ if (hsl.getHue() > 0) {
+ h = ((float) hsl.getHue() / (float) 65535.0);
+ h2 = h + (float) 0.5;
+ if (h2 > 1.0) {
+ h2 = h2 - (float) 1.0;
}
}
- if(hsl.getSat() > 0) {
- s = (float)(hsl.getSat() / 254.0);
+ if (hsl.getSat() > 0) {
+ s = (float) (hsl.getSat() / 254.0);
}
- if (s == 0)
- {
- r = decimalBrightness * (float)255;
- g = decimalBrightness * (float)255;
- b = decimalBrightness * (float)255;
- }
- else
- {
- if (decimalBrightness < 0.5)
- {
- var_2 = decimalBrightness * (1 + s);
- }
- else
- {
- var_2 = (decimalBrightness + s) - (s * decimalBrightness);
- };
+ if (s == 0) {
+ r = decimalBrightness * (float) 255;
+ g = decimalBrightness * (float) 255;
+ b = decimalBrightness * (float) 255;
+ } else {
+ if (decimalBrightness < 0.5) {
+ var_2 = decimalBrightness * (1 + s);
+ } else {
+ var_2 = (decimalBrightness + s) - (s * decimalBrightness);
+ }
+ ;
- var_1 = 2 * decimalBrightness - var_2;
- float onethird = (float)0.33333;
- float h2Plus = (h2 + onethird);
- float h2Minus = (h2 - onethird);
- log.debug("calculate HSL vars - var1: " + var_1 + ", var_2: " + var_2 + ", h2: " + h2 + ", h2 + 1/3: " + h2Plus + ", h2 - 1/3: " + h2Minus);
- r = 255 * hue_2_rgb(var_1, var_2, h2Plus);
- g = 255 * hue_2_rgb(var_1, var_2, h2);
- b = 255 * hue_2_rgb(var_1, var_2, h2Minus);
- };
+ var_1 = 2 * decimalBrightness - var_2;
+ float onethird = (float) 0.33333;
+ float h2Plus = (h2 + onethird);
+ float h2Minus = (h2 - onethird);
+ log.debug("calculate HSL vars - var1: " + var_1 + ", var_2: " + var_2 + ", h2: " + h2 + ", h2 + 1/3: "
+ + h2Plus + ", h2 - 1/3: " + h2Minus);
+ r = 255 * hue_2_rgb(var_1, var_2, h2Plus);
+ g = 255 * hue_2_rgb(var_1, var_2, h2);
+ b = 255 * hue_2_rgb(var_1, var_2, h2Minus);
+ }
+ ;
rgb = new ArrayList();
rgb.add((int) Math.round(r));
@@ -88,30 +90,30 @@ public class ColorDecode {
public static float hue_2_rgb(float v1, float v2, float vh) {
log.debug("hue_2_rgb vh: " + vh);
- if (vh < 0.0)
- {
- vh = vh + (float)1;
- };
+ if (vh < 0.0) {
+ vh = vh + (float) 1;
+ }
+ ;
- if (vh > 1.0)
- {
- vh = vh - (float)1;
- };
+ if (vh > 1.0) {
+ vh = vh - (float) 1;
+ }
+ ;
- if (((float)6.0 * vh) < 1.0)
- {
- return (v1 + (v2 - v1) * (float)6.0 * vh);
- };
+ if (((float) 6.0 * vh) < 1.0) {
+ return (v1 + (v2 - v1) * (float) 6.0 * vh);
+ }
+ ;
- if (((float)2.0 * vh) < 1.0)
- {
- return (v2);
- };
+ if (((float) 2.0 * vh) < 1.0) {
+ return (v2);
+ }
+ ;
- if ((3.0 * vh) < 2.0)
- {
- return (v1 + (v2 - v1) * (((float)2.0 / (float)3.0 - vh) * (float)6.0));
- };
+ if ((3.0 * vh) < 2.0) {
+ return (v1 + (v2 - v1) * (((float) 2.0 / (float) 3.0 - vh) * (float) 6.0));
+ }
+ ;
return (v1);
}
@@ -297,13 +299,69 @@ public class ColorDecode {
notDone = true;
}
+ if (request.contains(COLOR_XY)) {
+ if (colorMode == ColorData.ColorMode.XY) {
+ List xyData = (List) colorData.getData();
+ request = request.replace(COLOR_XY, String.format("%f,%f", xyData.get(0), xyData.get(1)));
+ } else {
+ List xyData = (List) colorData.getData();
+ request = request.replace(COLOR_XY, String.format("%f,%f", xyData.get(0), xyData.get(1)));
+ }
+ notDone = true;
+ }
+
+ if (request.contains(COLOR_H)) {
+ if (colorMode == ColorData.ColorMode.HS) {
+ HueSatBri hslData = (HueSatBri) colorData.getData();
+ request = request.replace(COLOR_H, String.format("%d", hslData.getHue()));
+ } else {
+ float[] hsb = new float[3];
+ Color.RGBtoHSB(rgb.get(0), rgb.get(1), rgb.get(2), hsb);
+ float hue = hsb[0] * (float) 360.0;
+ request = request.replace(COLOR_H, String.format("%f", hue));
+ }
+ notDone = true;
+ }
+
+ if (request.contains(COLOR_S)) {
+ if (colorMode == ColorData.ColorMode.HS) {
+ HueSatBri hslData = (HueSatBri) colorData.getData();
+ request = request.replace(COLOR_S, String.format("%d", hslData.getSat()));
+ } else {
+ float[] hsb = new float[3];
+ Color.RGBtoHSB(rgb.get(0), rgb.get(1), rgb.get(2), hsb);
+ float sat = hsb[1] * (float) 100.0;
+ request = request.replace(COLOR_S, String.format("%f", sat));
+ }
+ notDone = true;
+ }
+
+ if (request.contains(COLOR_L)) {
+ if (colorMode == ColorData.ColorMode.HS) {
+ HueSatBri hslData = (HueSatBri) colorData.getData();
+ request = request.replace(COLOR_L, String.format("%d", hslData.getBri()));
+ } else {
+ float[] hsb = new float[3];
+ Color.RGBtoHSB(rgb.get(0), rgb.get(1), rgb.get(2), hsb);
+ float bright = hsb[2] * (float) 100.0;
+ request = request.replace(COLOR_L, String.format("%f", bright));
+ }
+ notDone = true;
+ }
+
if (request.contains(COLOR_HSL)) {
- float[] hsb = new float[3];
- Color.RGBtoHSB(rgb.get(0), rgb.get(1), rgb.get(2), hsb);
- float hue = hsb[0] * (float) 360.0;
- float sat = hsb[1] * (float) 100.0;
- float bright = hsb[2] * (float) 100.0;
- request = request.replace(COLOR_HSL, String.format("%f,%f,%f", hue, sat, bright));
+ if (colorMode == ColorData.ColorMode.HS) {
+ HueSatBri hslData = (HueSatBri) colorData.getData();
+ request = request.replace(COLOR_HSL,
+ String.format("%d,%d,%d", hslData.getHue(), hslData.getSat(), hslData.getBri()));
+ } else {
+ float[] hsb = new float[3];
+ Color.RGBtoHSB(rgb.get(0), rgb.get(1), rgb.get(2), hsb);
+ float hue = hsb[0] * (float) 360.0;
+ float sat = hsb[1] * (float) 100.0;
+ float bright = hsb[2] * (float) 100.0;
+ request = request.replace(COLOR_HSL, String.format("%f,%f,%f", hue, sat, bright));
+ }
notDone = true;
}
diff --git a/src/main/java/com/bwssystems/HABridge/upnp/UpnpListener.java b/src/main/java/com/bwssystems/HABridge/upnp/UpnpListener.java
index 57710b9..1fd4722 100644
--- a/src/main/java/com/bwssystems/HABridge/upnp/UpnpListener.java
+++ b/src/main/java/com/bwssystems/HABridge/upnp/UpnpListener.java
@@ -38,63 +38,33 @@ public class UpnpListener {
private String httpType;
private HuePublicConfig aHueConfig;
private Integer theUpnpSendDelay;
- private String responseTemplate1 = "HTTP/1.1 200 OK\r\n" +
- "HOST: %s:%s\r\n" +
- "CACHE-CONTROL: max-age=100\r\n" +
- "EXT:\r\n" +
- "LOCATION: %s://%s:%s/description.xml\r\n" +
- "SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/" + HueConstants.API_VERSION + "\r\n" +
- "hue-bridgeid: %s\r\n" +
- "ST: upnp:rootdevice\r\n" +
- "USN: uuid:" + HueConstants.UUID_PREFIX + "%s::upnp:rootdevice\r\n\r\n";
- private String responseTemplate2 = "HTTP/1.1 200 OK\r\n" +
- "HOST: %s:%s\r\n" +
- "CACHE-CONTROL: max-age=100\r\n" +
- "EXT:\r\n" +
- "LOCATION: %s://%s:%s/description.xml\r\n" +
- "SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/" + HueConstants.API_VERSION + "\r\n" +
- "hue-bridgeid: %s\r\n" +
- "ST: uuid:" + HueConstants.UUID_PREFIX + "%s\r\n" +
- "USN: uuid:" + HueConstants.UUID_PREFIX + "%s\r\n\r\n";
- private String responseTemplate3 = "HTTP/1.1 200 OK\r\n" +
- "HOST: %s:%s\r\n" +
- "CACHE-CONTROL: max-age=100\r\n" +
- "EXT:\r\n" +
- "LOCATION: %s://%s:%s/description.xml\r\n" +
- "SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/" + HueConstants.API_VERSION + "\r\n" +
- "hue-bridgeid: %s\r\n" +
- "ST: urn:schemas-upnp-org:device:basic:1\r\n" +
- "USN: uuid:" + HueConstants.UUID_PREFIX + "%s\r\n\r\n";
+ private String responseTemplate1 = "HTTP/1.1 200 OK\r\n" + "HOST: %s:%s\r\n" + "CACHE-CONTROL: max-age=100\r\n"
+ + "EXT:\r\n" + "LOCATION: %s://%s:%s/description.xml\r\n" + "SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/"
+ + HueConstants.API_VERSION + "\r\n" + "hue-bridgeid: %s\r\n" + "ST: upnp:rootdevice\r\n" + "USN: uuid:"
+ + HueConstants.UUID_PREFIX + "%s::upnp:rootdevice\r\n\r\n";
+ private String responseTemplate2 = "HTTP/1.1 200 OK\r\n" + "HOST: %s:%s\r\n" + "CACHE-CONTROL: max-age=100\r\n"
+ + "EXT:\r\n" + "LOCATION: %s://%s:%s/description.xml\r\n" + "SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/"
+ + HueConstants.API_VERSION + "\r\n" + "hue-bridgeid: %s\r\n" + "ST: uuid:" + HueConstants.UUID_PREFIX
+ + "%s\r\n" + "USN: uuid:" + HueConstants.UUID_PREFIX + "%s\r\n\r\n";
+ private String responseTemplate3 = "HTTP/1.1 200 OK\r\n" + "HOST: %s:%s\r\n" + "CACHE-CONTROL: max-age=100\r\n"
+ + "EXT:\r\n" + "LOCATION: %s://%s:%s/description.xml\r\n" + "SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/"
+ + HueConstants.API_VERSION + "\r\n" + "hue-bridgeid: %s\r\n" + "ST: urn:schemas-upnp-org:device:basic:1\r\n"
+ + "USN: uuid:" + HueConstants.UUID_PREFIX + "%s\r\n\r\n";
- private String notifyTemplate1 = "NOTIFY * HTTP/1.1\r\n" +
- "HOST: %s:%s\r\n" +
- "CACHE-CONTROL: max-age=100\r\n" +
- "LOCATION: %s://%s:%s/description.xml\r\n" +
- "SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/" + HueConstants.API_VERSION + "\r\n" +
- "NTS: ssdp:alive\r\n" +
- "hue-bridgeid: %s\r\n" +
- "NT: uuid:" + HueConstants.UUID_PREFIX + "%s\r\n" +
- "USN: uuid:" + HueConstants.UUID_PREFIX + "%s\r\n\r\n";
+ private String notifyTemplate1 = "NOTIFY * HTTP/1.1\r\n" + "HOST: %s:%s\r\n" + "CACHE-CONTROL: max-age=100\r\n"
+ + "LOCATION: %s://%s:%s/description.xml\r\n" + "SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/"
+ + HueConstants.API_VERSION + "\r\n" + "NTS: ssdp:alive\r\n" + "hue-bridgeid: %s\r\n" + "NT: uuid:"
+ + HueConstants.UUID_PREFIX + "%s\r\n" + "USN: uuid:" + HueConstants.UUID_PREFIX + "%s\r\n\r\n";
- private String notifyTemplate2 = "NOTIFY * HTTP/1.1\r\n" +
- "HOST: %s:%s\r\n" +
- "CACHE-CONTROL: max-age=100\r\n" +
- "LOCATION: %s://%s:%s/description.xml\r\n" +
- "SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/" + HueConstants.API_VERSION + "\r\n" +
- "NTS: ssdp:alive\r\n" +
- "hue-bridgeid: %s\r\n" +
- "NT: upnp:rootdevice\r\n" +
- "USN: uuid:" + HueConstants.UUID_PREFIX + "%s::upnp:rootdevice\r\n\r\n";
+ private String notifyTemplate2 = "NOTIFY * HTTP/1.1\r\n" + "HOST: %s:%s\r\n" + "CACHE-CONTROL: max-age=100\r\n"
+ + "LOCATION: %s://%s:%s/description.xml\r\n" + "SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/"
+ + HueConstants.API_VERSION + "\r\n" + "NTS: ssdp:alive\r\n" + "hue-bridgeid: %s\r\n"
+ + "NT: upnp:rootdevice\r\n" + "USN: uuid:" + HueConstants.UUID_PREFIX + "%s::upnp:rootdevice\r\n\r\n";
- private String notifyTemplate3 = "NOTIFY * HTTP/1.1\r\n" +
- "HOST: %s:%s\r\n" +
- "CACHE-CONTROL: max-age=100\r\n" +
- "LOCATION: %s://%s:%s/description.xml\r\n" +
- "SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/" + HueConstants.API_VERSION + "\r\n" +
- "NTS: ssdp:alive\r\n" +
- "hue-bridgeid: %s\r\n" +
- "NT: urn:schemas-upnp-org:device:basic:1\r\n" +
- "USN: uuid:" + HueConstants.UUID_PREFIX + "%s\r\n\r\n";
+ private String notifyTemplate3 = "NOTIFY * HTTP/1.1\r\n" + "HOST: %s:%s\r\n" + "CACHE-CONTROL: max-age=100\r\n"
+ + "LOCATION: %s://%s:%s/description.xml\r\n" + "SERVER: Linux/3.14.0 UPnP/1.0 IpBridge/"
+ + HueConstants.API_VERSION + "\r\n" + "NTS: ssdp:alive\r\n" + "hue-bridgeid: %s\r\n"
+ + "NT: urn:schemas-upnp-org:device:basic:1\r\n" + "USN: uuid:" + HueConstants.UUID_PREFIX + "%s\r\n\r\n";
public UpnpListener(BridgeSettings theSettings, BridgeControlDescriptor theControl,
UDPDatagramSender aUdpDatagramSender) throws IOException {
@@ -113,7 +83,7 @@ public class UpnpListener {
theSettings.getBridgeSettingsDescriptor().getHubmac());
bridgeId = aHueConfig.getBridgeid();
bridgeSNUUID = aHueConfig.getSNUUIDFromMac();
- if(theSettings.getBridgeSecurity().isUseHttps()) {
+ if (theSettings.getBridgeSecurity().isUseHttps()) {
httpType = "https";
} else {
httpType = "http";
@@ -204,7 +174,8 @@ public class UpnpListener {
final HashMap values = new HashMap();
values.put("modelid", HueConstants.MODEL_ID);
values.put("bridgeid", bridgeId);
- ServiceInfo serviceInfo = ServiceInfo.create("_hue._tcp.local.", "Philips Hue - " + bridgeId.substring(bridgeId.length() - 6), httpServerPort, 0, 0, values);
+ ServiceInfo serviceInfo = ServiceInfo.create("_hue._tcp.local.",
+ "Philips Hue - " + bridgeId.substring(bridgeId.length() - 6), httpServerPort, 0, 0, values);
jmdns.registerService(serviceInfo);
} catch (IOException e) {
@@ -225,8 +196,8 @@ public class UpnpListener {
} catch (SocketException e1) {
log.warn("Could not sent soTimeout on multi-cast socket");
}
-// Instant current, previous;
-// previous = Instant.now();
+ // Instant current, previous;
+ // previous = Instant.now();
while (loopControl) { // trigger shutdown here
byte[] buf = new byte[1024];
DatagramPacket packet = new DatagramPacket(buf, buf.length);
@@ -235,26 +206,23 @@ public class UpnpListener {
if (isSSDPDiscovery(packet)) {
try {
sendUpnpResponse(packet);
- } catch (IOException e) {
+ } catch (Exception e) {
log.warn("UpnpListener encountered an error sending upnp response packet. IP: "
+ packet.getAddress().getHostAddress() + " with message: " + e.getMessage());
log.debug("UpnpListener send upnp exception: ", e);
}
}
-/*
- current = Instant.now();
- if (ChronoUnit.MILLIS.between(previous, current) > Configuration.UPNP_NOTIFY_TIMEOUT) {
- try {
- sendUpnpNotify(socketAddress.getAddress());
- } catch (IOException e) {
- log.warn("UpnpListener encountered an error sending upnp notify packets. IP: "
- + packet.getAddress().getHostAddress() + " with message: " + e.getMessage());
- log.debug("UpnpListener send upnp notify exception: ", e);
- }
- previous = Instant.now();
-
- }
-*/
+ /*
+ * current = Instant.now(); if (ChronoUnit.MILLIS.between(previous, current) >
+ * Configuration.UPNP_NOTIFY_TIMEOUT) { try {
+ * sendUpnpNotify(socketAddress.getAddress()); } catch (IOException e) { log.
+ * warn("UpnpListener encountered an error sending upnp notify packets. IP: " +
+ * packet.getAddress().getHostAddress() + " with message: " + e.getMessage());
+ * log.debug("UpnpListener send upnp notify exception: ", e); } previous =
+ * Instant.now();
+ *
+ * }
+ */
} catch (SocketTimeoutException e) {
try {
sendUpnpNotify(socketAddress.getAddress());
@@ -277,7 +245,7 @@ public class UpnpListener {
}
}
upnpMulticastSocket.close();
- if(jmdns != null) {
+ if (jmdns != null) {
// Unregister all services
jmdns.unregisterAllServices();
}
@@ -300,9 +268,8 @@ public class UpnpListener {
String packetString = new String(packet.getData(), 0, packet.getLength());
if (packetString != null && packetString.startsWith("M-SEARCH * HTTP/1.1")
&& packetString.contains("\"ssdp:discover\"")) {
- if ((packetString.contains("ST: urn:schemas-upnp-org:device:basic:1") ||
- packetString.contains("ST: upnp:rootdevice") ||
- packetString.contains("ST: ssdp:all"))) {
+ if ((packetString.contains("ST: urn:schemas-upnp-org:device:basic:1")
+ || packetString.contains("ST: upnp:rootdevice") || packetString.contains("ST: ssdp:all"))) {
if (traceupnp) {
log.info("Traceupnp: SSDP M-SEARCH packet from " + packet.getAddress().getHostAddress() + ":"
+ packet.getPort());
@@ -328,16 +295,16 @@ public class UpnpListener {
}
protected void sendUpnpResponse(DatagramPacket aPacket) throws IOException {
- SocketAddress requesterAddress = aPacket.getSocketAddress();
+ // SocketAddress requesterAddress = aPacket.getSocketAddress();
InetAddress requester = aPacket.getAddress();
int sourcePort = aPacket.getPort();
String discoveryResponse = null;
String httpLocationAddress = null;
- if(useUpnpIface) {
+ if (useUpnpIface) {
httpLocationAddress = upnpConfigIP;
} else {
// refactored suggestion by https://github.com/pvint
- httpLocationAddress = AddressUtil.getOutboundAddress(requesterAddress).getHostAddress();
+ httpLocationAddress = AddressUtil.getOutboundAddress(requester.getHostAddress(), sourcePort).getHostAddress();
}
try {
@@ -346,51 +313,53 @@ public class UpnpListener {
// noop
}
- discoveryResponse = String.format(responseTemplate1, Configuration.UPNP_MULTICAST_ADDRESS,
- Configuration.UPNP_DISCOVERY_PORT, httpType, httpLocationAddress, httpServerPort, bridgeId, bridgeSNUUID);
- if (traceupnp) {
- log.info("Traceupnp: send upnp discovery template 1 with response address: " + httpLocationAddress + ":"
- + httpServerPort + " to address: " + requester + ":" + sourcePort);
- }
- log.debug("sendUpnpResponse to address: " + requester + ":" + sourcePort
- + " with discovery responseTemplate1 is <<<" + discoveryResponse + ">>>");
- sendUDPResponse(discoveryResponse.getBytes(), requester, sourcePort);
+ discoveryResponse = String.format(responseTemplate1, Configuration.UPNP_MULTICAST_ADDRESS,
+ Configuration.UPNP_DISCOVERY_PORT, httpType, httpLocationAddress, httpServerPort, bridgeId,
+ bridgeSNUUID);
+ if (traceupnp) {
+ log.info("Traceupnp: send upnp discovery template 1 with response address: " + httpLocationAddress + ":"
+ + httpServerPort + " to address: " + requester.getHostAddress() + ":" + sourcePort);
+ }
+ log.debug("sendUpnpResponse to address: " + requester.getHostAddress() + ":" + sourcePort
+ + " with discovery responseTemplate1 is <<<" + discoveryResponse + ">>>");
+ sendUDPResponse(discoveryResponse.getBytes(), requester, sourcePort);
- try {
- Thread.sleep(theUpnpSendDelay);
- } catch (InterruptedException e) {
- // noop
- }
- discoveryResponse = String.format(responseTemplate2, Configuration.UPNP_MULTICAST_ADDRESS,
- Configuration.UPNP_DISCOVERY_PORT, httpType, httpLocationAddress, httpServerPort, bridgeId, bridgeSNUUID,
- bridgeSNUUID);
- if (traceupnp) {
- log.info("Traceupnp: send upnp discovery template 2 with response address: " + httpLocationAddress + ":"
- + httpServerPort + " to address: " + requester + ":" + sourcePort);
- }
- log.debug("sendUpnpResponse to address: " + requester + ":" + sourcePort
- + " discovery responseTemplate2 is <<<" + discoveryResponse + ">>>");
- sendUDPResponse(discoveryResponse.getBytes(), requester, sourcePort);
+ try {
+ Thread.sleep(theUpnpSendDelay);
+ } catch (InterruptedException e) {
+ // noop
+ }
+ discoveryResponse = String.format(responseTemplate2, Configuration.UPNP_MULTICAST_ADDRESS,
+ Configuration.UPNP_DISCOVERY_PORT, httpType, httpLocationAddress, httpServerPort, bridgeId,
+ bridgeSNUUID, bridgeSNUUID);
+ if (traceupnp) {
+ log.info("Traceupnp: send upnp discovery template 2 with response address: " + httpLocationAddress + ":"
+ + httpServerPort + " to address: " + requester.getHostAddress() + ":" + sourcePort);
+ }
+ log.debug("sendUpnpResponse to address: " + requester.getHostAddress() + ":" + sourcePort
+ + " discovery responseTemplate2 is <<<" + discoveryResponse + ">>>");
+ sendUDPResponse(discoveryResponse.getBytes(), requester, sourcePort);
- try {
- Thread.sleep(theUpnpSendDelay);
- } catch (InterruptedException e) {
- // noop
- }
- discoveryResponse = String.format(responseTemplate3,Configuration.UPNP_MULTICAST_ADDRESS,
- Configuration.UPNP_DISCOVERY_PORT, httpType, httpLocationAddress, httpServerPort, bridgeId, bridgeSNUUID);
- if (traceupnp) {
- log.info("Traceupnp: send upnp discovery template 3 with response address: " + httpLocationAddress + ":"
- + httpServerPort + " to address: " + requester + ":" + sourcePort);
- }
- log.debug("sendUpnpResponse to address: " + requester + ":" + sourcePort
- + " discovery responseTemplate3 is <<<" + discoveryResponse + ">>>");
- sendUDPResponse(discoveryResponse.getBytes(), requester, sourcePort);
+ try {
+ Thread.sleep(theUpnpSendDelay);
+ } catch (InterruptedException e) {
+ // noop
+ }
+ discoveryResponse = String.format(responseTemplate3, Configuration.UPNP_MULTICAST_ADDRESS,
+ Configuration.UPNP_DISCOVERY_PORT, httpType, httpLocationAddress, httpServerPort, bridgeId,
+ bridgeSNUUID);
+ if (traceupnp) {
+ log.info("Traceupnp: send upnp discovery template 3 with response address: " + httpLocationAddress + ":"
+ + httpServerPort + " to address: " + requester.getHostAddress() + ":" + sourcePort);
+ }
+ log.debug("sendUpnpResponse to address: " + requester.getHostAddress() + ":" + sourcePort
+ + " discovery responseTemplate3 is <<<" + discoveryResponse + ">>>");
+ sendUDPResponse(discoveryResponse.getBytes(), requester, sourcePort);
}
private void sendUDPResponse(byte[] udpMessage, InetAddress requester, int sourcePort) throws IOException {
log.debug("Sending response string: <<<" + new String(udpMessage) + ">>>");
- if(upnpOriginal) {
+ if (upnpOriginal) {
theUDPDatagramSender.sendUDPResponse(udpMessage, requester, sourcePort);
} else {
if (upnpMulticastSocket == null)
@@ -409,7 +378,8 @@ public class UpnpListener {
}
notifyData = String.format(notifyTemplate1, Configuration.UPNP_MULTICAST_ADDRESS,
- Configuration.UPNP_DISCOVERY_PORT, httpType, upnpConfigIP, httpServerPort, bridgeId, bridgeSNUUID, bridgeSNUUID);
+ Configuration.UPNP_DISCOVERY_PORT, httpType, upnpConfigIP, httpServerPort, bridgeId, bridgeSNUUID,
+ bridgeSNUUID);
if (traceupnp) {
log.info("Traceupnp: sendUpnpNotify notifyTemplate1");
}
@@ -429,7 +399,7 @@ public class UpnpListener {
}
log.debug("sendUpnpNotify notifyTemplate2 is <<<{}>>>", notifyData);
sendUDPResponse(notifyData.getBytes(), aSocketAddress, Configuration.UPNP_DISCOVERY_PORT);
-
+
try {
Thread.sleep(theUpnpSendDelay);
} catch (InterruptedException e) {
diff --git a/src/main/java/com/bwssystems/HABridge/upnp/UpnpSettingsResource.java b/src/main/java/com/bwssystems/HABridge/upnp/UpnpSettingsResource.java
index 33d7534..30a1fa8 100644
--- a/src/main/java/com/bwssystems/HABridge/upnp/UpnpSettingsResource.java
+++ b/src/main/java/com/bwssystems/HABridge/upnp/UpnpSettingsResource.java
@@ -8,14 +8,9 @@ import com.bwssystems.HABridge.BridgeSettingsDescriptor;
import com.bwssystems.HABridge.api.hue.HueConstants;
import com.bwssystems.HABridge.api.hue.HuePublicConfig;
import com.bwssystems.HABridge.util.AddressUtil;
-import com.bwssystems.HABridge.util.ParseRoute;
import static spark.Spark.get;
-import java.net.DatagramSocket;
-import java.net.InetAddress;
-import java.net.InetSocketAddress;
-
/**
*
*/
diff --git a/src/main/java/com/bwssystems/HABridge/util/AddressUtil.java b/src/main/java/com/bwssystems/HABridge/util/AddressUtil.java
index 6eb4aa2..77dd960 100644
--- a/src/main/java/com/bwssystems/HABridge/util/AddressUtil.java
+++ b/src/main/java/com/bwssystems/HABridge/util/AddressUtil.java
@@ -16,24 +16,20 @@ public class AddressUtil {
public static InetAddress getOutboundAddress(String remoteAddress, int remotePort) {
InetAddress localAddress = null;
try {
- DatagramSocket sock = new DatagramSocket();
- // connect is needed to bind the socket and retrieve the local address
- // later (it would return 0.0.0.0 otherwise)
- sock.connect(new InetSocketAddress(remoteAddress, remotePort));
- localAddress = sock.getLocalAddress();
- sock.disconnect();
- sock.close();
- sock = null;
+ getOutboundAddress(new InetSocketAddress(remoteAddress, remotePort));
} catch (Exception e) {
ParseRoute theRoute = ParseRoute.getInstance();
try {
localAddress = InetAddress.getByName(theRoute.getLocalIPAddress());
+ log.warn("Error <" + e.getMessage() + "> on determining interface to reply for <" + remoteAddress
+ + ">. Using default route IP Address of " + localAddress.getHostAddress());
} catch (Exception e1) {
+ log.error("Cannot find address for parsed local ip address: " + e.getMessage());
}
- log.warn("Error <" + e.getMessage() + "> on determining interface to reply for <" + remoteAddress
- + ">. Using default route IP Address of " + localAddress.getHostAddress());
}
- log.debug("getOutbountAddress returning IP Address of " + localAddress.getHostAddress());
+
+ if(localAddress != null)
+ log.debug("getOutbountAddress returning IP Address of " + localAddress.getHostAddress());
return localAddress;
}