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; }